2015-08-22 117 views
1

當我運行程序時,窗口及其所有屬性都是正確的,但按鈕不會顯示出來,對我做錯了什麼的想法?爲什麼JButtons不顯示在JFrame上?

我有兩個類窗口和TimeTable0:

這裏的窗口:

package timetable0; 

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

public class window extends JFrame { 

    JButton bt1,bt2,bt3,bt4 = new JButton(); 
    JPanel panel = new JPanel(); 

    public void ventana() { 

     setResizable(false); 
     setTitle("Time Table"); 
     setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
     setSize(400,550); 
     setVisible(true); 

     bt1.setText("Show Grades"); 
     bt2.setText("Show Time Table"); 
     bt3.setText(""); 
     bt4.setText(""); 

     panel.add(bt1); 
     panel.add(bt2); 
     panel.add(bt3); 
     panel.add(bt4); 

    } 

    public void actions(){ 

     bt1.addActionListener((ActionEvent e) -> { 
      System.out.println(""); 
       }); 
     bt2.addActionListener((ActionEvent e) -> { 
      System.out.println(""); 
       }); 
     bt3.addActionListener((ActionEvent e) -> { 
      System.out.println(""); 
       }); 
     bt4.addActionListener((ActionEvent e) -> { 
      System.out.println(""); 
       }); 

    } 

} 

而這裏的TimeTable0:

package timetable0; 

public class TimeTable0 { 
    public static void main(String[] args) { 
     window menu = new window(); 

     menu.ventana(); 
     menu.actions(); 
    } 
} 
+0

有沒有發生任何異常/錯誤,還是沒有? –

+0

jpanel未添加到jframe? – happymeal

回答

5
  1. 您沒有添加JPanel到框架上。

    panel.add(bt1); 
    panel.add(bt2); 
    panel.add(bt3); 
    panel.add(bt4); 
    setContentPane(panel); 
    
  2. 你是不是在Event Dispatch Thread運行的程序:

    public static void main(String[] args) { 
        EventQueue.invokeLater(new Runnable() { 
         @Override 
         public void run() { 
          window menu = new window(); 
          menu.ventana(); 
          menu.actions(); 
         } 
        }); 
    } 
    
  3. 您還沒有創建所有四個按鈕:

    JButton bt1 = new JButton(); 
    JButton bt2 = new JButton(); 
    JButton bt3 = new JButton(); 
    JButton bt4 = new JButton(); 
    
+0

很好的答案!我將需要對事件調度進行一些研究...... – deezy

+0

@DizzyCode謝謝。事件調度線程對於具有響應式用戶界面非常重要。如果你想知道爲什麼你的面板沒有更新(在事件調度線程上做的太少),或者你的用戶界面很慢(在EDT上做太多),這就是爲什麼。 – durron597

0

您需要初始化按鈕,並添加panel到JFrame 。此外,請嘗試將setVisible(true)聲明移至ventana()方法的末尾,以便在之後添加組件後顯示

public void Ventana() { 
    bt1 = new JButton("Show Grades"); 
    bt2 = new JButton("Show Time Table"); 
    bt3 = new JButton(); 
    bt4 = new JButton(); 
    ... 
    panel.add(bt4); 

    add(panel); 
    setVisible(true); //moved from top 
} 
+0

即使我將按鈕直接添加到避免使用JPanel的JFrame,它也不工作。 –

0

你沒有表現出多大的碼在那裏,但你至少應該嘗試這樣做,而不是:

注意JButton bt1,bt2,bt3,bt4 = new JButton();是從下面寫它不同:

JButton bt1 = new JButton(); 
JButton bt2 = new JButton(); 
JButton bt3 = new JButton(); 
JButton bt4 = new JButton(); 

JButton bt1,bt2,bt3,bt4 = new JButton();,你只是爲bt4創建一個JButton對象,而不是其他的。

您也忘記將您的JPanel添加到您的JFrame中。

add(panel); //Add panel to frame 
1

我會做這樣如果你真的想把你的類擴展到JFrame。

public class Window extends JFrame { 

    JButton bt1,bt2,bt3,bt4; //Do initialization in the constructor, not here 
    JPanel panel; 

    public Window() { 
     createComponents(); 
     addComponents(); 
     initFrame(); 
    } 

    private void createComponents(){ 
     panel = new JPanel(); 
     panel.setPreferredSize(new Dimension(800, 600)); 
     bt1 = new JButton("Show Grades"); 
     bt2 = new JButton("Show Time Table"); 
     bt3 = new JButton("btn 3"); 
     bt4 = new JButton("btn 4");   
    } 
    private void addComponents(){ 
     panel.add(bt1); 
     panel.add(bt2); 
     panel.add(bt3); 
     panel.add(bt4); 
     add(panel); 
    } 
    private void initFrame(){ 
     setResizable(false); 
     setTitle("Time Table"); 
     setVisible(true); 
     setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
     pack(); 
     setLocationRelativeTo(null);   
    } 
} 

通常我寧願將類擴展到JPanel而不是將其擴展到JFrame。之後,在main()中創建一個JFrame並將您的自定義JPanel添加到它中。

+2

我試圖避免*完全*重寫他的代碼,但是如果你打算這樣做,至少要大寫類名:) – durron597

+0

@ durron597不是真的重寫,更多的是重新組織他的代碼,這可能會給他一個更好的想法。是要完成的。 ;) – user3437460

0

初始化按鈕,一個接一個:

JButton bt1 = new JButton(); 
JButton bt2 = new JButton(); 
JButton bt3 = new JButton(); 
JButton bt4 = new JButton(); 

添加面板到相框添加按鈕後,您的面板:

panel.add(bt1); 
    panel.add(bt2); 
    panel.add(bt3); 
    panel.add(bt4); 

    setContentPane(panel);