2016-05-10 2 views
0

Я использую GridBagLayout Manager, чтобы четко определить, где (на данный момент) метки thow и JScrollPane.Есть ли способ игнорировать компоненты PreferredSize?

Я использую gridbagconstraint, чтобы сообщить первой JLabel с названием «label1» (с текстом), он должен быть 3 единицы ширины * 1 единица роста. Я говорю еще один JLabel с именем «blank» (пустой), он должен быть 9 единиц в ширину * 1 единица роста.

Тогда я объявляю JScrollPane, и сказать ему, что должно быть на у = 1, высота = 11, х = 0 ширина = 12.

Я установил заливку contraint GridBag в к ОБА, потому что хочет каждый компонент заполните прямоугольник, который я описываю.

label1 должен быть четверть всей ширины, но поскольку label1 имеет некоторый текст, label1 занимает 2/3 пробела.

Есть ли способ просто игнорировать предпочтительные размеры компонентов, как это делает GridLayout (вид)?

Я прочитал документацию об этом, но я не нашел подсказки.

Некоторые исходный код:

public class JPanelMain { 
    //gridconstraints 
    private GridBagConstraints gbc; 

    private static final int min = 1; 
    private static final int maxSize= 12; 
    private static final int forth =maxSize/4; 
    private static final int third =maxSize/3; 

    public JPanelMain(JFrame frame) { 

     JPanel pane = new JPanel(); 
     pane.setLayout(new GridBagLayout()); 

     gbc = new GridBagConstraints(
       0,//gridx 
       0,//gridy 
       0,//gridwidth 
       0,//gridheight 
       1,//weightx 
       1,//weighty 
       GridBagConstraints.CENTER,//anchor 
       GridBagConstraints.BOTH,//fill 
       new Insets(0,0,0,0),//insets 
       0,//padx 
       0//pady 
       ); 


     JLabel label1 = new JLabel(); 
     label1.setBorder(BorderFactory.createTitledBorder("Label1")); 
     JLabel blank = new JLabel(); 
     blank.setBorder(BorderFactory.createTitledBorder("blank")); 

     label1.setOpaque(true); 



     gbc.gridwidth =(third); 
     gbc.gridheight = (min); 

     pane.add(label1,gbc); 
     label1.setText("Label1"); 
     blank.setOpaque(true); 



     gbc.gridx = third; 
     gbc.gridwidth = maxSize -third; 

     pane.add(blank,gbc);  

     gbc.gridy = min; 
     gbc.gridheight = maxSize - min; 
     gbc.gridx= 0; 
     gbc.gridwidth=maxSize; 

     DefaultListModel<String> patients = new DefaultListModel<>(); 
     fill(patients); 
     JList<String> list = new JList<>(patients); 
     pane.add(new JScrollPane(list),gbc); 





     frame.add(pane); 
    } 

    private void fill (DefaultListModel<String> model) { 
     /**/ 
    } 
} 

результат, как описано (и это же по высоте): Label with text sized after its prefered size, despite the constraints

Я прочитал (а я считаю, в основном понял) example.

ответ

2

В GridBagLayout нет такой концепции, как «единицы». GBL использует ячейки.

Если у вас есть два компонента в первой строке, то у вас есть две ячейки. Каждая ячейка измеряется компонентом в ячейке.

Если у вас есть компонент во второй строке, у вас есть несколько вариантов. Компонент может отображаться в первом или втором столбцах. Или вы можете дать компоненту «ширина сетки» равным 2, что означает, что он заполнит ширину двух столбцов.

Вы можете использовать ограничение «weightx». Он указывает, как пространство должно быть выделено компоненту, когда доступно дополнительное пространство. Поэтому, если один компонент может быть .20, а другой .80. Это лучший способ назначить пространство пропорционально, но это только для «лишних» пространств. Первоначально каждый компонент будет иметь размер по своему предпочтительному размеру.

Если вы хотите по-настоящему относительные размеры, вы можете использовать Relative Layout. Он позволяет указать размер компонентов по отношению к общему доступному пространству, поэтому предпочтительный размер можно игнорировать.

Для создания первой панели, содержащей две метки, необходимо создать панель, используя RelativeLayout, а затем добавить эту панель к панели с помощью GridBagLayout.

+0

, когда я говорю «2 единицы по ширине», это просто означает, что я устанавливаю ограничение на gridwidth = 2, как описано в коде. Я предположил, что это будет понятно. Могу я сказать «не управляйте лишними пробелами?» к моей решетке? –

+0

Снова вы не можете этого сделать. Как я уже сказал, вам нужно работать с «ячейками». «Ширина сетки» относится только к максимальному числу компонентов, найденных в любой строке. В вашем примере у вас есть 3 компонента, 2 на одну строку и 1 на секунду. Таким образом, только вторая строка может использовать ограничение «gridwidth», и оно может быть не более 2, а не 9. См. Обновление для RelativeLayout. – camickr

+0

кажется, что эта относительная компоновка действительно _exactly_, что мне нужно, большое спасибо. Но я совершенно разочарован. Я не получаю эту вещь gridbaglayout ... –