2014-01-05 91 views
0

好吧,即將開始使用Java編程GUI,我需要一些關於如何添加按鈕和標籤的幫助。我四處尋找一個例子,我想它,這是它的工作原理基本上添加一個按鈕:Java GUI幫助(JFrame,JButton等)

import javax.swing.JButton; 
import javax.swing.JFrame; 
import javax.swing.JLabel; 


public class GUI_Tests extends JFrame{ 
    public static void main(String[] args){ 
     private JButton button; 
     button = new JButton("pls work"); 
     add(button); 

    } 

} 

好沒有工作在所有...可有人告訴我它怎麼做的,給我一些指點?

+0

一般來說,直接從'JFrame'直接擴展通常是不鼓勵的,因爲你沒有給每個類添加任何東西。相反,從「JPanel」開始。這可以添加到任何頂級容器(或任何其他容器),你想... – MadProgrammer

回答

1

您應該將JButton添加到JFrame,但在我看來,您還沒有創建JFrame。您應該先創建GUI_Tests的實例,然後使用JFrame#add方法與您的JButton。例如:

public class GUI_Tests extends JFrame { 
    public GUI_Tests() { 
     super("My first Swing frame!"); 

     this.setPreferredSize(new Dimension(640, 480)); 
     this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 

     // Create your GUI here 
     this.add(new JButton("Click on me :)")); 

     this.setVisible(true); 
    } 
} 

其實,我不會對你意味着什麼,但我想你想得太快:在我看來,你應該通過下面就如何處理與Swing一些教程開始:)

1

您需要將您的按鈕添加到JFrame基本流程應該是這個樣子:

import javax.swing.JButton; 
import javax.swing.JFrame; 
import javax.swing.SwingUtilities; 

public class GUITests extends JFrame{ 

    public GUITests() { 
     setTitle("Simple example"); 

     setLocationRelativeTo(null); 
     setDefaultCloseOperation(EXIT_ON_CLOSE); 
     JButton button = new JButton("pls work"); 
     add(button); 
     pack(); 
    } 

    public static void main(String[] args){ 
     SwingUtilities.invokeLater(new Runnable() { 
      @Override 
      public void run() { 
       GUITests ex = new GUITests(); 
       ex.setVisible(true); 
      } 
     }); 

    } 
} 

的GUITests類擴展JFrame類,所以你可以調用一切都在JFrame類可見方法。主要方法它只是一些鍋爐板代碼,爲你調用你的構造函數,這樣你就可以看到你的基本例子。

退房這裏的教程:http://zetcode.com/tutorials/javaswingtutorial/firstprograms/

+1

NitPick - 但是你不應該真的使用'setSize',因爲窗口的內容可能超過設計尺寸系統上的窗口。更好地使用'包' - 恕我直言 – MadProgrammer

+0

@MadProgrammer好點,最初只是從臀部射擊,需要刷上我的揮杆最佳實踐! – Durandal

0

setVisible(true); 
setSize(500 , 500); 

,我想你會看到一些東西。在聲明中private JButton button也擺脫私人但你應該把你的代碼在GUI_Tests的構造函數:

import javax.swing.*; 

public class GUI_Tests extends JFrame { 
    public GUI_Tests() { 
     JButton button = new JButton("Hello World"); 
     add(button); 
     setVisible(true); 
     setSize(500 , 500); 
    } 

    final public static void main(String[] args) { 
     GUI_Tests tests = new GUI_Tests(); 
    } 
} 

退房了Java教程更多的幫助,可能是在這裏:http://docs.oracle.com/javase/tutorial/uiswing/start/index.html

+0

NitPick - 但是你不應該真的使用'setSize',因爲窗口的內容可能超過系統窗口的設計大小。最好使用'pack'。您還應該盡力從EDT的上下文中啓動UI,如[初始線程](http://docs.oracle.com/javase/tutorial/uiswing/concurrency/initial)中所述。html) - 恕我直言 – MadProgrammer

3
  • 你應該注意的是,一個JFrame有一個默認的BorderLayout,如果沒有指定,它會將一個組件添加到BorderLayout.CENTER的位置。
  • 當添加組件JFrame,如果沒有指定一個不同的佈局,那麼你要設置組件的位置,像add(button, BorderLayout.SOUTH);

  • 你也應該使用構造函數。像這樣的東西

    public class GUI_Tests extends JFrame { 
        public GUI_Tests(){ 
         JButton button = new JButton("Pls work"); 
         JLabel label = new JLabel("Pls work"); 
         add(button, BorderLayout.CENTER); 
         add(label, BorderLayout.SOUTH); 
        } 
    } 
    
  • 此外,你需要記住設置框架可見。

一個簡單的正在運行的程序會是這樣的

import java.awt.BorderLayout; 
import javax.swing.JButton; 
import javax.swing.JFrame; 
import javax.swing.JLabel; 
import javax.swing.SwingUtilities; 

public class GUI_Tests extends JFrame { 

    public GUI_Tests() { 
     JButton button = new JButton("Pls work"); 
     JLabel label = new JLabel("Pls work"); 
     add(button, BorderLayout.CENTER); 
     add(label, BorderLayout.WEST); 

     pack(); 
     setDefaultCloseOperation(EXIT_ON_CLOSE); 
     setLocationRelativeTo(null); 
     setVisible(true); 
    } 

    public static void main(String[] args) { 
     SwingUtilities.invokeLater(new Runnable(){ 
      public void run(){ 
       new GUI_Tests(); 
      } 
     }); 
    } 
} 

  • main方法可能看起來有點瘋狂的給你,但一切正在做的是使程序運行事件調度線程(EDT)。因爲你還是個初學者,所以我不會這麼做。
  • run是怎麼回事,我所做的就是創建一個我的程序實例,其中extends JFrame。如果我沒有擴展JFrame,我將不得不明確創建一個JFrame來運行該程序。所有GUI程序都需要一些頂級容器來運行。
  • 您也可以在構造函數中看到,當我添加了buttonlabel我設置佈局位置

    add(button, BorderLayout.CENTER); 
    add(label, BorderLayout.SOUTH); 
    

    正如我前面所說,使用JFrame沒有指定一個不同的佈局時,應使用位置與默認的`BorderLayout。其他可能的位置是

    BorderLayout.EAST 
    BorderLayout.WEST 
    BorderLayout.CENTER 
    BorderLayout.NORTH 
    BorderLayout.SOUTH 
    

    看看[布放組件內的容器]布放組件內的容器)

  • 此外,注意到我使用pack()。這樣做是使框架與偏好大小的組件完美。它優選爲pack()而不是幀的setSize()
  • setDefaultCloseOperation(EXIT_ON_CLOSE);使得當x出幀時程序關閉。
  • setLocationRelativeTo(null);將框架的位置設置在屏幕的中心
  • setVisible(true);使框架可見。應該始終調用該方法,以便在程序開始時顯示框架。

請看看在Swing tutorials

+0

你能解釋一下這個例子嗎,在那裏有一些非常好的點,在其他答案中沒有演示;) – MadProgrammer

+0

@MadProgrammer是的,我會開始。我想確保你完全理解所有的東西:D –

+0

還提到'pack'的作用......這個很容易被看過,但是非常有用;) – MadProgrammer

1
public class GUI_Tests extends JFrame { 

    private JButton button; 

    public GUI_Tests() { 
     setTitle("Title"); 
     setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); // so that the application properly closes when you click close 
     button = new JButton("pls work"); 
     add(button); 
     pack(); // resize the frame to its contents 
     setLocationRelativeTo(null); // center the frame on the screen 
    } 

    public static void main(String args[]) { 
     // properly start a swing application 
     SwingUtilities.invokeLater(new Runnable() { 

      @Override 
      public void run() { 
       GUI_Tests gui = new GUI_Tests(); 
       gui.setVisible(true); // set the frame visible 
      } 
     }); 
    } 
} 

希望這可以幫助你瞭解多一點。我沒有在這段代碼中使用任何佈局,只是一個簡單的例子,但是,我強烈建議您閱讀swing中的內置佈局以及如何使用它們。 Here's one good start

+0

除了擴展'JFrame',這是一個很好的答案;)您可能想提及佈局管理器,因爲OP可能會在嘗試此操作時獲得驚喜;) – MadProgrammer

+0

謝謝!我只是在OP的代碼之上工作,而對於佈局管理者,我確實留下了一個鏈接到一個oracle站點,OP可以閱讀和了解不同的佈局:) – doomsdaymachine