1

グリッド バッグ レイアウトを使用して、次のようなレイアウトを作成しています。 ここに画像の説明を入力

しかし、私が持っているのはこれです: ここに画像の説明を入力

なぜこうなった?左揃えを指定し、すべての水平方向のスペースを占めるようにしましたが、それでもこれで終わりです。これが私のコードです:

public DepotView()
{
    setSize(FRAME_WIDTH,FRAME_HEIGHT);
    setLocationRelativeTo ( null );

    getContentPane ().setLayout ( new GridBagLayout());

    JPanel workerPanel = createTextAreaPanel("Processing: ",workerArea);
    GridBagConstraints c = new GridBagConstraints();
    c.gridx = 0;
    c.gridy = 0;
    c.gridwidth = 2;
    c.gridheight = 1;
    c.weightx = 1;
    c.fill = GridBagConstraints.HORIZONTAL;
    c.anchor = GridBagConstraints.FIRST_LINE_START;
    getContentPane().add ( workerPanel );


    JPanel customerPanel = createTextAreaPanel("Customers: ",textArea);
    c = new GridBagConstraints();
    c.gridx = 0;
    c.gridy = 1;
    c.gridwidth = 1;
    c.gridheight = 1;
    c.weightx = 0.5;
    c.insets = new Insets(5,5,5,5);
    getContentPane().add ( customerPanel );

    JPanel depotPanel = createTextAreaPanel("Depot: ",depotArea);
    c = new GridBagConstraints();
    c.gridx = 1;
    c.gridy = 1;
    c.gridwidth = 1;
    c.gridheight = 1;
    c.weightx = 0.5;
    c.insets = new Insets(5,5,5,5);
    getContentPane().add ( depotPanel );


    //pack();
    setDefaultCloseOperation ( JFrame.EXIT_ON_CLOSE );
4

3 に答える 3

4

問題は、フレームのサイズがコンテンツ ペインの推奨サイズの合計よりも小さいことです。そこから、ねじれたレイアウトが得られます。

さらにいくつかのこと:

  • JFramepack()の代わりに使用して、適切なフレーム サイズを取得します。setSize()
  • を使用しないでくださいgridx/gridy。制約が複雑になり、保守が難しくなる傾向があります。
  • anchor/fillほとんどの場合、0weightxと組み合わせるかweighty、0 より大きい必要があります。
  • デフォルトFlowLayoutのを使用する代わりにJPanel、追加の利用可能なスペースを利用する LayoutManager を使用します (例: BorderLayout)
  • static変数を使用しないでください、それはただの悪です
  • テキストエリア変数は常に空です。

これは、非常にうまく機能するように見えるコードの一部です。

import java.awt.BorderLayout;
import java.awt.Font;
import java.awt.GridBagConstraints;
import java.awt.GridBagLayout;
import java.awt.Insets;

import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.JScrollPane;
import javax.swing.JTextArea;
import javax.swing.SwingUtilities;

public class DepotView extends JFrame {

    private JTextArea textArea;
    private JTextArea depotArea;
    private JTextArea workerArea;

    public DepotView() {

        getContentPane().setLayout(new GridBagLayout());

        JPanel workerPanel = createTextAreaPanel("Processing: ", workerArea = new JTextArea());
        GridBagConstraints c = new GridBagConstraints();
        c.gridwidth = GridBagConstraints.REMAINDER;
        c.weightx = 1.0;
        c.weighty = 1.0;
        c.fill = GridBagConstraints.BOTH;
        c.anchor = GridBagConstraints.FIRST_LINE_START;
        getContentPane().add(workerPanel, c);

        JPanel customerPanel = createTextAreaPanel("Customers: ", textArea = new JTextArea());
        c = new GridBagConstraints();
        c.insets = new Insets(5, 5, 5, 5);
        c.fill = GridBagConstraints.BOTH;
        c.weightx = 1.0;
        c.weighty = 1.0;
        c.anchor = GridBagConstraints.FIRST_LINE_START;
        getContentPane().add(customerPanel, c);

        JPanel depotPanel = createTextAreaPanel("Depot: ", depotArea = new JTextArea());
        c = new GridBagConstraints();
        c.weightx = 1.0;
        c.weighty = 1.0;
        c.gridwidth = GridBagConstraints.REMAINDER;
        c.insets = new Insets(5, 5, 5, 5);
        c.fill = GridBagConstraints.BOTH;
        getContentPane().add(depotPanel, c);

        setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        pack();
        setLocationRelativeTo(null);
    }

    private JPanel createTextAreaPanel(String label, JTextArea textArea) {
        JPanel customerQueuePanel = new JPanel(new BorderLayout());

        customerQueuePanel.add(new JLabel(label), BorderLayout.NORTH);
        textArea.setRows(15);
        textArea.setColumns(20);
        textArea.setFont(new Font(Font.MONOSPACED, Font.PLAIN, 14));
        textArea.setEditable(false);

        JScrollPane scrollPane = new JScrollPane(textArea);
        customerQueuePanel.add(scrollPane);
        return customerQueuePanel;
    }

    public static void main(String[] args) {
        SwingUtilities.invokeLater(new Runnable() {
            @Override
            public void run() {
                new DepotView().setVisible(true);
            }
        });
    }

}
于 2013-03-20T13:41:37.053 に答える
2

GridBadConstriantsパネルをフレームに追加するときに、を含めるのを忘れたようです。に変更getContentPane().add(panel);するだけgetContentPane().add(panel, c);で、機能するはずです。

于 2013-03-20T13:19:11.747 に答える
0

のレイアウトがJPanel正しく定義されていません。あなたは現在JPanelの default layoutを使用していますFlowLayoutが、これはあなたの場合には不適切な選択です。

  • コンテナーのサイズに合わせてコンポーネントのサイズを変更することはありません ( JPanel)。
  • のサイズに応じてJPanel、ラベルの横にテキストが配置されます。

最良の選択は、おそらく を使用することBorderLayoutです。

の最小サイズも設定しますJPanel

JPanel customerQueuePanel = new JPanel(new BorderLayout());
customerQueuePanel.setMinimumSize(new Dimension(250, 150));
...
customerQueuePanel.add ( new JLabel(label), BorderLayout.NORTH);
customerQueuePanel.add( scrollPane, BorderLayout.CENTER); 

編集: 上記のコードは、質問から削除した createTextArea メソッドの編集です。

また、前に行ったように、制約をパラメーターとして追加します。

getContentPane().add(panel, c);
于 2013-03-20T13:24:39.727 に答える