2014-01-20 87 views
1

如何每次單擊按鈕時更改按鈕的位置?它的作品,但只是第一次點擊它。JButton:更改按鈕的位置

import javax.swing.*; 
import java.awt.event.*; 

public class Viewer { 
    private static JButton b1 = new JButton("Action Listener"); 
    private static JFrame f = new JFrame(); 
    private static JPanel p = new JPanel(); 
    public static void main(String[]args){ 
     f.setVisible(true); 
     f.setSize(400,400); 
     f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);   
     p.add(b1); 
     f.add(p);  
     b1.addActionListener(new ActionListener(){ 
      public void actionPerformed(ActionEvent e) {   
       b1.setLocation(100,100); 
      } 
     }); 
    } 
} 
+1

您將它移動到100,100點的恆定位置。當你多次按下按鈕時,並不是它不工作,而只是將它移動到相同的位置,這看起來沒有任何效果。 –

+0

謝謝。我沒有看到。我將隨機化x組件和y組件以使其工作 – user3105629

回答

2

免責聲明

這是不是你會怎麼想這樣做!正如MadProgrammer指出的那樣,該結果在面板失效後不會持續。這僅僅是爲什麼你沒有得到你想要的結果的一個例子。

您的actionPerformed()方法每次都被調用,它只是每次執行時都將按鈕放在同一個地方。如果你願意,可以說,每次點擊時向右移動10次,嘗試這樣的事情。

import javax.swing.*; 
import java.awt.event.*; 

public class Viewer { 
    private static JButton b1 = new JButton("Action Listener"); 
    private static JFrame f = new JFrame(); 
    private static JPanel p = new JPanel(); 
    private static int location = 100; //Make a variable for location 
    public static void main(String[]args){ 
     f.setVisible(true); 
     f.setSize(400,400); 
     f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);   
     p.add(b1); 
     f.add(p);  
     b1.addActionListener(new ActionListener(){ 
      public void actionPerformed(ActionEvent e) {   
       b1.setLocation(location,100); 
       location += 10; //This will change where it draws next time 
      } 
     }); 
    } 
} 

此外,您使用靜態是相當錯誤的。您正在使用它,因此您可以在main()中執行所有這些操作,但是您需要的是Swing的EDT here

+0

直到容器失效通過按鈕將返回到佈局經理想要的位置;) – MadProgrammer

+1

嘗試調整框架大小,看看會發生什麼;) – MadProgrammer

+0

現在我把臉放在桌子上...感謝您的擡頭。 – csmckelvey

3

默認情況下,JPanel使用FlowLayout。這意味着對組件位置的任何更改只會是臨時性的,並且在下一次佈置容器時將由佈局管理器「重置」。在移動按鈕後嘗試調整框架大小

由於@JoshM已經被指出,您只需將按鈕移動到每次點擊時相同的位置。

問題是,你爲什麼要移動按鈕?

+0

Swing大量使用佈局管理API,該API將決定如何在容器中定位和調整組件的大小。你所做的是對此產生反作用,並在容器狀態發生變化時產生不良結果。如果這只是一個練習,你可以看看[放置容器中的組件](http://docs.oracle.com/javase/tutorial/uiswing/layout/index.html) – MadProgrammer