Java 如何使聊天程序在聊天过程中向下滚动?
我正在制作一个简单的聊天GUI。我遇到了一个问题,聊天时我的程序没有向下滚动。我还不确定如何在程序中添加滚动条/窗格,而不将我的主文本区域放入面板并破坏界面外观,从而将所有内容都搞乱。如何调整主聊天框,而不将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
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你能更具体一点吗?我看了你的垃圾桶,但我不确定你想让我做什么