Проблемы с графическим интерфейсом Java - PullRequest
2 голосов
/ 11 февраля 2009

Я проектирую действительно простой графический интерфейс, но без везения. По сути, внешний макет имеет две колонки, которые являются панелью сплиттера (это для IRC-клиента, которого я пишу). С левой стороны находится дерево сервера / канала / пользователя, а справа - панель чата. Теперь я разобью это так, что с правой стороны есть панель вывода вверху и поле ввода с одной линией внизу.

Это код для создания GUI в целом (это всего лишь фрагмент)

ChatModel cm = new ChatModel();
ChatView cv = new ChatView(cm);

treeViewChatSplitPane = new JSplitPane(JSplitPane.HORIZONTAL_SPLIT, serverTreeView, cv);
treeViewChatSplitPane.setSize(500, 500);
treeViewChatSplitPane.setBorder(null);
treeViewChatSplitPane.setDividerSize(3);
this.getContentPane().add(treeViewChatSplitPane);

this.setSize(500, 500);

В конструкторе ChatView есть это (он расширяет java.awt.Container)

this.model = model;
this.setLayout(new BorderLayout());

mainTextArea = new JTextArea();
mainTextArea.setLineWrap(true);
mainTextArea.setBackground(new Color(255, 255, 255));

inputField = new JTextField();

this.add(mainTextArea, BorderLayout.CENTER);
this.add(inputField, BorderLayout.PAGE_END);

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

Есть идеи? Я не понимаю, почему это не сработает.

Ответы [ 5 ]

4 голосов
/ 11 февраля 2009

Если я правильно помню, JSplitPanes всегда соблюдает минимальный размер своих компонентов. Попробуйте явно установить минимальный размер ChatView на (0,0) и посмотрите, поможет ли это. Если это так, то вы можете посмотреть на каждый из компонентов внутри него, чтобы определить причину проблемы.

1 голос
/ 17 апреля 2009

Если оба компонента имеют разумные предпочтительные и минимальные размеры, и вы по-прежнему наблюдаете странное поведение, вам может потребоваться вызвать setResizeWeight() на JSplitPane.

Обратите внимание, кстати, что программная установка местоположения делителя (setDividerLocation()) практически никогда не работает.

1 голос
/ 11 февраля 2009

В каком месте вы устанавливаете минимальный размер для ChatView? Если это так, разве этот минимум не равен размеру кадра (500 x 500)?

Трудно решить проблему с предоставленной информацией, но следующий совет ВСЕГДА работал для меня (и для людей, которые его используют)

  • Создайте простейшую рамку, которая могла бы работать, и добавьте SplitPane с двумя кнопками.
  • Изменить размер там.
  • Все идет нормально, процесс замены одного из ваших компонентов.
  • Тогда другой.
  • Определите, какой из них вызывает странное поведение.
  • На этом начните делать то же самое, замените его на минимальный компонент, о котором вы можете подумать (например, замените его на JPanel)

Кстати, возможно, было бы лучше заменить java.awt.Container на javax.swing.JComponent

Идея состоит в том, чтобы начать с самой простой вещи, которая могла бы работать, и развиваться оттуда. В большинстве случаев проблема заключается в каком-то глупом свойстве, которое мы установили, и очистив все, что возникло.

Это займет не более 1 часа. за это.

0 голосов
/ 11 февраля 2009

Может быть связано с minimunSize нужного компонента. В следующем примере вы можете просто переместить разделитель влево.

public static void main(String[] args) {
    JLabel barLabel = new JLabel("bar");
    JLabel fooLabel = new JLabel("foo");
    barLabel.setMinimumSize(new Dimension(150,150));
    fooLabel.setPreferredSize(new Dimension(50,50));



    JSplitPane treeViewChatSplitPane = new JSplitPane(JSplitPane.HORIZONTAL_SPLIT, fooLabel, barLabel);
    treeViewChatSplitPane.setSize(500, 500);
    treeViewChatSplitPane.setBorder(null);
    treeViewChatSplitPane.setDividerSize(3);

    JFrame frame = new JFrame();
    frame.add(treeViewChatSplitPane, BorderLayout.CENTER);

    frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    frame.setSize(200,200);
    frame.setVisible(true);


}
0 голосов
/ 11 февраля 2009

Я не уверен, что именно является причиной вашей проблемы, но из расплывчатой ​​памяти могу сказать, что JSplitPane сходит с ума, если вы не установите предпочтительные размеры и минимальные размеры для каждой из ваших панелей.

Я бы предложил сделать это, просто чтобы посмотреть, работает ли он лучше.

Вот кое-что из учебника Java по разделителям.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...