这是我的代码。当我setContentPane(panel)
它有效时,但当我getContentPane().add(panel)
它不起作用时。
为什么第二种方法不起作用? (它没有给我任何东西)
public MyFrame() {
final JFrame frame = new JFrame();
frame.setLayout(new BorderLayout());
frame.setResizable(false);
frame.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);
frame.setFont(new Font("Comic Sans MS", Font.BOLD, 12));
JMenuBar mnuBar = new JMenuBar();
JMenu mnu1 = new JMenu("aaa");
mnu1.setMnemonic(KeyEvent.VK_E);
JMenuItem menuItem = new JMenuItem("Insert Places", KeyEvent.VK_T);
menuItem.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent arg0) {
count = 0;
jt = new ArrayList[4];
for (int i = 0; i < 4; i++)
jt[i] = new ArrayList<JTextField>();
panel = new JPanel();
panel.setLocation(0, 0);
panel.setSize(d.width, d.height);
panel.setLayout(null);
JButton add = new JButton("lllll");
add.setSize(120, 80);
add.setLocation(250, 100);
add.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent arg0) {
for (int i = 0; i < 4; i++) {
JTextField jt1 = new JTextField(20);
jt1.setSize(150, 30);
jt1.setLocation(450 + i * 200, 80 + count * 50);
jt1.setVisible(true);
jt[i].add(jt1);
panel.add(jt1);
}
count++;
frame.repaint();
}
});
panel.add(add);
JButton confirm = new JButton("ccc");
confirm.setSize(120, 80);
confirm.setLocation(250, 200);
confirm.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent arg0) {
count = 0;
for (int j = 0; j < jt[0].size(); j++) {
try {
connect.insertPlace(Integer.parseInt(jt[0]
.get(j).getText()), jt[1].get(j).getText(),
Integer.parseInt(jt[2].get(j).getText()),
Integer.parseInt(jt[3].get(j).getText()));
count++;
} catch (Exception e) {
JOptionPane.showMessageDialog(null, e, "ERROR",
0, null);
}
}
JLabel countL = new JLabel("" + count
+ " ??? ??? ?? ");
countL.setSize(100, 100);
countL.setLocation(250, 350 + jt.length * 10);
panel.add(countL);
frame.repaint();
}
});
panel.add(confirm);
frame.getContentPane().add(panel);
}
});
mnu1.add(menuItem);
mnuBar.add(mnu1);
frame.setJMenuBar(mnuBar);
frame.pack();
frame.setExtendedState(JFrame.MAXIMIZED_BOTH);
frame.setVisible(true);
}
答案 0 :(得分:2)
现有内容窗格的Layout
就是这样,您的面板尺寸不正确且无法显示。比较现有内容窗格的布局,JFrame
和JPanel
,并注意差异。
答案 1 :(得分:0)
指定组件的位置(例如,
BorderLayout.LINE_END
)作为add
方法的参数之一。如果由BorderLayout
对象控制的容器中缺少此组件,请确保指定了组件的位置,并且没有其他组件放在同一位置。
从我所看到的,你有
frame.setLayout(new BorderLayout());
但是,你没有指定它的位置。
frame.getContentPane().add(panel);
请尝试
frame.getContentPane().add(panel, BorderLayout.CENTER);
另外,我不确定以下操作的顺序是否相关
panel = new JPanel();
panel.setLocation(0, 0);
panel.setSize(d.width, d.height);
panel.setLayout(null);
但您可以直接在构造函数上设置布局。
panel = new JPanel(null);
并且,由于您的面板将插入由布局管理器控制的容器中,因此您不需要指定其位置。至于它的尺寸,你可以指定它的首选尺寸,虽然这不被一些人视为好习惯。
panel.setPreferredSize(new Dimension(d.width, d.height));