1

我正在制作一个简单的聊天 GUI。我遇到了一个问题,我的程序没有随着聊天的进行而向下滚动。我也不确定如何在程序中添加滚动条/窗格,而不会通过将我的主要文本区域放入面板并破坏界面外观来搞砸一切。如何调整主聊天框,而不会通过将其chatBox放入 JPanel 来搞砸并使其看起来很丑陋。我将在下面发布我的所有代码。

MainGUI类:

package coltGUI;

import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.GridBagConstraints;
import java.awt.GridBagLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;

import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.JScrollPane;
import javax.swing.JTextArea;
import javax.swing.JTextField;
import javax.swing.ScrollPaneConstants;
import javax.swing.UIManager;

public class MainGUI implements ActionListener {

    public static void main(String[] args) {
        try {
            UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName());
        } catch (Exception e) {
            e.printStackTrace();
        }

        MainGUI gui = new MainGUI();
        gui.display();
    }

    JButton sendMessage;
    JTextField messageBox;
    JTextArea chatBox;

    public void display() {

        JFrame frame = new JFrame("Colt Chat");
        JPanel southPanel = new JPanel();

        frame.getContentPane().add(BorderLayout.SOUTH, southPanel);
        southPanel.setBackground(Color.BLUE);
        southPanel.setLayout(new GridBagLayout());

        messageBox = new JTextField(30);
        sendMessage = new JButton("Send Message");
        chatBox = new JTextArea();
        chatBox.setEditable(false);
        frame.getContentPane().add(BorderLayout.CENTER, chatBox);

        chatBox.setLineWrap(true);

        GridBagConstraints left = new GridBagConstraints();
        left.anchor = GridBagConstraints.WEST;
        GridBagConstraints right = new GridBagConstraints();
        right.anchor = GridBagConstraints.EAST;
        right.weightx = 2.0;

        southPanel.add(messageBox, left);
        southPanel.add(sendMessage, right);

        sendMessage.addActionListener(this);
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        frame.setVisible(true);
        frame.setSize(470, 300);
    }

    public void actionPerformed(ActionEvent event) {
        if (messageBox.getText().length() < 1) {
            // do nothing 
        } else {
            chatBox.append(messageBox.getText() + "\n");
            messageBox.setText("");
        }
    }
}
4

2 回答 2

4

只需将文本区域添加到 JScrollPane,然后将滚动窗格添加到框架。不需要面板。

//frame.getContentPane().add(BorderLayout.CENTER, chatBox);
frame.add(new JScrollPane(chatBox), BorderLayout.CENTER);

请注意,约束应指定为 add(...) 方法的第二个参数,而不是第一个参数。

此外,从 JDK5 开始,您不需要使用 getContentPane(),frame.add(..) 方法将为您完成此操作。

如果您想要自动滚动,您可以查看Text Area Scrolling

于 2013-04-22T02:27:45.397 回答
2

首先,您需要chatBoxJScrollPane这样包装:

frame.add(new JScrollPane(chatBox), BorderLayout.CENTER);

其次,将消息附加到chatBox您需要强制它滚动到末尾,这可以通过以下方式完成:

chatBox.setCaretPosition(chatBox.getDocument().getLength());
于 2013-04-22T02:28:37.573 回答