簡體   English   中英

Java-Swing:使用布局管理器時出現問題!

[英]Java-Swing: A problem using layout managers!

我正在使用JDialog(用手,沒有GUI構建器),並且在布局時遇到問題。
我有這個:
替代文字
我的問題是,我不知道如何分辨JList(在JScrollPane中)具有最大寬度,我使用了setSize,setMaximumSize,但沒有任何效果! 我需要JList的寬度為圖片大小的一半。

解釋布局:
“基因信息”是一個2x4的GridLayout,由包含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(); 

為什么不為“ Genes”面板提供2x1 GridLayout 那應該確保雙方的大小相同。

但是實際上,對我來說,給列表提供所有控件未占用的空間是更有意義的,因為那些控件需要固定的空間,而如果條目很寬,則列表可能會從其可以獲得的所有額外空間中受益。

為此,我將為“ Genes”面板提供BorderLayout ,將列表放在CENTER插槽中,將控件放在EAST插槽中。

按照@Michael Borgwardt的建議,讓列表增加,您可以使用setVisibleRowCount()來生成方便的初始面板尺寸。 如果必要的話,您還可以檢查Dimension由歸國getPreferredScrollableViewportSize()其中“計算需要顯示視口的大小visibleRowCount行。”

如果不查看此處的所有代碼,可能無法告訴您出了什么問題。 如果您有時間,我建議您看一看MigLayout 您可以將其與Swing&SWT結合使用,一旦了解,它就是一個功能強大的布局管理器恕我直言。

希望這有幫助,祝你好運。

它沒有回答您的問題-但是我發現JGoodies FormLayout比GridBagLayout更直觀。 該庫以及一些示例可以在這里找到:

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

我認為較早的解決方案都是有效的,並且就使用哪種布局管理器而言,它更像是一種編碼偏好。 根據您的要求,這里是僅適用於標准布局管理器(網格,網格包和邊框)的工作庫。 玩得開心,-MS。

導入java.awt。 ; 導入javax.swing。 ; 導入javax.swing.border。*;

公共類GeneDialog擴展了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);

}}

嘗試為JScrollPane和其中的JList設置最大寬度。

我只想告訴我,我與javamonkey79有相同的看法。 看一下MigLayout,您會喜歡的,從Java 7開始,它將是標准的Java-onboard布局。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM