为什么 JButton 不显示在 JFrame 上?

Why aren't the JButtons displayed on the JFrame?

当我 运行 程序 window 及其所有属性都正确时,但按钮不会显示,知道我做错了什么吗?

我有两个 类 window 和 TimeTable0:

这是window:

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

您需要初始化按钮并将 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 对象,而没有为其他对象创建 JButton 对象。

您也忘记了将 JPanel 添加到 JFrame 中。

add(panel);  //Add panel to frame
  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();
    

如果您真的想将 class 扩展到 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);         
    }
}

通常我更愿意将 class 扩展到 JPanel,而不是将其扩展到 JFrame。之后在 main() 中创建一个 JFrame 并将您自定义的 JPanel 添加到其中。

一个一个初始化按钮:

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