0

以下のコードでは、JPanel が JFrame エクステンションに追加されていない場合、プログラムは正常に動作しますが、JPanel をコメントアウトして GridLayout を使用すると、すべてが適切かつ適切に JFrame に配置されます。JPanel がオブジェクトを表示する方法にいくつかの制限がありますか? コードでは、次のステートメントをコメントアウトしました。

  this.setLayout(new GridLayout(3,2));
   this.add(nameLabel);
   this.add(name);
   this.add(urlLabel);
   this.add(url);
   this.add(typeLabel);
   this.add(type);

プログラムは間違って表示されますが、上記のステートメントがコメント解除され、下のステートメントがコメントされている場合:

   //add some panes..
    JPanel panel = new JPanel();
    panel.add(nameLabel);
    panel.add(name);
    panel.add(urlLabel);
    panel.add(url);
    panel.add(typeLabel);
    panel.add(type);
    this.add(panel);

、その後、プログラムは正常に動作します。以下は完全なコードの抜粋です。

[CODE]

public class FeedInfo extends JFrame {
  private JLabel nameLabel = new JLabel("Name:", SwingConstants.RIGHT);
  private JTextField name;
  private JLabel urlLabel = new JLabel("URL",SwingConstants.RIGHT);
  private JTextField url;
  private JLabel typeLabel = new JLabel("Type",SwingConstants.RIGHT);
  private JTextField type;


   public FeedInfo()
      {
         super("Feed Information");
         this.setSize(400,105);
         this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

         String response1 = JOptionPane.showInputDialog(null,"Enter the site name:");
         name = new JTextField(response1,20);
         String response2 = JOptionPane.showInputDialog(null,"Enter the site address:");
         url = new JTextField(response2, 20);

         String[] choices ={"Personal","Commercial","Unkown"};
         int response3 = JOptionPane.showOptionDialog(null, "what type of site is it?",
           "site Type",0, JOptionPane.QUESTION_MESSAGE, null, choices, choices[0]);

        type = new JTextField(choices[response3],20);
        //add some panes..
        JPanel panel = new JPanel();
        panel.add(nameLabel);
        panel.add(name);
        panel.add(urlLabel);
        panel.add(url);
        panel.add(typeLabel);
        panel.add(type);
        this.add(panel);


        /*this.setLayout(new GridLayout(3,2));
       this.add(nameLabel);
       this.add(name);
       this.add(urlLabel);
       this.add(url);
       this.add(typeLabel);
       this.add(type);
       */

       this.setVisible(true);

    }
[/CODE]
4

4 に答える 4

3

JPanelはそれ自体でレイアウトを実行せず、LayoutManager. あなたの場合、デフォルトをオーバーライドしてFlowLayout使用したいGridLayout(あなたがしたようにJFrame)。だからそうしなさい!

JPanel panel = new JPanel(new GridLayout(3, 2));
...
于 2012-03-26T15:10:21.593 に答える
2
JPanel panel = new JPanel();
        panel.add(nameLabel);
        panel.add(name);
        panel.add(urlLabel);
        panel.add(url);
        panel.add(typeLabel);
        panel.add(type);
        this.add(panel);

これを行うときは、JPanelをJFrameに追加しますが、JFrameのレイアウトは変更されません。つまり、デフォルトでBorderLayoutがあります。最後の行を次のように変更してみてくださいadd(panel, BorderLayout.CENTER); 。JFrameの詳細については、こちらをご覧ください。

また、JPanelにはデフォルトでFlowLayoutがあります。これは、オブジェクトが「フローライン」に追加されることを意味します。目的の結果を得るには、JPanelでレイアウトを設定する必要があります。

于 2012-03-26T15:14:20.170 に答える
2

あなたのプログラムは、コードの 2 番目のセクションで期待どおりに動作していません。

JPanel panel = new JPanel();

デフォルトでは、この行で、JPanel API からわかるように、レイアウトが の JPanel を作成していますFlowLayoutJPanel APIは、空のコンストラクターについて次のように報告します。

JPanel() 
Creates a new JPanel with a double buffer and a flow layout.

一般に、フロー レイアウトは JPanel の最も単純なレイアウトであり、理解しやすく簡単な方法で Swing コンテンツをロードすることはできません。使用している GridLayout は、コンポーネントをグリッドにロードする機能を提供します。これは、Java アプリケーションの GUI を表示するのに適しています。

これで、GridLayout を使用している場合、コードの最初のセクションのように、基本的な FlowLayout を使用するプログラムがすべての swing コンポーネントを期待どおりに表示しないことがわかります。GridLayout を使用して JPanel を作成する場合は、次のように入力します。

JPanel panel = new JPanel(new GridLayout(3, 2));

このページとここには JPanel とレイアウトに関するチュートリアルがいくつかあります。

于 2012-03-26T15:38:10.270 に答える
1

知っておくべき2つの重要な事実があります。JFrameはデフォルトでBorderLayoutを使用します。JPanelはデフォルトでFlowlayoutを使用します。これが、他のコンポーネントを追加するコンポーネントに応じて異なる動作が見られる理由です。

FlowLayoutはほとんど価値がないため、JPanelを使用する場合は、ほとんどの場合、変更する必要があります。@Mark Petersは、上記の方法を示しています。BorderLayoutは、ほとんどの場合、トップレベルのコンテナに使用するのに最適であり、私がそれを変更することはめったにありません。私はネストされたJPanelsにBoxLayoutをほぼ独占的に使用する傾向があります。

于 2012-03-26T15:32:25.147 に答える