为什么JButtons没有显示在JFrame上?



当我运行程序的窗口和它的所有属性都是正确的,但按钮不会显示,任何想法我做错了什么?

我有两个类window和timeable0:

窗口:

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("");
               });
    }
}

还有timeable0:

package timetable0;
public class TimeTable0 {
    public static void main(String[] args) {
        window menu = new window();
        menu.ventana();
        menu.actions();
    }
}
  1. 您没有将JPanel添加到帧中。

    panel.add(bt1);
    panel.add(bt2);
    panel.add(bt3);
    panel.add(bt4);
    setContentPane(panel);
    
  2. 您没有在事件调度线程上运行程序:

    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();
    

如果你真的想把你的类扩展到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添加到其中。

您需要初始化按钮并将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
}

这里没有显示太多代码,但您至少应该尝试这样做:

注意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

逐个初始化按钮:

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);

最新更新