10

私はとを持っています、JMenuItemこれActionListenerActionListener私は自分にを追加したいと思いGridBagLayoutますframe(コンテンツペインがまだ追加されている場合とされていない場合があります-テスト目的では追加されていません)そしてそれに追加componentsframeます。それ自体のデザインですが、私はそれを上からframe worksやりたいと思っています。ここで問題が発生しています。の内側からは表示されません。ALのクラスの別のメソッドから同じコードを実行しようとしましたが、どちらも機能しませんでした。triggerActionListenerJMenuItemActionListener

ActionListener完全にコメントアウトすると、JLabelテストしたいGBLのは正しい場所に追加され、システムはこことここにprints私のdebug行が追加されます2。構文エラーは。によって検出されません。これにより、目的の結果が得られ、ラベルが印刷されます。(ALを完全にコメントアウトするとどうなるかについては、以下を参照してください。)問題のコードのスニペット(フレームは私の)は次のとおりです。compilerJFrame

ここに画像の説明を入力してください

// (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( コンポーネント comp, オブジェクト制約, int index )

次に、gbl.setConstraints(sc1.speciesL, gbc); によって前に設定した制約。nullに置き換えられました。

  if (layoutMgr instanceof LayoutManager2) {
    ((LayoutManager2)layoutMgr).addLayoutComponent(comp, constraints);
  }

次に、GridBagConstraints が現在 null であるため、パネルに新しく追加されたコンポーネントが表示されませんでした

そして、あなたは実際に強制する必要はありません

  frame.revalidate();
  frame.repaint();
  frame.pack();

適切な方法でコンテナに新しいコンポーネントを適切に追加するために必要なのは次のとおりです。

pane.add(sc1.speciesL, gbc);

そして無駄を取り除く

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