2

私はパネルを設計していて、このパネルを次のOptionPane Confirm Dialogように使用しています。

JOptionPane.showConfirmDialog(null, slaveGroupPanel, messages.getString("centrum.manageGroups"), JOptionPane.OK_CANCEL_OPTION);

私のグリッドバッグの制約は次のとおりです。

    addGroupButton.setText(messages.getString("centrum.slavegroup.add"));
    gridBagConstraints = new java.awt.GridBagConstraints();
    gridBagConstraints.gridx = 6;
    gridBagConstraints.gridy = 0;
    gridBagConstraints.anchor = java.awt.GridBagConstraints.EAST;
    add(addGroupButton, gridBagConstraints);

    gridBagConstraints = new java.awt.GridBagConstraints();
    gridBagConstraints.gridx = 1;
    gridBagConstraints.gridy = 0;
    gridBagConstraints.gridwidth = 5;
    gridBagConstraints.fill = java.awt.GridBagConstraints.HORIZONTAL;
    gridBagConstraints.weightx = 1.0;
    add(addGroupTextField, gridBagConstraints);

    gridBagConstraints = new java.awt.GridBagConstraints();
    gridBagConstraints.gridx = 0;
    gridBagConstraints.gridy = 0;
    gridBagConstraints.gridwidth = 1;
    gridBagConstraints.fill = java.awt.GridBagConstraints.HORIZONTAL;
    add(groupNameLabel, gridBagConstraints);

    groupComboBox.setModel(new DefaultComboBoxModel(slaveGroupHash.keySet().toArray() ));
    gridBagConstraints = new java.awt.GridBagConstraints();
    gridBagConstraints.gridx = 0;
    gridBagConstraints.gridy = 1;
    gridBagConstraints.gridwidth = 5;
    gridBagConstraints.fill = java.awt.GridBagConstraints.HORIZONTAL;
    gridBagConstraints.anchor = java.awt.GridBagConstraints.EAST;
    gridBagConstraints.weightx = 1;
    add(groupComboBox, gridBagConstraints);

    allSlavesList.setModel(new DefaultListModel());

    for (int i = 0; i < allSlaves.length; i++) {
        ((DefaultListModel)allSlavesList.getModel()).addElement(allSlaves[i]);
    }

    allSlavesList.setVisibleRowCount(4);
    jScrollPane2.setViewportView(allSlavesList);
    jScrollPane2.setHorizontalScrollBarPolicy(JScrollPane.HORIZONTAL_SCROLLBAR_NEVER);


    gridBagConstraints = new java.awt.GridBagConstraints();
    gridBagConstraints.gridx = 0;
    gridBagConstraints.gridy = 3;
    gridBagConstraints.gridwidth = 3;
    gridBagConstraints.gridheight = 2;
    gridBagConstraints.fill = java.awt.GridBagConstraints.BOTH;
    gridBagConstraints.weightx = 0.45;
    gridBagConstraints.weighty = 1.0;
    add(jScrollPane2, gridBagConstraints);

    slavesInGroupList.setModel(new DefaultListModel());
    slavesInGroupList.setVisibleRowCount(4);
    jScrollPane3.setViewportView(slavesInGroupList);
    jScrollPane3.setHorizontalScrollBarPolicy(JScrollPane.HORIZONTAL_SCROLLBAR_NEVER);

    gridBagConstraints = new java.awt.GridBagConstraints();
    gridBagConstraints.gridx = 4;
    gridBagConstraints.gridy = 3;
    gridBagConstraints.gridwidth = 3;
    gridBagConstraints.gridheight = 2;
    gridBagConstraints.fill = java.awt.GridBagConstraints.BOTH;
    gridBagConstraints.weightx = 0.45;
    gridBagConstraints.weighty = 1.0;
    add(jScrollPane3, gridBagConstraints);

    gridBagConstraints = new java.awt.GridBagConstraints();
    gridBagConstraints.gridx = 0;
    gridBagConstraints.gridy = 2;
    gridBagConstraints.fill = GridBagConstraints.HORIZONTAL;
    add(allSlavesLabel, gridBagConstraints);

    gridBagConstraints = new java.awt.GridBagConstraints();
    gridBagConstraints.gridx = 4;
    gridBagConstraints.gridy = 2;
    gridBagConstraints.fill = GridBagConstraints.HORIZONTAL;
    add(slavesInGroupLabel, gridBagConstraints);

    addSlaveButton.setIcon(GeneralObjects.getrightIcon());
    gridBagConstraints = new java.awt.GridBagConstraints();
    gridBagConstraints.gridx = 3;
    gridBagConstraints.gridy = 3;
    gridBagConstraints.weightx = 0.1;
    gridBagConstraints.weighty = 1.0;
    add(addSlaveButton, gridBagConstraints);

    deleteSlaveButton.setIcon(GeneralObjects.getleftIcon());
    gridBagConstraints = new java.awt.GridBagConstraints();
    gridBagConstraints.gridx = 3;
    gridBagConstraints.gridy = 4;
    gridBagConstraints.weightx = 0.1;
    gridBagConstraints.weighty = 1.0;
    add(deleteSlaveButton, gridBagConstraints);

    renameButton.setText(messages.getString("centrum.slavegroup.rename"));

    gridBagConstraints = new java.awt.GridBagConstraints();
    gridBagConstraints.gridx = 6;
    gridBagConstraints.gridy = 1;
    gridBagConstraints.anchor = java.awt.GridBagConstraints.EAST;
    add(renameButton, gridBagConstraints);

    deleteButton.setText(messages.getString("centrum.slavegroup.delete"));
    gridBagConstraints = new java.awt.GridBagConstraints();
    gridBagConstraints.gridx = 5;
    gridBagConstraints.gridy = 1;
    gridBagConstraints.anchor = java.awt.GridBagConstraints.EAST;
    add(deleteButton, gridBagConstraints);

ただし、添付のスクリーンショットでわかるように、テキストフィールドと追加ボタンの間には2つのギャップがあります。また、削除ボタンと名前変更ボタンの間にギャップが発生します。しかし、私はそれらのギャップを望んでいません。weightx = 1;インセットを定義しておらず、コンボボックスのテキストフィールドもあるfill = java.awt.GridBagConstraints.HORIZONTAL;ので、ギャップなしで可能な限り水平方向に拡張することを期待しています。しかし、なぜそれらのギャップが発生するのでしょうか?

次に、右側のJlistが左側のJlistよりも幅が広いことがはっきりとわかります。ただし、両方のJList(実際にはJListを含むScrollPanes)にはgridwidthweightxfillパラメーターが同じ値に設定されています。ですから、同じサイズになると思います。何かが足りないようです。

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

SSCCEは以下に追加されます。

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

public class SSCCE {

private javax.swing.JButton addGroupButton;
private javax.swing.JTextField addGroupTextField;
private javax.swing.JButton addSlaveButton;
private javax.swing.JList allSlavesList;
private javax.swing.JButton deleteButton;
private javax.swing.JButton deleteSlaveButton;
private javax.swing.JComboBox groupComboBox;
private javax.swing.JScrollPane jScrollPane2;
private javax.swing.JScrollPane jScrollPane3;
private javax.swing.JButton renameButton;
private javax.swing.JLabel groupNameLabel;
private javax.swing.JLabel allSlavesLabel;
private javax.swing.JLabel slavesInGroupLabel;
private javax.swing.JList slavesInGroupList;

public SSCCE() {

}

public JPanel createPanel(){
    JPanel panel = new JPanel();
    panel.setLayout(new java.awt.GridBagLayout());


    addGroupButton=new javax.swing.JButton();
    addGroupTextField=new javax.swing.JTextField();
    addSlaveButton=new javax.swing.JButton();
    allSlavesList=new javax.swing.JList();
    deleteButton=new javax.swing.JButton();
    deleteSlaveButton=new javax.swing.JButton();
    groupComboBox=new javax.swing.JComboBox();
    jScrollPane2=new javax.swing.JScrollPane();
    jScrollPane3=new javax.swing.JScrollPane();
    renameButton=new javax.swing.JButton();
    groupNameLabel=new javax.swing.JLabel();
    allSlavesLabel=new javax.swing.JLabel();
    slavesInGroupLabel=new javax.swing.JLabel();
    slavesInGroupList=new javax.swing.JList();

    allSlavesList.setModel(new DefaultListModel());
    slavesInGroupList.setModel(new DefaultListModel());



    GridBagConstraints gridBagConstraints;

    addGroupButton.setText("add");
    gridBagConstraints = new java.awt.GridBagConstraints();
    gridBagConstraints.gridx = 6;
    gridBagConstraints.gridy = 0;
    gridBagConstraints.anchor = java.awt.GridBagConstraints.EAST;
    panel.add(addGroupButton, gridBagConstraints);

    gridBagConstraints = new java.awt.GridBagConstraints();
    gridBagConstraints.gridx = 1;
    gridBagConstraints.gridy = 0;
    gridBagConstraints.gridwidth = 5;
    gridBagConstraints.fill = java.awt.GridBagConstraints.HORIZONTAL;
    gridBagConstraints.weightx = 1.0;
    panel.add(addGroupTextField, gridBagConstraints);

    gridBagConstraints = new java.awt.GridBagConstraints();
    gridBagConstraints.gridx = 0;
    gridBagConstraints.gridy = 0;
    gridBagConstraints.gridwidth = 1;
    gridBagConstraints.fill = java.awt.GridBagConstraints.HORIZONTAL;
    panel.add(groupNameLabel, gridBagConstraints);

    groupComboBox.setModel(new DefaultComboBoxModel(new Object[]{"one","two","three"}));
    gridBagConstraints = new java.awt.GridBagConstraints();
    gridBagConstraints.gridx = 0;
    gridBagConstraints.gridy = 1;
    gridBagConstraints.gridwidth = 5;
    gridBagConstraints.fill = java.awt.GridBagConstraints.HORIZONTAL;
    gridBagConstraints.anchor = java.awt.GridBagConstraints.EAST;
    gridBagConstraints.weightx = 1;
    panel.add(groupComboBox, gridBagConstraints);



    allSlavesList.setVisibleRowCount(4);
    jScrollPane2.setViewportView(allSlavesList);
    jScrollPane2.setHorizontalScrollBarPolicy(JScrollPane.HORIZONTAL_SCROLLBAR_NEVER);


    gridBagConstraints = new java.awt.GridBagConstraints();
    gridBagConstraints.gridx = 0;
    gridBagConstraints.gridy = 3;
    gridBagConstraints.gridwidth = 3;
    gridBagConstraints.gridheight = 2;
    gridBagConstraints.fill = java.awt.GridBagConstraints.BOTH;
    gridBagConstraints.weightx = 0.45;
    gridBagConstraints.weighty = 1.0;
    panel.add(jScrollPane2, gridBagConstraints);

    slavesInGroupList.setVisibleRowCount(4);
    jScrollPane3.setViewportView(slavesInGroupList);
    jScrollPane3.setHorizontalScrollBarPolicy(JScrollPane.HORIZONTAL_SCROLLBAR_NEVER);

    gridBagConstraints = new java.awt.GridBagConstraints();
    gridBagConstraints.gridx = 4;
    gridBagConstraints.gridy = 3;
    gridBagConstraints.gridwidth = 3;
    gridBagConstraints.gridheight = 2;
    gridBagConstraints.fill = java.awt.GridBagConstraints.BOTH;
    gridBagConstraints.weightx = 0.45;
    gridBagConstraints.weighty = 1.0;
    panel.add(jScrollPane3, gridBagConstraints);

    gridBagConstraints = new java.awt.GridBagConstraints();
    gridBagConstraints.gridx = 0;
    gridBagConstraints.gridy = 2;
    gridBagConstraints.fill = GridBagConstraints.HORIZONTAL;
    panel.add(allSlavesLabel, gridBagConstraints);

    gridBagConstraints = new java.awt.GridBagConstraints();
    gridBagConstraints.gridx = 4;
    gridBagConstraints.gridy = 2;
    gridBagConstraints.fill = GridBagConstraints.HORIZONTAL;
    panel.add(slavesInGroupLabel, gridBagConstraints);

    //addSlaveButton.setIcon(GeneralObjects.getrightIcon());
    gridBagConstraints = new java.awt.GridBagConstraints();
    gridBagConstraints.gridx = 3;
    gridBagConstraints.gridy = 3;
    gridBagConstraints.weightx = 0.1;
    gridBagConstraints.weighty = 1.0;
    panel.add(addSlaveButton, gridBagConstraints);

    //deleteSlaveButton.setIcon(GeneralObjects.getleftIcon());
    gridBagConstraints = new java.awt.GridBagConstraints();
    gridBagConstraints.gridx = 3;
    gridBagConstraints.gridy = 4;
    gridBagConstraints.weightx = 0.1;
    gridBagConstraints.weighty = 1.0;
    panel.add(deleteSlaveButton, gridBagConstraints);

    renameButton.setText("rename");

    gridBagConstraints = new java.awt.GridBagConstraints();
    gridBagConstraints.gridx = 6;
    gridBagConstraints.gridy = 1;
    gridBagConstraints.anchor = java.awt.GridBagConstraints.EAST;
    panel.add(renameButton, gridBagConstraints);

    deleteButton.setText("delete");
    gridBagConstraints = new java.awt.GridBagConstraints();
    gridBagConstraints.gridx = 5;
    gridBagConstraints.gridy = 1;
    gridBagConstraints.anchor = java.awt.GridBagConstraints.EAST;
    panel.add(deleteButton, gridBagConstraints);




    ((DefaultListModel)allSlavesList.getModel()).addElement("one");
    ((DefaultListModel)allSlavesList.getModel()).addElement("two");
    ((DefaultListModel)allSlavesList.getModel()).addElement("three");

    ((DefaultListModel)slavesInGroupList.getModel()).addElement("one");
    ((DefaultListModel)slavesInGroupList.getModel()).addElement("two");
    ((DefaultListModel)slavesInGroupList.getModel()).addElement("three");
    panel.setPreferredSize(new Dimension(600,300));


    return panel;

}

public static void main(String[] args){
    SSCCE a = new SSCCE();
    JOptionPane.showConfirmDialog(null, a.createPanel(), "centrum.manageGroups", JOptionPane.OK_CANCEL_OPTION);
}


}
4

1 に答える 1

2

フラットレイアウトではそのようなレイアウトを設定できないため、もう少しネストを使用するようにしてください。

あなたの説明から、私はわかります:

  • 3行を含むルートパネル(GridBagLayoutこれを設定し、最後の行にすべての余分な垂直スペースを与えるためにaを使用します)
  • 行1:ラベル、テキストフィールド、ボタン->使用BorderLayout
  • 行2:コンボボックスと2つのボタン->コンボボックスにGridBagLayoutすべての余分なスペースを使用して割り当てます
  • 行3:2つのラベル、2つのリスト、2つのボタン->GridBagLayoutこれを設定するために使用

さて、理解すべきことの1つGridBagLayoutweightx/weighty、それが分配する幅/高さのパーセンテージではなく、「余分な」スペースがどのように分配されるかということです。最初に各コンポーネントに優先サイズを指定し、次に余分なスペースがある場合は、各コンポーネントの重量に応じてそのスペースを分散します。

最後の行の場合、各「列」の幅は、2つのラベルの推奨サイズ(一方が他方よりも明らかに広い)と2つのJListの推奨サイズ(JListのコンテンツに基づく)に基づいています。 。

これがSSCCEの更新です(コードが少し面倒だったので、かなりやり直さなければなりませんでした。順番にやってみて、最初にコンポーネントをセットアップしてから、表示される順序でレイアウトしてください。読みやすい)。

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

import javax.swing.DefaultComboBoxModel;
import javax.swing.DefaultListModel;
import javax.swing.JDialog;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.JScrollPane;
import javax.swing.SwingUtilities;

public class SSCCE {

    private javax.swing.JButton addGroupButton;
    private javax.swing.JTextField addGroupTextField;
    private javax.swing.JButton addSlaveButton;
    private javax.swing.JList allSlavesList;
    private javax.swing.JButton deleteButton;
    private javax.swing.JButton deleteSlaveButton;
    private javax.swing.JComboBox groupComboBox;
    private javax.swing.JScrollPane jScrollPane2;
    private javax.swing.JScrollPane jScrollPane3;
    private javax.swing.JButton renameButton;
    private javax.swing.JLabel allSlavesLabel;
    private javax.swing.JLabel slavesInGroupLabel;
    private javax.swing.JList slavesInGroupList;
    private JLabel groupNameLabel;

    public SSCCE() {

    }

    public JPanel createPanel() {
        JPanel panel = new JPanel();
        panel.setLayout(new java.awt.GridBagLayout());

        addGroupButton = new javax.swing.JButton();
        addGroupTextField = new javax.swing.JTextField();
        addSlaveButton = new javax.swing.JButton();
        allSlavesList = new javax.swing.JList();
        deleteButton = new javax.swing.JButton();
        deleteSlaveButton = new javax.swing.JButton();
        groupComboBox = new javax.swing.JComboBox();
        jScrollPane2 = new javax.swing.JScrollPane();
        jScrollPane3 = new javax.swing.JScrollPane();
        renameButton = new javax.swing.JButton();
        allSlavesLabel = new javax.swing.JLabel("All slaves");
        slavesInGroupLabel = new javax.swing.JLabel("Devices in this group");
        groupNameLabel = new JLabel("Groupd name:");
        slavesInGroupList = new javax.swing.JList();
        groupComboBox.setModel(new DefaultComboBoxModel(new Object[] { "one", "two", "three" }));
        addGroupButton.setText("add");
        allSlavesList.setModel(new DefaultListModel());
        slavesInGroupList.setModel(new DefaultListModel());
        renameButton.setText("rename");
        deleteButton.setText("delete");
        addSlaveButton.setText("->");
        deleteSlaveButton.setText("<-");
        allSlavesList.setVisibleRowCount(4);
        jScrollPane2.setViewportView(allSlavesList);
        jScrollPane2.setHorizontalScrollBarPolicy(JScrollPane.HORIZONTAL_SCROLLBAR_NEVER);
        ((DefaultListModel) allSlavesList.getModel()).addElement("one");
        ((DefaultListModel) allSlavesList.getModel()).addElement("two");
        ((DefaultListModel) allSlavesList.getModel()).addElement("three");

        ((DefaultListModel) slavesInGroupList.getModel()).addElement("one");
        ((DefaultListModel) slavesInGroupList.getModel()).addElement("two");
        ((DefaultListModel) slavesInGroupList.getModel()).addElement("three");
        slavesInGroupList.setVisibleRowCount(4);
        jScrollPane3.setViewportView(slavesInGroupList);
        jScrollPane3.setHorizontalScrollBarPolicy(JScrollPane.HORIZONTAL_SCROLLBAR_NEVER);

        // Let's split your display in 3 rows
        panel = new JPanel(new GridBagLayout());
        JPanel row1 = new JPanel(new BorderLayout(3, 3));
        JPanel row2 = new JPanel(new GridBagLayout());
        JPanel row3 = new JPanel(new GridBagLayout());

        // Use GBL to make three rows and give all extra vertical space to the last one
        GridBagConstraints gbc = new GridBagConstraints();
        gbc.gridwidth = GridBagConstraints.REMAINDER;
        gbc.weightx = 1.0;
        gbc.fill = GridBagConstraints.BOTH;
        gbc.insets = new Insets(3, 3, 3, 3);
        panel.add(row1, gbc);
        panel.add(row2, gbc);
        // Gives all extra v-space to last row
        gbc.weighty = 1.0;
        panel.add(row3, gbc);

        GridBagConstraints gridBagConstraints;

        // Set up row 1
        row1.add(groupNameLabel, BorderLayout.WEST);
        row1.add(addGroupButton, BorderLayout.EAST);
        row1.add(addGroupTextField);// In the middle so that it takes all the width and it won't stretch vertically because row1 has weighty
                                    // set to 0.0

        // Set up row 2
        // We give all extra space to the combo box
        gbc = new java.awt.GridBagConstraints();
        gbc.insets = new Insets(3, 3, 3, 3);
        gbc.fill = java.awt.GridBagConstraints.HORIZONTAL;
        gbc.weightx = 1;
        row2.add(groupComboBox, gbc);
        gbc.weightx = 0;
        row2.add(deleteButton, gbc);
        row2.add(renameButton, gbc);

        // Set up row3
        gbc = new java.awt.GridBagConstraints();
        gbc.insets = new Insets(3, 3, 3, 3);
        gbc.gridx = 0;
        gbc.gridy = 0;
        gbc.weightx = 1.0;
        gbc.anchor = GridBagConstraints.WEST;
        row3.add(allSlavesLabel, gbc);
        gbc.gridx = 2;
        row3.add(slavesInGroupLabel, gbc);

        gbc.weighty = 1.0;
        gbc.weightx = 1.0;
        gbc.gridheight = 2;
        gbc.gridx = 0;
        gbc.gridy = 1;
        gbc.fill = GridBagConstraints.BOTH;

        row3.add(jScrollPane2, gbc);
        gbc.fill = GridBagConstraints.NONE;
        gbc.anchor = GridBagConstraints.CENTER;
        gbc.gridheight = 1;
        gbc.gridx = 1;
        gbc.weightx = 0;
        row3.add(addSlaveButton, gbc);
        gbc.gridy = 2;
        row3.add(deleteSlaveButton, gbc);

        gbc.gridheight = 2;
        gbc.gridx = 2;
        gbc.gridy = 1;
        gbc.fill = GridBagConstraints.BOTH;

        row3.add(jScrollPane3, gbc);

        return panel;

    }

    public static void main(String[] args) {
        SwingUtilities.invokeLater(new Runnable() {
            @Override
            public void run() {
                SSCCE a = new SSCCE();
                JDialog dialog = new JDialog();
                dialog.add(a.createPanel());
                dialog.pack();
                dialog.setLocationRelativeTo(null);
                dialog.setVisible(true);
                // JOptionPane.showConfirmDialog(null, a.createPanel(), "centrum.manageGroups", JOptionPane.OK_CANCEL_OPTION);
            }
        });
    }

}
于 2012-11-29T09:36:34.990 に答える