Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/apache-kafka/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 如何使聊天程序在聊天过程中向下滚动?_Java_Swing_User Interface_Chat - Fatal编程技术网

Java 如何使聊天程序在聊天过程中向下滚动?

Java 如何使聊天程序在聊天过程中向下滚动?,java,swing,user-interface,chat,Java,Swing,User Interface,Chat,我正在制作一个简单的聊天GUI。我遇到了一个问题,聊天时我的程序没有向下滚动。我还不确定如何在程序中添加滚动条/窗格,而不将我的主文本区域放入面板并破坏界面外观,从而将所有内容都搞乱。如何调整主聊天框,而不将chatBox放入JPanel,从而使其看起来丑陋。我将在下面发布我所有的代码 MainGUI类: package coltGUI; import java.awt.BorderLayout; import java.awt.Color; import java.awt.GridBagCo

我正在制作一个简单的聊天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("");
        }
    }
}
packagecoltgui;
导入java.awt.BorderLayout;
导入java.awt.Color;
导入java.awt.GridBagConstraints;
导入java.awt.GridBagLayout;
导入java.awt.event.ActionEvent;
导入java.awt.event.ActionListener;
导入javax.swing.JButton;
导入javax.swing.JFrame;
导入javax.swing.JPanel;
导入javax.swing.JScrollPane;
导入javax.swing.JTextArea;
导入javax.swing.JTextField;
导入javax.swing.ScrollPaneConstants;
导入javax.swing.UIManager;
公共类MainGUI实现ActionListener{
公共静态void main(字符串[]args){
试一试{
UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName());
}捕获(例外e){
e、 printStackTrace();
}
MainGUI=新的MainGUI();
gui.display();
}
JButton发送消息;
JTextField消息框;
JTextArea聊天室;
公共空间显示(){
JFrame=新JFrame(“柯尔特聊天”);
JPanel southPanel=新的JPanel();
frame.getContentPane().add(BorderLayout.SOUTH,southPanel);
南面板。背景(颜色。蓝色);
setLayout(新的GridBagLayout());
messageBox=新的JTextField(30);
sendMessage=新的JButton(“发送消息”);
chatBox=newjtextarea();
chatBox.setEditable(false);
frame.getContentPane().add(BorderLayout.CENTER,chatBox);
setLineWrap(true);
GridBagConstraints left=新的GridBagConstraints();
left.anchor=gridbagstraints.WEST;
GridBagConstraints right=新的GridBagConstraints();
right.anchor=gridbagstraints.EAST;
右权重x=2.0;
添加(messageBox,左侧);
添加(sendMessage,右);
sendMessage.addActionListener(此);
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.setVisible(true);
框架设置尺寸(470300);
}
已执行的公共无效操作(操作事件){
if(messageBox.getText().length()<1){
//无所事事
}否则{
append(messageBox.getText()+“\n”);
messageBox.setText(“”);
}
}
}

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

//frame.getContentPane().add(BorderLayout.CENTER, chatBox);
frame.add(new JScrollPane(chatBox), BorderLayout.CENTER);
注意,应该将约束指定为add(…)方法的第二个参数,而不是第一个参数

另外,由于JDK5,您不需要使用getContentPane(),frame.add(..)方法将为您完成这项工作


如果您想要自动滚动,您可以签出。

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

//frame.getContentPane().add(BorderLayout.CENTER, chatBox);
frame.add(new JScrollPane(chatBox), BorderLayout.CENTER);
注意,应该将约束指定为add(…)方法的第二个参数,而不是第一个参数

另外,由于JDK5,您不需要使用getContentPane(),frame.add(..)方法将为您完成这项工作


如果您想要自动滚动,您可以签出。

首先您需要在
JScrollPane
中包装
chatBox
,如下所示:

frame.add(new JScrollPane(chatBox), BorderLayout.CENTER);
在将消息附加到聊天框后的第二步,您需要强制它滚动到末尾,这可以通过以下操作完成:

chatBox.setCaretPosition(chatBox.getDocument().getLength());

首先,您需要在
JScrollPane
中包装
chatBox
,如下所示:

frame.add(new JScrollPane(chatBox), BorderLayout.CENTER);
在将消息附加到聊天框后的第二步,您需要强制它滚动到末尾,这可以通过以下操作完成:

chatBox.setCaretPosition(chatBox.getDocument().getLength());

自Java 1.5以来,不需要使用
frame.getContentPane()
frame.add
就足够了……谢谢,我更新了它,还翻阅了camickr指出的
add
的参数。@MadProgrammer我个人喜欢使用frame.getContentPane,因为它看起来更有条理。除非我没有使用任何BorderLayout功能。那就用
frame.add吧,自从Java 1.5以来,就不需要使用
frame.getContentPane()
frame.add
就足够了……谢谢,我更新了它,还翻阅了camickr指出的
add
的参数。@mad程序员我个人喜欢使用frame.getContentPane,因为它看起来更有条理。除非我没有使用任何BorderLayout功能。那就用
frame吧。添加
你可能想编辑一下你的
GridBagConstraints
,这样输入字段就变宽了:@Lonenebula你能更具体一点吗?我查看了你的粘贴箱,但我不确定你要我做什么。在上面的代码中,
messageBox
的witdh为0。也许一些外观仍然会显示你输入的字母,但我不是这样。将设置左右
gridbagconstraints
的代码替换为pastebin中的代码可以解决这一问题。(假设您希望
messageBox
填充
southPanel
中的空白)。然而,这会使
消息框
掩盖其背后的蓝色背景。@Lonenebula掩盖其背后的蓝色正是我想要的,它会使
消息框
看起来有一个轮廓,我有点喜欢。谢谢你的具体说明。你可能想编辑一下你的
GridBagConstraints
,这样输入字段就变宽了:@Lonenebula你能更具体一点吗?我看了你的垃圾桶,但我不确定你想让我做什么