2015-07-10 1 views
1

В Ьге блоке моего кода либо из SetText() или setLocation() работает хорошо отдельно, как описано ниже:Как иметь одновременное setLocation и setText в JLabel?

После кода переместите метку в правильном направлении (каждый раз 50 Pxl) в соответствии с данным сном:

   ......... 
       label.setLocation((label.getLocationOnScreen().x+50),0); 
       Thread.sleep(time[i]); 
       ............... 

После кода установите текст правильно ("Name 1", "Имя 2" и т.д.) в соответствии с данным сна:

   ...................          
       label.setText(name[i]); 
       Thread.sleep(time[i]); 
       .................... 

После кода установите текст правильно ("Name 1", «Имя 2» и т. Д.) В соответствии с данным сном, но не перемещает JLabel:

   .................... 
       label.setText(name[i]); 
       label.setLocation((label.getLocationOnScreen().x+50),0); 
       Thread.sleep(time[i]); 
       .................... 

Мне нужно обоим. Другими словами, в первом движении он должен показывать «Имя 1», во 2-ом движении «Имя 2» и так далее.

Я новичок в java и программировании. Поэтому любезно помогите мне получить требуемый результат. Спасибо в ожидании.

Мой полный код, как показано ниже:

import java.awt.GridLayout; 
import javax.swing.JFrame; 
import javax.swing.JLabel; 

class Move { 
    JFrame frame = new JFrame(); 
    JLabel label = new JLabel("Journey"); 
    static int x=0; 


public Move() { 
     frame.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE); 
     frame.setSize(800,600); 
     frame.setLayout(new GridLayout()); 
     frame.add(label); 
     label.setLocation(0, 0); 
     frame.setVisible(true); 

    doAll(); 
} 

    void doAll(){ 
    Thread t = new Thread(new Runnable() { 
    @Override 
    public void run() { 
      try{ 
       String[] name={"Name 1","Name 2","Name 3","Name 4","Name 5","Name 6","Name 7","Name 8","Name 9","Name 10"}; 
       int time []={2000,1000,2000,1000,2000,1000,2000,1000,2000,1000}; 

       for (int i=0; i<10; i++){ 
       label.setText(name[i]); 
       label.setLocation((label.getLocationOnScreen().x+50),0); 
       Thread.sleep(time[i]); 

       } 
      }catch(Exception ae){ 

     } 
    } 
}); 

t.start(); 
} 

public static void main(String[]args){ 
    new Move(); 
    } 
} 

ответ

2

Вместо того, чтобы пытаться переместить компонент Swing, вы можете нарисовать изображение на JPanel и переместить изображение.

Вот GUI, который я создал.

Image Move GUI

  1. Вы должны начать приложение Swing, с помощью вызова метода SwingUtilities invokeLater. Этот метод ставит создание и использование всех компонентов Swing на Event Dispatch thread (EDT).

  2. Всякий раз, когда вы пытаетесь скоординировать 2 или более массивов, вам следует подумать о создании класса модели. Я создал класс Leg для хранения имени и задержки. Таким образом, мне нужно было создать только один Список в классе Journey.

  3. Я создал DrawingPanel из JPanel. Всегда создавайте свой графический интерфейс на JPanel. Никогда не создавайте свой графический интерфейс непосредственно на JFrame.

  4. Запустите анимацию в отдельном Runnable, Thread или Swing Timer. Графический интерфейс запускается в собственном потоке, и ваш код анимации должен работать в другом потоке или блокировать графический интерфейс пользователя от обновления.

  5. Поскольку анимация работает в отдельном потоке, настройка ножки на панели чертежа заключена в методе SwokeUtilities invokeLater. Это гарантирует, что рисунок происходит в потоке Dispatch Event (EDT).

  6. Когда я создал JFrame, я добавил WindowListener в JFrame. Вот так я смог обнаружить закрытие окна и остановить анимацию, прежде чем я выйду из программы.

Вот код.

package com.ggl.testing; 

import java.awt.Color; 
import java.awt.Dimension; 
import java.awt.Font; 
import java.awt.Graphics; 
import java.awt.Rectangle; 
import java.awt.event.WindowAdapter; 
import java.awt.event.WindowEvent; 
import java.awt.font.FontRenderContext; 
import java.awt.geom.Rectangle2D; 
import java.util.ArrayList; 
import java.util.List; 

import javax.swing.JFrame; 
import javax.swing.JPanel; 
import javax.swing.SwingUtilities; 

public class ImageMove implements Runnable { 

    private JFrame frame; 

    private JourneyRunnable journeyRunnable; 

    public static void main(String[] args) { 
     SwingUtilities.invokeLater(new ImageMove()); 
    } 

    @Override 
    public void run() { 
     frame = new JFrame("Image Move"); 
     frame.setDefaultCloseOperation(JFrame.DO_NOTHING_ON_CLOSE); 
     frame.addWindowListener(new WindowAdapter() { 
      @Override 
      public void windowClosing(WindowEvent event) { 
       exitProcedure(); 
      } 
     }); 

     DrawingPanel drawingPanel = new DrawingPanel(); 
     frame.add(drawingPanel); 

     frame.pack(); 
     frame.setLocationByPlatform(true); 
     frame.setVisible(true); 

     journeyRunnable = new JourneyRunnable(drawingPanel, new Journey()); 
     new Thread(journeyRunnable).start(); 
    } 

    public void exitProcedure() { 
     journeyRunnable.setRunning(false); 
     frame.dispose(); 
     System.exit(0); 
    } 

    public class DrawingPanel extends JPanel { 

     private static final long serialVersionUID = -8498462824787395933L; 

     private int xPos, yPos, width, height; 

     private Leg leg; 

     public DrawingPanel() { 
      this.width = 100; 
      this.height = 50; 
      this.xPos = 0; 
      this.yPos = (200 - height)/2; 
      this.setPreferredSize(new Dimension(800, 200)); 
     } 

     public void setLeg(Leg leg) { 
      this.leg = leg; 
      this.xPos += 10; 
      repaint(); 
     } 

     @Override 
     protected void paintComponent(Graphics g) { 
      super.paintComponent(g); 

      g.setColor(Color.WHITE); 
      g.fillRect(0, 0, getWidth(), getHeight()); 

      g.setColor(Color.ORANGE); 
      g.fillRect(xPos, yPos, width, height); 

      if (leg != null) { 
       g.setColor(Color.BLACK); 
       centerString(g, new Rectangle(xPos, yPos, width, height), 
         leg.getName(), g.getFont()); 
      } 
     } 

     /** 
     * This method centers a <code>String</code> in a bounding 
     * <code>Rectangle</code>. 
     * 
     * @param g 
     *   - The <code>Graphics</code> instance. 
     * @param r 
     *   - The bounding <code>Rectangle</code>. 
     * @param s 
     *   - The <code>String</code> to center in the bounding 
     *   rectangle. 
     * @param font 
     *   - The display font of the <code>String</code> 
     * 
     * @see java.awt.Graphics 
     * @see java.awt.Rectangle 
     * @see java.lang.String 
     */ 
     public void centerString(Graphics g, Rectangle r, String s, Font font) { 
      FontRenderContext frc = new FontRenderContext(null, true, true); 

      Rectangle2D r2D = font.getStringBounds(s, frc); 
      int rWidth = (int) Math.round(r2D.getWidth()); 
      int rHeight = (int) Math.round(r2D.getHeight()); 
      int rX = (int) Math.round(r2D.getX()); 
      int rY = (int) Math.round(r2D.getY()); 

      int a = (r.width/2) - (rWidth/2) - rX; 
      int b = (r.height/2) - (rHeight/2) - rY; 

      g.setFont(font); 
      g.drawString(s, r.x + a, r.y + b); 
     } 
    } 

    public class JourneyRunnable implements Runnable { 

     private boolean running; 

     private DrawingPanel drawingPanel; 

     private Journey journey; 

     public JourneyRunnable(DrawingPanel drawingPanel, Journey journey) { 
      this.drawingPanel = drawingPanel; 
      this.journey = journey; 
      this.running = true; 
     } 

     @Override 
     public void run() { 
      while (running) { 
       Leg leg = journey.getLeg(); 
       setLeg(leg); 
       sleep(leg); 
      } 
     } 

     public void setLeg(final Leg leg) { 
      SwingUtilities.invokeLater(new Runnable() { 
       @Override 
       public void run() { 
        drawingPanel.setLeg(leg); 
       } 
      }); 
     } 

     private void sleep(Leg leg) { 
      try { 
       Thread.sleep(leg.getDelay()); 
      } catch (InterruptedException e) { 

      } 
     } 

     public void setRunning(boolean running) { 
      this.running = running; 
     } 

    } 

    public class Journey { 

     private int index; 
     private List<Leg> legs; 

     public Journey() { 
      this.legs = new ArrayList<>(); 

      this.legs.add(new Leg("Name 1", 2000L)); 
      this.legs.add(new Leg("Name 2", 1000L)); 
      this.legs.add(new Leg("Name 3", 2000L)); 
      this.legs.add(new Leg("Name 4", 1000L)); 
      this.legs.add(new Leg("Name 5", 2000L)); 
      this.legs.add(new Leg("Name 6", 1000L)); 
      this.legs.add(new Leg("Name 7", 2000L)); 
      this.legs.add(new Leg("Name 8", 1000L)); 
      this.legs.add(new Leg("Name 9", 2000L)); 
      this.legs.add(new Leg("Name 10", 1000L)); 

      this.index = 0; 
     } 

     public Leg getLeg() { 
      Leg leg = legs.get(index); 
      index = ++index % legs.size(); 
      return leg; 
     } 
    } 

    public class Leg { 
     private final String name; 
     private final long delay; 

     public Leg(String name, long delay) { 
      this.name = name; 
      this.delay = delay; 
     } 

     public String getName() { 
      return name; 
     } 

     public long getDelay() { 
      return delay; 
     } 

    } 

} 
+0

Ваш ответ сработал хорошо, и он также густо воспитателен. – Jit

0

Проблема выглядит LayoutManager кадра устанавливает местоположение метки для вас.

Что вам нужно сделать, это установить раскладку на нуль:

frame.setLayout(null); 

Это сделает это так, кадр не пытается макет компонентов сам по себе.

, то вы можете сделать

label.setLocation((label.getLocationOnScreen().x+50),0); 

Однако, не имея макет не является идеальным, но GridLayout не очень велика для того, что вы хотите, либо.

Причина: GridLayout всегда будет сортировать компоненты в порядке, вы пишете «container.add(component)» заявления. Вы не можете поместить компонент в определенное место, кроме как вставлять фиктивные компоненты для всех мест раньше.

Возможно, вы захотите попробовать GridBagLayout .. В GridBagLayout все, что вам нужно сделать для ключевого события, - это обновление местоположения вашей динамической панели, и оно должно отображаться на верхней части фиксированной панели в этом месте.