10

我有一个JMenuItem带有一个的ActionListener,在这个ActionListener我想添加一个GridBagLayout到我的frame(可能有也可能没有一个内容窗格尚未添加 - 出于测试目的它没有),然后添加components到那个frame。on it 的设计是frame works自己的,但我想triggerActionListeneron aJMenuItem开始,这就是我遇到问题的地方。它不会从ActionListener. 我已经尝试从 AL 类中的不同方法运行相同的代码,但这也不起作用。

ActionListener当我完全注释掉时,JLabel我想测试的将添加到GBL正确的位置,以及系统prints我的debugherehere2。没有语法错误被compiler. 这会产生所需的结果,并打印标签。(请参阅下面的图片,了解当我完全注释掉 AL 时会发生什么。)有问题的代码片段(在哪个框架中是 my JFrame)如下:

在此处输入图像描述

// (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.)

现在,当我运行此代码时,我仍然可以打印“here”和“here2”的调试行,因此它告诉我 ActionListener 运行良好。但是标签没有出现。编译器仍然没有发现语法错误。所以我在这里挠头。我究竟做错了什么?我希望这段代码片段足以理解问题,但如果你想要完整的代码,我可以提供。

4

2 回答 2

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

以获得更好的代码风格。

于 2013-02-15T01:46:12.533 回答
0

查看调用方法 pane.add(sc1.speciesL); 时发生了什么

Container.add(sc1.speciesL, null, -1) 接下来调用

然后 Container.addImpl( Component comp, Object constraints, int index )

然后是 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);

并删除无用的

gbl.setConstraints(sc1.speciesL, gbc);
于 2012-11-16T14:28:58.660 回答