2015-08-22 3 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

Он не работает, даже если я добавляю кнопки непосредственно в JFrame, избегая JPanel. –

0

Вы не показали много кодов, но вы должны по крайней мере попытаться сделать это вместо того, чтобы:

Обратите внимание, что JButton bt1,bt2,bt3,bt4 = new JButton(); отличается от написания его, как показано ниже:

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

Doing JButton bt1,bt2,bt3,bt4 = new JButton();, вы создаете объект JButton только для bt4, а не для остальных.

Вы также забыли добавить свой 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. После этого создайте JFrame в main() и добавьте в него свой собственный 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); 
Смежные вопросы