1

私は JDialog に取り組んでおり (手動で、GUI ビルダーはありません)、レイアウトに問題があります。
私はこれを持っています:
代替テキスト
私の問題は、そのJList(JScrollPane内)に最大幅を持つように伝える方法がわからないことです.setSize、setMaximumSizeを使用しましたが、何も機能しません! JList の幅を画像のサイズの半分にする必要があります。

レイアウトについて説明します。
「遺伝子情報」は GridLayout 2x4 であり、BoxLayout を持つ JPanel に含まれています。+/- JButtons も BoxLayout です。前に述べたことはすべて BoxLayout 内にあります。現在、「Genes」JPanel は GridBagLayout です。

私に何ができる?

前もって感謝します!

PD: 他の境界線は、コンポーネントの境界を確認するためのものです。

Source Code:

scpGenesList.setViewportView(lstGenesList);

pnlGeneInfo.setLayout(new GridLayout(4, 2, 10, 10));
pnlGeneInfo.setBorder(BorderFactory.createCompoundBorder(
        BorderFactory.createTitledBorder("Gene Information"), 
        BorderFactory.createEmptyBorder(10, 10, 10, 10)));
lblGeneSymbol.setText("Symbol:");
lblGeneSymbol.setHorizontalAlignment(SwingConstants.RIGHT);
lblGeneChromosome.setText("Chromosome:");
lblGeneChromosome.setHorizontalAlignment(SwingConstants.RIGHT);
lblGeneStartPosition.setText("Start Position:");
lblGeneStartPosition.setHorizontalAlignment(SwingConstants.RIGHT);
lblGeneStopPosition.setText("Stop Position:");
lblGeneStopPosition.setHorizontalAlignment(SwingConstants.RIGHT);
pnlGeneInfo.add(lblGeneSymbol);
pnlGeneInfo.add(lblGeneSymbolValue);
pnlGeneInfo.add(lblGeneChromosome);
pnlGeneInfo.add(lblGeneChromosomeValue);
pnlGeneInfo.add(lblGeneStartPosition);
pnlGeneInfo.add(lblGeneStartPositionValue);
pnlGeneInfo.add(lblGeneStopPosition);
pnlGeneInfo.add(lblGeneStopPositionValue);

pnlGWASAddRemoveButtons.setLayout(new BoxLayout(pnlGWASAddRemoveButtons, BoxLayout.X_AXIS));
pnlGWASAddRemoveButtons.add(Box.createHorizontalGlue());
pnlGWASAddRemoveButtons.add(cmdGenesAdd);
pnlGWASAddRemoveButtons.add(Box.createHorizontalStrut(10));
pnlGWASAddRemoveButtons.add(cmdGenesRemove);
pnlGWASAddRemoveButtons.add(Box.createHorizontalGlue());

pnlGeneInfoButtons.setLayout(new BoxLayout(pnlGeneInfoButtons, BoxLayout.Y_AXIS));
pnlGeneInfoButtons.add(pnlGeneInfo);
pnlGeneInfoButtons.add(Box.createVerticalStrut(10));
pnlGeneInfoButtons.add(pnlGWASAddRemoveButtons);

pnlGenesPanel.setLayout(new GridBagLayout());
pnlGenesPanel.setBorder(BorderFactory.createCompoundBorder(
        BorderFactory.createTitledBorder("Genes"),
        BorderFactory.createEmptyBorder(10, 10, 10, 10)));

GridBagConstraints ctrGenes = new GridBagConstraints();
ctrGenes.fill = GridBagConstraints.BOTH;
ctrGenes.gridx = 0;
ctrGenes.gridy = 0;
ctrGenes.gridwidth = 1;
ctrGenes.gridheight = 1;
ctrGenes.weighty = 1.0;
ctrGenes.weightx = 1.0;
ctrGenes.insets = new Insets(0, 0, 0, 10);
pnlGenesPanel.add(scpGenesList, ctrGenes);

GridBagConstraints ctrGenesInfoButton = new GridBagConstraints();
ctrGenesInfoButton.fill = GridBagConstraints.BOTH;
ctrGenesInfoButton.gridx = 1;
ctrGenesInfoButton.gridy = 0;
ctrGenesInfoButton.gridwidth = 1;
ctrGenesInfoButton.gridheight = 1;
ctrGenesInfoButton.weighty = 1.0;
ctrGenesInfoButton.weightx = 1.0;
pnlGenesPanel.add(pnlGeneInfoButtons, ctrGenesInfoButton);

contentPane.add(pnlGenesPanel);

pack();

4

7 に答える 7

3

「遺伝子」パネルに 2x1 を付けてみGridLayoutませんか? これにより、両側が同じサイズになることが保証されます。

しかし、実際には、リストにコントロールによって占有されていないすべてのスペースを与える方が理にかなっています。なぜなら、コントロールには一定量のスペースが必要ですが、広いエントリがある場合、取得できるすべての追加スペースからリストが恩恵を受ける可能性があるからです。

そのために、「Genes」パネルBorderLayoutに を指定し、リストを CENTER スロットに、コントロールを EAST スロットに配置します。

于 2011-01-18T19:39:18.723 に答える
2

リストを大きくするという@Michael Borgwardtの提案に従ってsetVisibleRowCount()、便利な初期パネルサイズを作成するために使用できます。必要に応じて、 「行を表示するために必要なビューポートのサイズを計算する」Dimensionによって返されたを調べることもできます。getPreferredScrollableViewportSize()visibleRowCount

于 2011-01-18T21:27:36.350 に答える
1

以前の解決策はすべて有効だと思います。どのレイアウト マネージャーを使用するかという点では、コーディングの好みがより重要です。要件に基づいて、標準のレイアウト マネージャー (Grid、GridBag、および Border) のみを使用した作業を次に示します。楽しんでください - MS。

java.awt をインポートします。; javax.swing をインポートします。; import javax.swing.border.*;

public class GeneDialog extends JDialog {

private String[]    plusMinus = {"+","-"}, tfNames = {
                "Symbol", "Chromosome", "Start position", "Stop position"},
            listData = {"Gene01", "Gene02", "Gene03", "Gene04", "Gene05", "Gene06",
                "Gene07", "Gene08", "Gene09", "Gene10", "Gene11", "Gene12"};
private JTextField[]    gtField= new JTextField[tfNames.length];
private JList       list = new JList (new DefaultListModel());

    public GeneDialog (Frame f, String title) {
    super (f, title, true);
    Container cp = getContentPane();
    cp.setLayout (new GridLayout(1,2));
    JScrollPane listScrollPane = new JScrollPane (list);
    listScrollPane.setBorder(BorderFactory.createCompoundBorder(
                    BorderFactory.createTitledBorder("Genes"),
                    BorderFactory.createEmptyBorder(10, 10, 10, 10))); 
    DefaultListModel lm = (DefaultListModel) list.getModel();
    for (int k = 0 ; k < listData.length ; k++)
        lm.addElement (listData[k]);
    cp.add (listScrollPane);
    cp.add (controlPanel());
    pack();
    }

private GridBagConstraints makeGBC (int inset) {
    GridBagConstraints gbc = new GridBagConstraints();
    gbc.insets = new Insets (inset, inset, inset, inset);
    gbc.fill = GridBagConstraints.HORIZONTAL;
    gbc.gridx = 0;
    gbc.gridy = GridBagConstraints.RELATIVE;
    return gbc;
}

private JPanel controlPanel() {
    JPanel cp = new JPanel (new BorderLayout()),
           bp = new JPanel (new GridBagLayout()),
           tp = new JPanel (new GridBagLayout());

    GridBagConstraints gbc = makeGBC (10);
    for (int i = 0 ; i < tfNames.length ; i++) {
        JLabel label = new JLabel (tfNames[i], JLabel.TRAILING);
        tp.add (label, gbc);
    }
    gbc.gridx++; gbc.weightx = 1.0f;
    for (int i = 0 ; i < tfNames.length ; i++) {
        gtField[i] = new JTextField(12);
        tp.add (gtField[i], gbc);
    }

    gbc = makeGBC (10);
    for (int i = 0 ; i < plusMinus.length ; i++) {
        JButton b = new JButton (plusMinus[i]);
        bp.add (b, gbc);
        gbc.gridx++;
    }

    cp.add (tp, "Center");
    cp.add (bp, "South");
    return cp;
}

public static void main (String[] args) {
    new GeneDialog (null, "Genes").setVisible (true);

}}

于 2011-01-19T06:29:24.623 に答える
1

あなたの質問には答えませんが、JGoodies FormLayout は GridBagLayout よりも直感的であることがわかりました。ライブラリといくつかの例は、次の場所にあります。

http://jgoodies.com/freeware/forms/index.html

于 2011-01-18T20:19:55.263 に答える
1

ここにあるすべてのコードを見ないと、何が問題なのかわかりません。時間があれば、MigLayoutをご覧になることをお勧めします。Swing と SWT で使用できます。学習すると、非常に強力なレイアウト マネージャーになります。

これが役に立てば幸いです。幸運を祈ります。

于 2011-01-18T18:32:23.760 に答える
0

私は javamonkey79 と同じ意見を持っていることを伝えたいだけです。MigLayout をご覧ください。気に入っていただけると思います。Java 7 以降では、標準の Java オンボード レイアウトになります。

于 2011-01-18T19:29:22.520 に答える
0

JScrollPaneとその中にあるの両方に最大幅を設定してみてくださいJList

于 2011-01-18T19:12:53.103 に答える