0

Java JPanels に問題があります。レイアウトが異なる2つのJPanelを、レイアウトもある1つのJPanelに入れたいと思います。それを機能させることさえ可能ですか?

    BibP()
setLayout(new GridLayout(5, 1)); //The big JPanel
add(new A(), new FlowLayout(4));
add(new B(), new GridLayout(7,2));    

A と B はどちらも JPanels として拡張されたクラスであり、何を変更したりコメントしたりしても、B は常に 1 行に表示されます。A に 4 つの要素を追加し、B に 14 の要素 (JLabels と JTextAreas) を追加しましたが、追加といくつかの計算だけでコードはあまりありません。

問題は、大きな JPanel を配置しようとしている JFrame にある可能性があります。

    JFrame.this.add(new BigP(),BorderLayout.CENTER);    

編集:

    public class BigP extends JPanel{
//Labels and TextAres

public class A extends JPanel{
    public A(){
        setBorder(new EmptyBorder(0, -50, 0, 0));
        //get date and add to textareas
        //add the label and textareas
}
}

public class B extends JPanel{
    public B (){
        setBorder(new EmptyBorder(0, -50, 0, 0));
        setBackground(Color.red);
        //colum longs for text areas less then 5
        //add labels and textareas
    }
}

public BigP(){
    setLayout(new GridLayout(5, 1));
    setBorder(new EmptyBorder(3,-160,0,0));

    add(new A(), new FlowLayout(4));
    add(new B(), new GridLayout(7,2));
}
}    

助けてくれてありがとう。

数回試した後:

私がこれを使用した場合:

    add(new B(), new GridLayout(7,2));

レイアウトを印刷すると、Bでこれが得られます。

java.awt.FlowLayout[hgap=5,vgap=5,align=center]

Bでレイアウトを設定した場合:

    setLayout(new GridLayout(7, 2));

情報は正しいです:

java.awt.GridLayout[hgap=0,vgap=0,rows=7,cols=2]

しかし、14 個の要素があるはずの JTextAreas が 2 つしか表示されていません。

4

2 に答える 2

1

それを機能させることさえ可能ですか?

はい、一般的に複合レイアウトとして知られています。

あなたが抱えている問題はLayout、現在のコンテナレイアウトマネージャーへの制約として s を提供しようとしていることです(あなたの場合、幸運なことに何も期待していませんでした)...

代わりに、レイアウト マネージャーを子パネルに直接指定します...次のように...

setLayout(new GridLayout(5, 1)); //The big JPanel

JPanel a = new JPanel(new FlowLayout(4));
JPanel b = new JPanel(new GridLayout(7,2));
add(a);
add(b); 

詳細については、コンテナ内のコンポーネントのレイアウトをご覧ください...

例で更新

ラベルをプレースホルダーとして使用する、単純な実行可能な例。

ここに画像の説明を入力

import java.awt.Color;
import java.awt.EventQueue;
import java.awt.FlowLayout;
import java.awt.GridLayout;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.UIManager;
import javax.swing.UnsupportedLookAndFeelException;
import javax.swing.border.LineBorder;

public class ExampleLayout {

  public static void main(String[] args) {
    new ExampleLayout();
  }

  public ExampleLayout() {
    EventQueue.invokeLater(new Runnable() {
      @Override
      public void run() {
        try {
          UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName());
        } catch (ClassNotFoundException | InstantiationException | IllegalAccessException | UnsupportedLookAndFeelException ex) {
          ex.printStackTrace();
        }

        JPanel mainPane = new JPanel(new GridLayout(5, 1));
        mainPane.add(new APanel());
        mainPane.add(new BPanel());

        JFrame frame = new JFrame("Testing");
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        frame.add(mainPane);
        frame.pack();
        frame.setLocationRelativeTo(null);
        frame.setVisible(true);
      }
    });
  }

  public class APanel extends JPanel {

    public APanel() {
      setLayout(new FlowLayout(4));
      for (int index = 0; index < 4; index++) {
        add(new JLabel(Integer.toString(index)));
      }
      setBorder(new LineBorder(Color.RED));
    }

  }

  public class BPanel extends JPanel {

    public BPanel() {
      setLayout(new GridLayout(7, 2));
      for (int index = 0; index < 14; index++) {
        add(new JLabel(Integer.toString(index)));
      }
      setBorder(new LineBorder(Color.BLUE));
    }

  }

}

これsetBorder(new EmptyBorder(3,-160,0,0));も間違っているようです。 EmptyBorder負の値を持つべきではありません

于 2013-08-13T06:55:34.890 に答える
0
 Is it even possible to make it work?

はい、これを行うことは可能です。次の行で

JFrame.this.add(new BigP(),BorderLayout.CENTER);  

することをお勧めします

mainFrame.getContentPane.add(new BigP());

この前にメインフレームのレイアウトを設定します

mainFrame.setLayout(new GridLayout(5, 1));
于 2013-08-13T06:57:49.973 に答える