2015-06-19 2 views
5

ОБНОВЛЕНИЕ: Я получил обоснованную критику за публикацию неработающего кода. Я принял это близко к сердцу и обновляю этот пост полным рабочим примером. Я также обновляю описание соответственно:JPanel занимает больше места, чем нужно. Как я могу сжать его?

У меня очень простой графический интерфейс java swing, компоненты которого занимают то, что выглядит равным количеством вертикального (Y) пространства, которое используется наибольшим компонентом Y степени, но полностью без необходимости. Я попытался сжать те компоненты, которые не нуждаются в таком большом вертикальном пространстве, с использованием предпочтительных советов, но безрезультатно.

Основная схема проста: есть главное окно и три вертикальные панели. Макет - это простой GridLayout (и я бы предпочел сохранить его таким образом, если кто-то не покажет мне, что мне нужно, не может быть сделано с помощью GridLayout). Кажется, что все три панели занимают одинаковое количество вертикального пространства, хотя в случае ползунков это огромная трата пространства. Как я могу заставить каждый из суб-панелей использовать столько пространства, сколько им нужно? т. е. я хотел бы, чтобы два окна слайдера были только высотой, как ползунки, и их описание должно быть.

Код:

import java.awt.*; 
import java.awt.event.*; 
import javax.swing.*; 

class test { 
    public static void main(String[] arg) { 
    JFrame mainWindow = new JFrame(); 
    JSlider slider1 = new JSlider(0,100,50); 
    JSlider slider2 = new JSlider(0,100,50); 

    JPanel pnlSlider1 = new JPanel(); 
    pnlSlider1.setLayout(new GridLayout(1,1)); // 1 row, 1 column 
    pnlSlider1.add(new JLabel("Description for slider1")); 
    pnlSlider1.add(slider1); 

    JPanel pnlSlider2 = new JPanel(); 
    pnlSlider2.setLayout(new GridLayout(1,1)); // 1 row, 1 column 
    pnlSlider2.add(new JLabel("Description for slider2")); 
    pnlSlider2.add(slider2); 

    // label should now be to the left of slider 

    String content = "<html>Some rather long winded HTML content</html>"; 
    JEditorPane ep = new JEditorPane("text/html", content); 

    // this is the main window panel 
    JPanel panel = new JPanel(); 
    panel.setLayout(new GridLayout(3,1)); // 3 rows, 1 column 
    panel.add(ep); 
    panel.add(pnlSlider1); 
    panel.add(pnlSlider2); 

    // tie it all together and display the window 
     mainWindow.setPreferredSize(new Dimension(300, 600)); 
     mainWindow.setLocation(100, 100); 
     mainWindow.getContentPane().add(panel); 
     mainWindow.pack(); 
     mainWindow.addWindowListener(new WindowAdapter() { 
      public void windowClosing(WindowEvent e) { 
       System.exit(0); 
      } 
     }); 
     mainWindow.setVisible(true); 

    } 
} 

(удален разглагольствовать о не видевший никакого графического интерфейса кодирования достижений в 30 лет, поскольку это не имеет отношения к проблеме и, вероятно, не будет решена в этом посте либо)

+0

1) Чтобы лучше помочь, отправьте сообщение [MCVE] (http://stackoverflow.com/help/mcve) (минимальный полный проверенный пример) или [SSCCE] (http://www.sscce.org/) (Короткий, самосохраненный, правильный пример). 2) Предоставить ASCII-искусство или простой рисунок макета GUI с минимальным размером и, если он изменен, с большей шириной и высотой. –

+1

* «Как кто-то, кто получил визуальное программирование, начал с Visual Basic 1.0 в 1993 году, я с трудом понимаю, что эти проблемы могут сохраниться до 2015 года. Это наравне с чистой питьевой водой для всех на планете. нет оправдания тому, что он не существует повсеместно ». * Хм ..« существующий повсеместно »- это интересный способ выразить« использование макетов по мере их разработки ». Обратите внимание, что в 1993 году VB не нужно было создавать графические интерфейсы, разные платформы и PLAF (сменный внешний вид), это на порядок сложнее! –

ответ

5

..компоненты занимают то, что выглядит равным количеством вертикального (Y) пространства, которое используется самой большой компонентой Y степени, но совершенно без необходимости.

Да, это путь GridLayout является предназначен работать.

Используйте вместо этого GridBagLayout или BoxLayout или GroupLayout, каждый из которых может выполнять один столбец или ряд компонентов с переменным размером (ширина и высота).

+0

Андрей, любой шанс вы могли бы выделить минимальное изменение кода для моего (модифицированного) кода выше, чтобы сделать одну из комбайнов слайдера/метки только занимающей столько же вертикального пространства, сколько нужно, используя любой из менеджеров макета, которые вы предлагаете? Я просто не могу придумать образцы, которые я нахожу (и половина из них не работает ...) – Balthasar

+0

Любой шанс, который вы могли бы сделать. * «Предоставить ASCII-искусство или простой рисунок макета GUI минимум размер и размер, изменяемый по размеру, с большей шириной и высотой ». *? –