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

时间:2019-04-02 22:03:20

标签: java swing

我是Java的GUI新手(我想应该是通用代码),所以我对JPanel上的JButton仅在初始化并在具有JFrame的类上添加JButton时才显示的原因感到困惑。我想做的是在JPanel上使用JBUttons和GridLayout创建电话键盘。

如果我初始化JButton并将其添加到包含JFrame的类的JPanel上。我无法在扩展JPanel的类中将JButton添加到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);
    }
}

在第二个选项中,窗口只是空白,而在main方法中的所有内容均按预期工作。为什么构造函数中的按钮不起作用,以及如何使它起作用(如果我可以使其完全起作用)?

1 个答案:

答案 0 :(得分:2)

您无需在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);
    }
}