2016-09-21 5 views
1
import javax.swing.*; 
import java.awt.event.*; 

public class SimpleGUI3 implements ActionListener { 
    JButton button; 
    private int numClick; 

    public static void main(String[] args) { 
     SimpleGUI3 gui = new SimpleGUI3(); 
     gui.go(); 
    } 

    public void go() { 
     JFrame frame = new JFrame(); 
     button = new JButton("Click me."); 
     button.addActionListener(this); 
     frame.getContentPane().add(button); 
     frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
     frame.setSize(300, 300); 
     frame.setVisible(true); 
    } 

    @Override 
    public void actionPerformed(ActionEvent e) { 
     button.setLocation(100, 100); //This code do not change the button location if numClick++ (next row) used. 
     numClick++;     //If comment numClick++ the button changes location on click. Why location doesn't changes if this row uncomment? 
     button.setText("Has been clicked " + numClick + " times."); 
    } 
} 

質問はありますか?のsetLocationなし整数増分がない場合にのみ

+1

'button.setLocation(100,100);'しないでください。それは効果的にレイアウトマネージャーと戦っています。ボタンを動かす目的は何ですか? –

+0

目的は、その仕組みを理解することです。コメント付きのnubClick ++では、ボタンは一度クリックすると移動します。 – jakarjakar

+0

* "目的はそれがどのように機能するかを理解することだけです。" *だから、行えないはずのものがどのように作用するのか理解したいですか?全く無意味です。 **ボタンがクリックされたときにコンポーネントを移動させる実際の理由があった場合、コンポーネントを含むパネルをラップする 'EmptyBorder'のパラメータを変更することによって行うのが最適です。しかし、代わりにあなたの注意を実際に有用でありベストプラクティスを維持するものに注目してください。 –

答えて

2

numClickの値を変更すると、setText()メソッドを使用すると、ボタンのテキストも変更されます。

ボタンのプロパティが変更されると、Swingは自動的にコンポーネントのrevalidate()repaint()を呼び出します。

revalidate()はレイアウトマネージャを呼び出し、レイアウトマネージャはレイアウトマネージャのルールに基づいてボタンの位置を(0、0)に戻します。レイアウトマネージャのルールは、デフォルトではBorderLayoutです。フレーム。

ボトムラインは、コンポーネントの位置やサイズを管理しないでください。それがレイアウトマネージャの仕事です。

また、Java命名規則を学び、使用してください。クラス名は大文字で始まる必要があります。

スイングの基礎についてはSwing tutorialをお読みください。

関連する問題