2

私が言うなら、最後の2行目と3行目で

label.setText("x = ");

ラベルは完全に動いていますが、変更すると

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

動かない。具体的には、変数xで移動しているときの JLabel の幅の位置を確認したいです。これに加えて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

label.setText("x = "+ x)テキストが静止したままであるのに、線label.setText("x = ")によってラベルがフレームを横切って移動する理由は、でrevalidate()呼び出されるためJLabelです。これにより、現在のレイアウト マネージャーのルールを適用する正しい動作が発生します (つまりBorderLayout、この場合)。

テキストが変更されない場合、revalidate()は呼び出されません。

@Sébastien Le Callonnecが提案したように、フレームにレイアウトを設定しないと、

label.setText("x = "+ x)

思い通りに動くこと。

于 2012-09-25T09:31:07.420 に答える
3

コンストラクターで、TimeFrame次を追加します。

this.setLayout(null);

this.setLocationRelativeTo(null);

于 2012-09-25T09:22:36.213 に答える