2017-01-17 7 views
0

Я пытаюсь создать относительно мелкомасштабную текстовую игру внутри JFrame. Я планирую держать этот JFrame постоянным размером, поэтому я позвонил setResizable(false).Дополнительное пространство между коробками JScrollPanes в JFrame

Моя цель состояла в том, чтобы сделать функцию текст ввода/вывода, который несколько действовал как консоли или из командной строки, так что у меня есть два JTextArea с, каждый внутри JScollPane, а затем я добавил их обоих к Box, один поверх другого. Я хотел, чтобы эти компоненты сохраняли постоянный размер, поэтому я позвонил setPreferredSize() и setMaximumSize() с соответствующими размерами.

Однако, когда я добавляю два из этих ящиков в JFrame, между ними есть горизонтальный зазор. Кажется, что зазор связан с правой границей компонента. См. Прилагаемое изображение этого поведения:

gaps).

Я использую FlowLayout в области содержимого, где hGap установлен на 0, и все же между компонентами, которые я добавил, все еще существует разрыв, и я не могу понять, почему.

Чтобы убедиться, что это не проблема с самим JFrame или с его менеджером макетов, я также добавил два блока, содержащие кнопки, чтобы проиллюстрировать, что у них нет разрыва между ними.

Если возможно, я хотел бы удалить пробелы или, по крайней мере, определить, что их вызывает. На данный момент я понятия не имею, что еще может вызвать проблему, и я был бы признателен за любые советы.

EDIT: Вот картина того, что я хотел бы это демонстрационный класса выглядеть следующим образом:

no gaps

Я выборки статьи соответствующих бит коды в этот класс, чтобы продемонстрировать мою проблему:

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

public class Demo extends JFrame { 
    public Demo() { 
     super("Demo"); 
     setSize(400, 400); 
     setResizable(false); 

     int Y_AXIS = BoxLayout.Y_AXIS; 

     getContentPane().setLayout(new FlowLayout(FlowLayout.CENTER, 0, 0)); 
     getContentPane().setBackground(Color.RED); 

     Box boxA = new Box(Y_AXIS); 
     boxA.add(createComponent("output")); 
     boxA.add(createComponent("input")); 
     this.add(boxA); 

     Box boxB = new Box(Y_AXIS); 
     boxB.add(createComponent("output")); 
     boxB.add(createComponent("input")); 
     this.add(boxB); 

     Box boxC = new Box(Y_AXIS); 
     boxC.add(new JButton("Button")); 
     boxC.add(new JButton("Button")); 
     this.add(boxC); 

     Box boxD = new Box(Y_AXIS); 
     boxD.add(new JButton("Button")); 
     boxD.add(new JButton("Button")); 
     this.add(boxD); 

     this.setVisible(true); 
    } 

    private JScrollPane createComponent(String initial) { 
     JTextArea ta = new JTextArea(3, 10); 
     ta.setText(initial); 
     JScrollPane sp = new JScrollPane(ta); 

     Dimension pref = new Dimension(100, 100); 
     sp.setPreferredSize(pref); 
     sp.setMaximumSize(pref); 

     sp.setVerticalScrollBarPolicy(JScrollPane.VERTICAL_SCROLLBAR_NEVER); 
     sp.setHorizontalScrollBarPolicy(JScrollPane.HORIZONTAL_SCROLLBAR_NEVER); 

     return sp; 
    } 

    public static void main(String[] args) { 
     Demo d = new Demo(); 
    } 

} 
+1

1) Пространства, кажется, поступают из 'Box', а не из' FlowLayout' .. 2) Предоставляют ASCII-искусство или простой рисунок * предназначенного макета GUI. –

+0

@AndrewThompson Спасибо за подсказку! Как вы предположили, я пересмотрел сообщение с изображением того, что мне хотелось бы, чтобы графический интерфейс выглядел. В принципе, я просто хочу удалить пробел. Есть ли у вас какие-либо представления о том, что может произойти с коробкой? Я озадачен - пары JButtons также находятся в коробках, но не имеют пробелов. – kattusite

+1

Я бы, вероятно, использовал для этого четыре панели. 1) 2x2 'GridLayout' для текстовых областей. 2) 2x2 'GridLayout' для кнопок. 3) «GridBagLayout» для центрирования панели, содержащей кнопки. 4) «BorderLayout» для панели текстовой области ('LINE_START') и панели с использованием' GridBagLayout' ('LINE_END'). - Не путайте с предпочтительным. минимальный или максимальный размер всего. Добавьте «EmptyBorder» к панели с макетом рамки, затем упакуйте рамку перед ее показом. –

ответ

0

Я понял, что вызвало появление пробелов, хотя я не достаточно знаком с Swing или LayoutManagers, чтобы точно сказать почему.

Удаляя только вызов setMaximumSize() компонентов интерьера, программа работает так, как мне бы хотелось. Я предполагаю, что один из менеджеров компоновки (возможно, BoxLayout, встроенный в Box?) Не ведет себя так, как я ожидал, когда его попросили использовать абсолютные максимальные размеры, вместо того, чтобы полагаться на предпочтительный размер и позволять менеджеру макета делать Работа.

Вот пересмотренный код, в котором указанная строка прокомментирована.

private JScrollPane createComponent(String initial) { 
    JTextArea ta = new JTextArea(3, 10); 
    ta.setText(initial); 
    JScrollPane sp = new JScrollPane(ta); 

    Dimension pref = new Dimension(100, 100); 
    sp.setPreferredSize(pref); 
    //sp.setMaximumSize(pref); 

    sp.setVerticalScrollBarPolicy(JScrollPane.VERTICAL_SCROLLBAR_NEVER); 
    sp.setHorizontalScrollBarPolicy(JScrollPane.HORIZONTAL_SCROLLBAR_NEVER); 

    return sp; 
} 

Хотя это решение делает то, что я хочу, чтобы он, это, вероятно, не подходит, так как Эндрю Томпсон упомянул в своем комментарии, и я должен стараться избегать установки любой из предпочтительных/максимальных размеров.