我有JMenuItem
ActionListener
,ActionListener
我想在GridBagLayout
添加frame
(可能有也可能没有添加了一个内容窗格 - 出于测试目的而没有添加,然后将components
添加到frame
。 frame works
上有trigger
的设计,但我希望ActionListener
来自JMenuItem
ActionListener
,这是我遇到问题的地方。它不会显示在ActionListener
内部。我已经尝试从AL中的类中使用不同的方法运行相同的代码,但这也没有用。
当我完全注释掉JLabel
时,我要测试的GBL
会在正确的位置添加prints
,而系统debug
会compiler
行这里和 here2 。 JFrame
未收到任何语法错误。这产生了期望的结果,并且打印了标签。 (请参阅下面的图片,了解当我完全注释掉AL时会发生什么。)有问题的代码片段(在哪个帧中是我的// (frame created, menus added, etc.) ...
JMenuItem vPoke1Item = new JMenuItem("Pokemon 1");
vPoke1Item.setActionCommand("poke1");
viewMenu.add(vPoke1Item);
//Setup GBL to view stats for Pokemon 1
vPoke1Item.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e)
{
// debug output
System.out.println("here");
// Set up the content pane
frame.getContentPane().removeAll();
GridBagLayout gbl = new GridBagLayout();
GridBagConstraints gbc = new GridBagConstraints();
Container pane = frame.getContentPane();
pane.setLayout(gbl);
// Make a StatCalcObject (all my labels/fields are already initialized)
StatCalc1 sc1 = new StatCalc1();
// Add it to pane
gbc.gridx = 0;gbc.gridy = 0;gbl.setConstraints(sc1.speciesL, gbc);
pane.add(sc1.speciesL);
frame.revalidate();
frame.repaint();
// debug output
System.out.println("here2");
}
});
// (etc.)
)如下:
{{1}}
现在当我运行这段代码时,我仍然会调试“here”和“here2”调试行,所以它告诉我ActionListener运行正常。但标签没有出现。仍然没有编译器拾取语法错误。所以我在这里摸不着头脑。我究竟做错了什么?我希望这段代码足以理解这个问题,但是如果你想要完整的代码,我可以提供它。
答案 0 :(得分:1)
如果你使用固定大小的窗口,如果你替换
,一切都会有效frame.revalidate();
frame.repaint();
与
pane.invalidate();
pane.validate();
或
pack();
如果您没有固定尺寸的框架。 请注意,JFrame或Container不支持重新验证。 替换
也更好gbl.setConstraints(sc1.speciesL, gbc);
pane.add(sc1.speciesL);
带
pane.add(sc1, gbc);
以获得更好的代码风格。
答案 1 :(得分:0)
查看方法pane.add(sc1.speciesL);
时发生的情况下次调用Container.add(sc1.speciesL,null,-1)
然后是Container.addImpl(组件comp,对象约束,int索引)
然后由gbl.setConstraints(sc1.speciesL,gbc)提出的约束;被null取代。
if (layoutMgr instanceof LayoutManager2) {
((LayoutManager2)layoutMgr).addLayoutComponent(comp, constraints);
}
然后面板没有显示你新添加的组件,因为GridBagConstraints现在为空
你实际上并不需要强迫
frame.revalidate();
frame.repaint();
frame.pack();
您需要使用适当的方法正确地将新组件添加到容器中:
pane.add(sc1.speciesL, gbc);
删除uselsess
gbl.setConstraints(sc1.speciesL, gbc);