如何在JLabel中同时使用setLocation和setText?

时间:2015-07-10 14:00:30

标签: java jlabel sleep settext

在我的代码的try块中,setText()或setLocation()中的任何一个都可以单独运行,如下所述:

以下代码根据给定的睡眠以正确的方式移动标签(每次50 pxl):

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

以下代码根据给定的睡眠正确设置文本(“名称1”,“名称2”等):

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

以下代码根据给定的睡眠正确设置文本(“名称1”,“名称2”等),但不移动JLabel:

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

我需要他们两个。换句话说,在第一个动作中,它应该在第二个动作“名称2”中显示“名称1”,依此类推。

我是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 个答案:

答案 0 :(得分:2)

您可以在JPanel上绘制图像并移动图像,而不是尝试移动Swing组件。

这是我创建的GUI。

Image Move GUI

  1. 您必须通过调用SwingUtilities invokeLater方法启动Swing应用程序。此方法将所有Swing组件的创建和使用放在Event Dispatch thread (EDT)

  2. 每当您尝试协调2个或更多数组时,都应考虑创建模型类。我创建了Leg类来保存名称和延迟。这样,我只需要在Journey类中创建一个List。

  3. 我从JPanel创建了一个DrawingPanel。始终在JPanel上创建GUI。切勿直接在JFrame上创建GUI。

  4. 在单独的Runnable,Thread或Swing Timer中运行动画。 GUI在自己的线程上运行,动画代码必须在不同的线程中运行,或阻止GUI更新。

  5. 由于动画在单独的线程中运行,因此绘图面板中Leg的设置将包含在SwingUtilities invokeLater方法中。这可确保绘图发生在Event Dispatch线程(EDT)上。

  6. 当我创建JFrame时,我向JFrame添加了一个WindowListener。这样我就能检测到窗口关闭,并在退出程序之前停止动画。

  7. 这是代码。

      a: 010101
      b: 001100
    a^b: 011001
    

答案 1 :(得分:0)

问题看起来框架的LayoutManager正在为您设置标签的位置。

您需要做的是将布局设置为null:

 frame.setLayout(null);

这将使框架不会尝试自行布局组件。

然后你可以做

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

然而,没有布局并不理想,但GridLayout对你想要的东西也不是很好。

原因GridLayout将始终按您编写的顺序对组件进行排序&#34; container.add(component)&#34;声明。您不能将组件放在特定的位置,除非之前为所有位置插入虚拟组件。

您可能想尝试GridBagLayout ..在GridBagLayout中,您在关键事件中所做的一切就是更新动态面板的位置,它应显示在顶部该位置的固定面板。