Java-Swing: проблема с использованием менеджеров компоновки! - PullRequest
1 голос
/ 18 января 2011

Я работаю над JDialog (вручную, без сборщиков графического интерфейса), и у меня возникла проблема при создании макета.У меня есть это:alt textМоя проблема в том, что я не знаю, как сказать, что JList (внутри JScrollPane) имеет максимальную ширину, я использовал setSize, setMaximumSize и ничего не работает!Мне нужно, чтобы ширина этого JList составляла половину размера картинки.Объясните макеты:«Информация о генах» - это GridLayout 2x4, она содержится в JPanel с BoxLayout, +/- JButtons - это также BoxLayout, все, что я говорил ранее, находится внутри BoxLayout.Теперь JPanel "Genes" является GridBagLayout.Что я могу сделать?Заранее спасибо!PD: Другие границы предназначены только для выравнивания границ компонентов.

Source Code:</p> <pre><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();

Ответы [ 7 ]

3 голосов
/ 18 января 2011

Почему бы не дать панели "Genes" 2x1 GridLayout?Это должно гарантировать, что обе стороны имеют одинаковый размер.

Но на самом деле, для меня было бы более разумно дать списку все пространство, не занятое элементами управления, так как они требуют фиксированного объема пространства, пока списокможет извлечь выгоду из всего дополнительного пространства, которое он может получить, если есть широкие записи.

Для этого я бы дал панели "Genes" BorderLayout, поместил бы список в слот CENTER и элементы управления вслот ВОСТОК.

2 голосов
/ 19 января 2011

Следуя предложению @Michael Borgwardt о расширении списка, вы можете использовать setVisibleRowCount() для создания удобного начального размера панели.При необходимости вы также можете проверить Dimension, возвращаемое getPreferredScrollableViewportSize(), которое «вычисляет размер области просмотра, необходимой для отображения visibleRowCount строк.»

1 голос
/ 19 января 2011

Я думаю, что все предыдущие решения являются действительными, и это скорее предпочтение кодирования с точки зрения того, какие менеджеры компоновки использовать.Исходя из ваших требований, вот рабочий со стандартными менеджерами компоновки (Grid, GridBag и Border).Веселитесь, - MS.

import java.awt. ;импорт javax.swing. ;import javax.swing.border. *;

открытый класс 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);

}}

1 голос
/ 18 января 2011

Это не отвечает на ваш вопрос - но я обнаружил, что JGoodies FormLayout более интуитивно понятен, чем GridBagLayout. Библиотеку, а также некоторые примеры можно найти здесь:

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

1 голос
/ 18 января 2011

Не видя весь код здесь, может быть невозможно сказать вам, что не так.Одна вещь, которую я хотел бы предложить, если у вас есть время, это взглянуть на MigLayout .Вы можете использовать его вместе с Swing & SWT, и, как только вы узнаете, это довольно мощный менеджер раскладки.

0 голосов
/ 18 января 2011

Я просто хочу сказать, что я разделяю то же мнение, что и javamonkey79.Взгляните на MigLayout, он вам понравится, и начиная с Java 7 он станет стандартной версией java-onboard.

0 голосов
/ 18 января 2011

Попробуйте установить максимальную ширину как для JScrollPane, так и для JList, который находится внутри него.

...