1

コンボボックスが表示されない理由を誰かが教えてくれますか? 私はコントローラーを持っています:

public class TestController extends JPanel {

TestView cgView;

public TestController() 
{

    setLayout(null);

    cgView=new TestView();

    add(cgView);

}
public static void main(String[] args) {
    SwingUtilities.invokeLater(new Runnable() {
        public void run() {
             JFrame fr = new JFrame("testt");
                fr.setSize(1200,1000);
                fr.setResizable(false);

                TestController cgc=new TestController();
                fr.setBackground(Color.white);
                fr.setVisible(true);

                fr.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
                fr.add(cgc);

         }
        });
    }


}

そして、ビュー

public class TestView extends JPanel{
    private static final long serialVersionUID = 1L;

    public JComboBox<String> comboBox; 

    public TestView() {

          comboBox= new JComboBox<>(new String[] {"option1", "option2" });
          comboBox.setBounds(100,500, 100, 20);
          add(comboBox);

    }
}

TestController のsetLayout(null)のため、 comboBoxが表示されません。add(cgView.comboBox)を TestContoller()に追加すると、次のようになります。

public TestController() 
    {

        setLayout(null);

        cgView=new TestView();

        add(cgView);
        add(cgView.comboBox);

    }

私がそれを見ることができるよりも。誰かが理由を教えてもらえますか?

したがって、私の解決策は、常に TestController にコンポーネントを追加するか、TestController を属性として TestView に渡すことです (したがって、TestView() では、このように追加します this.parentPanel.add(comboBox)。他の解決策はありますか?

4

1 に答える 1

3
  • ほとんどの場合、null レイアウトを使用しないでください
  • 代わりに、JPanels にネストされたレイアウトの最適な組み合わせを使用して、GUI の快適なレイアウトを実現してください。
  • null レイアウトを使用する場合は、そのコンテナーに追加されるすべてのコンポーネントのサイズと場所を設定する責任があります。
  • あなたの現在の問題は、TestView にサイズや場所を与えず、null レイアウトを使用するコンテナーに追加したことです。
  • コンポーネント (上記の JComboBox) を複数のコンテナーに追加しないでください。
  • すべてのコンポーネントを追加して呼び出すsetVisible(true)までは、JFrameを呼び出さないでください。pack()

例えば、

import java.awt.*;
import javax.swing.*;

public class TestController extends JPanel {
   private static final int PREF_W = 1000;
   private static final int PREF_H = 800;
   TestView cgView;

   public TestController() {
      setLayout(null);
      cgView = new TestView();
      cgView.setSize(getPreferredSize());
      add(cgView);
   }

   @Override
   public Dimension getPreferredSize() {
      return new Dimension(PREF_W, PREF_H);
   }

   public static void main(String[] args) {
      SwingUtilities.invokeLater(new Runnable() {
         public void run() {
            JFrame fr = new JFrame("testt");
            // fr.setSize(1200, 1000);
            fr.setResizable(false);
            TestController cgc = new TestController();
            fr.setBackground(Color.white);
            // fr.setVisible(true);
            fr.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
            fr.add(cgc);
            fr.pack(); //!! added 
            fr.setVisible(true); // !! moved
         }
      });
   }
}

ただし、レイアウトを使用する方がよいでしょう:

import java.awt.*;
import javax.swing.*;

public class TestController extends JPanel {
   private static final int PREF_W = 1000;
   private static final int PREF_H = 800;
   TestView cgView;

   public TestController() {
      //!!  setLayout(null);
      cgView = new TestView();
      //!! cgView.setSize(getPreferredSize());
      add(cgView);
   }

   @Override
   public Dimension getPreferredSize() {
      return new Dimension(PREF_W, PREF_H);
   }

   public static void main(String[] args) {
      SwingUtilities.invokeLater(new Runnable() {
         public void run() {
            JFrame fr = new JFrame("testt");
            // fr.setSize(1200, 1000);
            fr.setResizable(false);
            TestController cgc = new TestController();
            fr.setBackground(Color.white);
            // fr.setVisible(true);
            fr.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
            fr.add(cgc);
            fr.pack(); //!! added 
            fr.setVisible(true); // !! moved
         }
      });
   }
}

class TestView extends JPanel {
   private static final long serialVersionUID = 1L;
   public JComboBox<String> comboBox;

   public TestView() {
      comboBox = new JComboBox<String>(new String[] { "option1", "option2" });
      // comboBox.setBounds(100, 500, 100, 20);
      add(comboBox);
   }
}


OPがコメントで尋ねた編集:

'ほとんどは決してない'?どのような場合に [ヌル レイアウト] を使用しますか?

アニメーションや MouseListener を使用してコンポーネントを移動する場合など、私はめったに使用しませんが、それでも多くの人が、Rob Camick のDrag Layoutのように、それを処理する独自のレイアウトを作成することを提案しています。

于 2012-12-06T18:02:04.067 に答える