2011-01-18 6 views
1

Я работаю над JDialog (вручную, без GUI-сборщиков), и у меня проблема с макетом.
У меня есть это:
alt text
Моя проблема заключается в том, что я не знаю, что, как сказать, что JList (в JScrollPane), чтобы иметь максимальную ширину, я использовал SetSize, setMaximumSize и ничего не работает! Мне нужно, чтобы ширина JList составляла половину размера изображения.

Объясните макеты:
«Информация о генах» - это GridLayout 2x4, она содержится в JPanel с BoxLayout, +/- JButtons - это BoxLayout, все, что я сказал ранее, находится в BoxLayout. Теперь, «Genes» JPanel - это GridBagLayout.

Что я могу сделать?

Спасибо заранее!

PD: Другие границы предназначены только для обозначения границ компонентов.Java-Swing: проблема с использованием менеджеров компоновки!

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(); 

+0

Вы можете оставить 'GridBagConstraints' для' JList'? – justkt

+0

Есть целый код! Благодарю. –

ответ

1

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

Надеюсь, это поможет, удачи.

+0

+1 MigLayout полностью! – 01es

0

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

+0

Я уже сделал это, не работал. –

+0

Размер dim = новый Размер (200, Integer.MAX_VALUE); scpGenesList.setSize (dim); scpGenesList.setMaximumSize (dim); lstGenesList.setSize (dim); lstGenesList.setMaximumSize (dim); –

+0

@Jaun Diego: попробуйте использовать setPreferredWidth и попробуйте установить размер 'JList', прежде чем добавить его в' JScrollPane'. –

0

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

3

Почему бы не дать панель «Гены» a 2x1 GridLayout? Это должно обеспечить, чтобы обе стороны имели одинаковый размер.

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

С этой целью я бы дал панели «Гены» BorderLayout, поместил список в слот CENTER и элементы управления в слот EAST.

+0

+1 для размещения макета _breathe_! – trashgod

1

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

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

2

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

1

Я думаю, что более ранние решения являются действительными, и это скорее предпочтение кодирования, с точки зрения которого менеджеры макетов использовать. Основываясь на ваших требованиях, здесь работает один со стандартными менеджерами компоновки (Grid, GridBag и Border). Получайте удовольствие, - 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); 

}}

Смежные вопросы