Java Swing — проблема изменения размера Dynamic JPanel GroupLayout

На этих изображениях показано окно чата, размер которого необходимо изменить вместе с рамкой приложения. Я использую GroupLayout для этого. Иерархия фрейма выглядит примерно так

chatDiv(JPanel, GroupLayout)->chatTabbedPane(JTabbedPane, GroupLayout)
->chatPanel(extended JPanel, GroupLayout)

Но эти отдельные вкладки chat_tabs(chatPanel) добавляются в chatTabbedPane динамически во время выполнения приложения.

Problem is: These chatPanel(s) are expanding with the expansion of application 
frame but they are not shrinking with the shrink in width of application frame.

инициализированный кадр

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

расширенный и снова сжатый кадр

Вот класс chatPanel, расширяющий JPanel:

class chatPanel extends JPanel{
private static final long serialVersionUID = 1L;
GroupLayout gl_panel;
JTextArea textArea;
JTextField textField;
JButton sendTextButton;
JButton closeChatButton;
int replyRef;

public chatPanel(int ref){
    //this.setLayout(null);

    closeChatButton = new JButton("");
    sendTextButton = new JButton("SEND");
    textField = new JTextField();
    textArea = new JTextArea();
    replyRef = ref;

    textArea.setWrapStyleWord(true);
    textArea.setEditable(false);
    textArea.setLineWrap(true);
    //textArea.setBounds(0, 0, 370, 99);
    this.add(textArea);

    //textField.setBounds(0, 101, 290, 20);
    //textField.setColumns(10);
    this.add(textField);

    sendTextButton.setFont(new Font("Tahoma", Font.PLAIN, 10));
    //sendTextButton.setBounds(290, 101, 60, 19);
    this.add(sendTextButton);

    closeChatButton.setIcon(new ImageIcon("files/close.png"));
    closeChatButton.setSelectedIcon(null);
    closeChatButton.setToolTipText("CLOSE");
    closeChatButton.setFont(new Font("Tahoma", Font.PLAIN, 5));
    //closeChatButton.setBounds(350, 101, 20, 19);
    this.add(closeChatButton);

    gl_panel = new GroupLayout(this);
    gl_panel.setHorizontalGroup(
        gl_panel.createParallelGroup(Alignment.TRAILING)
            .addGroup(gl_panel.createSequentialGroup()
                .addGap(1)
                .addComponent(textField, GroupLayout.DEFAULT_SIZE, 286, Short.MAX_VALUE)
                .addGap(1)
                .addComponent(sendTextButton, GroupLayout.PREFERRED_SIZE, 60, GroupLayout.PREFERRED_SIZE)
                .addGap(1)
                .addComponent(closeChatButton, GroupLayout.PREFERRED_SIZE, 20, GroupLayout.PREFERRED_SIZE)
                .addGap(1))
            .addComponent(textArea, GroupLayout.DEFAULT_SIZE, 370, Short.MAX_VALUE)
    );
    gl_panel.setVerticalGroup(
        gl_panel.createParallelGroup(Alignment.LEADING)
            .addGroup(gl_panel.createSequentialGroup()
                .addComponent(textArea, GroupLayout.PREFERRED_SIZE, 100, GroupLayout.PREFERRED_SIZE)
                .addGroup(gl_panel.createParallelGroup(Alignment.LEADING)
                    .addGroup(gl_panel.createSequentialGroup()
                        .addGap(1)
                        .addGroup(gl_panel.createParallelGroup(Alignment.TRAILING, false)
                            .addGroup(gl_panel.createSequentialGroup()
                                .addComponent(sendTextButton, GroupLayout.PREFERRED_SIZE, 19, GroupLayout.PREFERRED_SIZE)
                                .addPreferredGap(ComponentPlacement.RELATED))
                            .addGroup(gl_panel.createSequentialGroup()
                                .addComponent(closeChatButton, GroupLayout.PREFERRED_SIZE, 19, GroupLayout.PREFERRED_SIZE)
                                .addPreferredGap(ComponentPlacement.RELATED)))
                        .addGap(0, 0, Short.MAX_VALUE))
                    .addGroup(gl_panel.createSequentialGroup()
                        .addGap(1)
                        .addComponent(textField, GroupLayout.PREFERRED_SIZE, GroupLayout.DEFAULT_SIZE, GroupLayout.PREFERRED_SIZE)
                        .addGap(1))))
    );
    this.setLayout(gl_panel);
}
}

и вот как я добавляю эти панели чата в chatTabbedPane

chatPanel newChat = new chatPanel(chatRef);
chatTabbedPane.addTab("title", null, newChat, null);

Я хочу уменьшить размер chatPanel с уменьшением размера фрейма приложения.


person gagan1411    schedule 17.02.2014    source источник
comment
я могу только рекомендовать BorderLayout. Поместите Editor в центр, а затем остальные панели на ЮГ и на ЗАПАД. Вы не получите никаких проблем с переполнением в этой ситуации   -  person Oliver Watkins    schedule 17.02.2014


Ответы (1)


Я только что столкнулся с этой проблемой, и ответ типа «просто используйте другой менеджер компоновки» не является ответом, который я готов принять.

Чтобы ответить на ваш вопрос, перенос строки все портит.

textArea.setLineWrap(true);

Прокомментируйте эту строку и проверьте еще раз, чтобы увидеть, что она будет уменьшаться в размере окна/фрейма, как и ожидалось.

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

person BillyGalbreath    schedule 14.04.2014