无法在ActionListener中添加GridBagLayout

时间:2012-10-22 02:51:16

标签: java swing jframe actionlistener gridbaglayout

我有JMenuItem ActionListenerActionListener我想在GridBagLayout添加frame(可能有也可能没有添加了一个内容窗格 - 出于测试目的而没有添加,然后将components添加到frameframe works上有trigger的设计,但我希望ActionListener来自JMenuItem ActionListener,这是我遇到问题的地方。它不会显示在ActionListener内部。我已经尝试从AL中的类中使用不同的方法运行相同的代码,但这也没有用。

当我完全注释掉JLabel时,我要测试的GBL会在正确的位置添加prints,而系统debugcompiler这里 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.) )如下:

enter image description here

{{1}}

现在当我运行这段代码时,我仍然会调试“here”和“here2”调试行,所以它告诉我ActionListener运行正常。但标签没有出现。仍然没有编译器拾取语法错误。所以我在这里摸不着头脑。我究竟做错了什么?我希望这段代码足以理解这个问题,但是如果你想要完整的代码,我可以提供它。

2 个答案:

答案 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);