我是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方法中的所有内容均按预期工作。为什么构造函数中的按钮不起作用,以及如何使它起作用(如果我可以使其完全起作用)?
答案 0 :(得分:2)
您无需在JPanel
(DialPanel
构造函数的第一行)内再创建一个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);
}
}