2016-09-21 23 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."); 
    } 
} 

的問題是:爲什麼 在代碼上點擊位置的改變,而不numClick ++爲什麼按鈕ocation沒有變化,如果numClick ++代碼的工作?setLocation中的actionPerformed改變按鈕的位置只要沒有整數遞增

+1

'button.setLocation(100,100);'不要這樣做。它有效地對抗了佈局經理。移動按鈕的目的是什麼? –

+0

目的只是理解它是如何工作的。使用註釋nubClick ++時,按鈕會在點擊時移動一次。 – jakarjakar

+0

*「目的只是理解它是如何工作的。」*所以......你想了解一些不應該做的事情,工作嗎?完全毫無意義。 **如果**有按鈕點擊移動組件的實際原因,最好通過改變包含組件面板的'EmptyBorder'的參數來完成。但是請將您的注意力轉向實際有用並保持最佳做法的事物。 –

回答

2

當您更改numClick的值時,使用setText()方法時,按鈕的文本也會更改。

當按鈕的屬性發生變化時,Swing將自動在組件上調用revalidate()repaint()

revalidate()將調用佈局管理器,並且佈局管理器將基於佈局管理器的規則將按鈕的位置重置回(0,0),佈局管理器的默認情況下爲BorderLayout的內容窗格幀。

底線是不要嘗試管理組件的位置或大小。這是佈局經理的工作。

另外,學習和使用Java命名約定。類名應以大寫字母開頭。

閱讀Swing tutorial獲取Swing基礎知識。