LINUX.ORG.RU

Java, swing, GridBagLayout


0

0

Имеется задача: на форме должны быть два JList'а, завёрнутых в JScrollPane'ы. Над каждым из них есть JLabel'ы, подписывающие их. Между ними есть ещё что-то.
Проблема: если текст в лэйблах разной длины, то при уменьшении окна скроллпейны будут становиться разной ширины, соответственно ширине лэйблов. 
Вопрос:  как сделать, чтобы GridBagLayout при масштабировании не смотрел на ширину лейблов, или иначе, чтобы скроллпейны всегда были одинаковой ширины?

Код:
import java.awt.*;
import java.awt.event.ComponentAdapter;
import java.awt.event.ComponentEvent;
import java.awt.event.ComponentListener;

import javax.swing.*;

public class SwingTest11
{

	/**
	 * @param args
	 */
	public static void createAndShowGUI()
	{
		JFrame f = new JFrame();
		f.getContentPane().setLayout(new GridBagLayout());
		f.setSize(new Dimension(640,480));
		GridBagConstraints c = new GridBagConstraints();
		
		JList   jl1 = new JList(new DefaultListModel()), 
				jl2 = new JList(new DefaultListModel());
		
		((DefaultListModel)jl1.getModel()).add(0, "fgsfds");
		((DefaultListModel)jl2.getModel()).add(0, "fgsfdsfgsfdsfgsfds");
		
		final JScrollPane jsp1 = new JScrollPane(),
							jsp2 = new JScrollPane();
		jsp1.setViewportView(jl1);
		jsp2.setViewportView(jl2);
		jsp1.setMaximumSize(new Dimension(100,100));
		jsp2.setMaximumSize(new Dimension(100,100));
		jsp1.setPreferredSize(new Dimension(344, 425));
		jsp2.setPreferredSize(new Dimension(344, 425));
		
		JButton b = new JButton("Button!");
		
		JLabel jlab1 = new JLabel("loooooooooong label is long"),
				jlab2 = new JLabel("short");
		
		jlab1.setLabelFor(jsp1);
		jlab2.setLabelFor(jsp2);
		
		
		c = new GridBagConstraints();
		c.gridx = 0;
		c.gridy = 0;
		c.weightx = 0;
	//	c.weighty = 1;
		c.fill = GridBagConstraints.NONE;
		c.anchor = GridBagConstraints.WEST;		
		f.getContentPane().add(jlab1,c);
		
		c = new GridBagConstraints();
		c.gridx = 0;
		c.gridy = 1;
		c.weightx = 0.5;
		c.weighty = 1;
		c.fill = GridBagConstraints.BOTH;
		c.anchor = GridBagConstraints.WEST;
		f.getContentPane().add(jsp1,c);
		
		c = new GridBagConstraints();
		c.gridx = 1;
		c.gridy = 1;	
		c.weightx =0;		
		f.getContentPane().add(b,c);
		
		c = new GridBagConstraints();
		c.gridx = 2;
		c.gridy = 0;
		c.weightx = 0;
	//	c.weighty = 1;
		c.fill = GridBagConstraints.NONE;
		c.anchor = GridBagConstraints.WEST;
		f.getContentPane().add(jlab2,c);
		
		c = new GridBagConstraints();
		c.gridx = 2;
		c.gridy = 1;
		c.weightx = 0.5;
		c.weighty = 1;
		c.fill = GridBagConstraints.BOTH;
		c.anchor = GridBagConstraints.WEST;
		f.getContentPane().add(jsp2,c);
		
		f.pack();
		f.show();
		f.addComponentListener(new ComponentAdapter() {

			public void componentResized(ComponentEvent e)
			{
				System.out.println("left: "+jsp1.getWidth()+"\nrigth: "+jsp2.getWidth());
				
			}

			});
		
	}
	public static void main(String[] args)
	{
		javax.swing.SwingUtilities.invokeLater(new Runnable() {

			public void run()
			{
				try
				{
					UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName());
				}
				catch (ClassNotFoundException e)
				{
					// TODO Auto-generated catch block
					e.printStackTrace();
				}
				catch (InstantiationException e)
				{
					// TODO Auto-generated catch block
					e.printStackTrace();
				}
				catch (IllegalAccessException e)
				{
					// TODO Auto-generated catch block
					e.printStackTrace();
				}
				catch (UnsupportedLookAndFeelException e)
				{
					// TODO Auto-generated catch block
					e.printStackTrace();
				}
				createAndShowGUI();
				
			}});

	}

}

Вывод на консоль:
До:
left: 468
rigth: 468
left: 488
rigth: 488
После:
left: 291
rigth: 183
anonymous

Добавить рядом с Label'ами Horizontal Spacer'ы и растянуть списки на два столбца - Label и Spacer. Должно помочь. Ещё можно поиграться со свойствами CanShrink, CanGrow и WantGrow у списков.

naryl ★★★★★
()

А чего это у тебя MaximumSize меньше, чем PreferredSize? ЕМНИП при неправильных соотношениях, Swing их просто игнорирует.

naryl ★★★★★
()
Ответ на: комментарий от naryl

Да ему без разницы, какие maximum size'ы. А Hosizrontal Spaser'ы - это какой-то специальный класс, или просто пустой JLabel?

anonymous
()
Ответ на: комментарий от anonymous

Spacer - невидимый обьект, занимающий всё предоставленное ему место. Посмотри в каком-нибудь GUI Designer'е. IntelliJ IDEA например.

naryl ★★★★★
()
Ответ на: комментарий от anonymous

Box.createHorizontalGlue или что то в этом роде

anonymous
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.