为什么我的JButton在放入JPanel的构造函数时不显示?

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了为什么我的JButton在放入JPanel的构造函数时不显示?相关的知识,希望对你有一定的参考价值。

我是Java中的GUI新手(并且我想在gneral编码),所以我很困惑为什么我的JPanel上的JButton只在我初始化并在具有JFrame的类上添加JButton时才显示。我想要做的是在JPanel上创建一个带JBUttons和GridLayout的电话键盘。

如果我初始化并将JButtons添加到其中包含JFrame的类的JPanel。我无法将JButtons添加到扩展JPanel的类中的JPanel,然后将JPanel对象添加到JFrame。

这有效:

public static void main (String[] argv){ 
         JFrame frame = new JFrame();
         frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 

         frame.setBackground(Color.gray);
         DialPanel keypad = new DialPanel();
         panel.setLayout(new GridLayout(3, 3));
         JButton one = new JButton("1");
     JButton two = new JButton("2");
     JButton three = new JButton("3");
     JButton four = new JButton("4");
     JButton five = new JButton("5");
     JButton six = new JButton("6");
     JButton seven = new JButton("7");
     JButton eight = new JButton("8");
     JButton nine = new JButton("9");
     keypad.add(one);
     keypad.add(two);
     keypad.add(three);
     keypad.add(four);
     keypad.add(five);
     keypad.add(six);
     keypad.add(seven);
     keypad.add(eight);
     keypad.add(nine);

         frame.getContentPane().add(keypad);
         keypad.setVisible(true);

         frame.pack();
         frame.setVisible(true);
    } 

public class DialPanel extends JPanel {

    DialPanel(){
        JPanel panel = new JPanel();
    }
}

但这不起作用,我不知道为什么:

    public static void main (String[] argv){ 
         JFrame frame = new JFrame();
         frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 

         frame.setBackground(Color.gray);
         DialPanel keypad = new DialPanel();
         frame.getContentPane().add(keypad);
         keypad.setVisible(true);

         frame.pack();
         frame.setVisible(true);
    } 

public class DialPanel extends JPanel {

    DialPanel(){
         JPanel panel = new JPanel();
         panel.setLayout(new GridLayout(3, 3));
         panel.setBackground(Color.gray);
                 JButton one = new JButton("1");
         JButton two = new JButton("2");
         JButton three = new JButton("3");
         JButton four = new JButton("4");
         JButton five = new JButton("5");
         JButton six = new JButton("6");
         JButton seven = new JButton("7");
         JButton eight = new JButton("8");
         JButton nine = new JButton("9");
         panel.add(one);
         panel.add(two);
         panel.add(three);
         panel.add(four);
         panel.add(five);
         panel.add(six);
         panel.add(seven);
         panel.add(eight);
         panel.add(nine);
    }
}

使用第二个选项时,窗口只是空白,但是主方法中的所有内容都按预期工作。为什么不在构造函数中使用按钮,以及如何让它工作(如果我可以让它像这样工作)?

答案

你不需要在JPanelDialPanel构造函数中的第一行)中再创建一个DialPanel

DialPanel已按类定义扩展JPanel

 public class DialPanel extends JPanel

因此,您将所有按钮添加到从未添加到任何其他容器的JPanel中。

您必须将所有按钮添加到DialPanel本身。

正确的代码是:

public class DialPanel extends JPanel {
    DialPanel(){
         setLayout(new GridLayout(3, 3));
         setBackground(Color.gray);
         JButton one = new JButton("1");
         JButton two = new JButton("2");
         JButton three = new JButton("3");
         JButton four = new JButton("4");
         JButton five = new JButton("5");
         JButton six = new JButton("6");
         JButton seven = new JButton("7");
         JButton eight = new JButton("8");
         JButton nine = new JButton("9");
         add(one);
         add(two);
         add(three);
         add(four);
         add(five);
         add(six);
         add(seven);
         add(eight);
         add(nine);
    }
}

以上是关于为什么我的JButton在放入JPanel的构造函数时不显示?的主要内容,如果未能解决你的问题,请参考以下文章

Swing:如何在每个组件、JPanel、JButton 等上绘制动画?

如何通过单击 JButton 添加 JPanel?

如何使用默认 FlowLayout 在 JPanel 中将 JButton 居中?

Java Swing 在单击我要删除的 jpanel 中存在的 Jbutton 时删除 Jpanel

JButton 位于不应该在其上的 JPanel [关闭]

让 JButton 打开一个新的 JPanel