java – 在ActionListener中添加一个GridBagLayout

前端之家收集整理的这篇文章主要介绍了java – 在ActionListener中添加一个GridBagLayout前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
我有一个带有ActionListener的JMenuItem,在这个ActionListener中,我想添加一个GridBagLayout到我的框架(可能还可能没有添加一个内容窗格 – 为了测试的目的,它不会),然后添加组件到该框架.框架的设计是自己的,但是我想从JMenuItem上的ActionListener触发它,这里是我遇到的问题.它不会从ActionListener内部显示.我尝试从类中的不同方法运行与AL相同的代码,也不工作.

当我完全注释出ActionListener时,我想测试的JLabel在正确的位置增加了GBL,系统在这里和这里打印了我的调试行.编译器没有收到语法错误.这产生了期望的结果,并且打印标签. (当我完全注释掉AL时,请看下面的图像.)有关代码代码片段(在哪个框架是我的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运行正常.但标签不显示.仍然没有由编译器拾取的语法错误.所以我在这边抓我的头我究竟做错了什么?我希望这段代码片段足以理解这个问题,但是如果你想要完整的代码,我可以提供它.

解决方法

提供您使用固定大小的窗口,如果您更换,一切都将工作
frame.revalidate();
frame.repaint();

pane.invalidate();
pane.validate();

要么

pack();

如果您没有固定大小的框架.
请注意,JFrame或Container不支持重新验证.
更好的是更换

gbl.setConstraints(sc1.speciesL,gbc);
pane.add(sc1.speciesL);

pane.add(sc1,gbc);

为了更好的代码风格.

猜你在找的Java相关文章