2

如果我说,在最后一秒和第三行

label.setText("x = ");

标签正在完美移动,但是当我将其更改为

label.setText("x = "+ x);

它不动。具体来说,我想查看 JLabel 移动变量x时的宽度位置!除此之外,我说label.setBounds(x,(getHeight()/2),300,300);将标签的 Y 边界设置为帧大小的一半,但它不在帧的中间?任何的想法?

import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import javax.swing.JLabel;
import javax.swing.Timer;

import javax.swing.JFrame;

public class myTiemr {

    public static void main(String args[])
    {
        TimeFrame frame = new TimeFrame();
    }
}

class TimeFrame extends JFrame
{
    private static final long serialVersionUID = 1L;
    private int x = 0;
    JLabel label = new JLabel("Here is my label");
    public TimeFrame()
    {
        int d = 10;
        setTitle("My Frame");
        setSize(500,500);
        this.setLocationRelativeTo(null);
        add(label);
        Timer time = new Timer(d,new TimerListener());
        time.start();       
        setVisible(true);
    }
    class TimerListener implements ActionListener
    {
        public void actionPerformed(ActionEvent e)
        {
            if(x>getWidth()){
                x=-100;
            }
            x+=1;
            label.setText("x = "+ x);
            //label.setText("x = ");
            label.setBounds(x,(getHeight()/2),300,300);
        }
    }

}
4

2 回答 2

3

TimeFrame构造函数中,添加:

this.setLayout(null);

之后this.setLocationRelativeTo(null);

于 2012-09-25T09:22:36.213 回答
3

label.setText("x = "+ x)导致文本保持静止但行label.setText("x = ")导致标签跨框架移动的原因是revalidate()JLabel. 这将导致应用当前布局管理器规则的正确行为(即BorderLayout在这种情况下)。

当文本没有改变时,revalidate()永远不会被调用。

正如@Sébastien Le Callonnec 建议的那样,在框架上设置 no layout 会导致

label.setText("x = "+ x)

根据需要移动。

于 2012-09-25T09:31:07.420 回答