java - 如何制作 TextArea 和列表填充面板?
问题描述
我正在创建一个 java 聊天应用程序,但客户端 GUI 中的 TextArea 和列表存在问题。我正在使用卡片布局在一个面板上登录并在另一个面板上聊天。但由于某种原因,TextArea 和 List 没有分别填满面板的中心和东部,在它们下方一直到我拥有的按钮面板留下了很多额外的空间。
我试图弄乱 TextArea 和列表的边框布局,但没有成功。
我很感激任何帮助。
import java.io.*;
import java.net.*;
import java.awt.*;
import java.awt.event.*;
import javax.swing.SwingUtilities;
public class ChatFrame extends Frame{
public ChatFrame(){
//setTitle("Chat Frame");
setSize(700,700);
addWindowListener(new WindowAdapter(){
public void windowClosing(WindowEvent we){
System.exit(0);
}
});
add(new ChatPanel(), BorderLayout.CENTER);
setVisible(true);
}
public static void main(String[] args){
ChatFrame ch = new ChatFrame();
}
}
class ChatPanel extends Panel implements ActionListener, Runnable{
Button connect;
Button disconnect;
int currentCard = 1;
CardLayout cl;
Panel cardPanel;
TextField tf2;
String name;
List l1 = new List();
TextField tf;
TextArea ta;
Socket s;
BufferedReader in;
PrintWriter out;
Thread t;
public ChatPanel(){
setLayout(new BorderLayout());
cardPanel = new Panel();
cl = new CardLayout();
cardPanel.setLayout(cl);
tf = new TextField(" ");
tf.addActionListener(this);
add(tf, BorderLayout.NORTH);
ta = new TextArea();
add(ta, BorderLayout.CENTER);
connect = new Button("Connect");
connect.addActionListener(this);
disconnect = new Button ("Disconnect");
disconnect.addActionListener(this);
disconnect.setEnabled(false);
Panel buttonPanel = new Panel();
buttonPanel.add(connect);
buttonPanel.add(disconnect);
add(buttonPanel, BorderLayout.SOUTH);
l1.addActionListener(this);
//l1.setSize(new Dimension(150, 400));
add(l1,BorderLayout.EAST);
Panel p1 = new Panel();
Panel p2 = new Panel();
tf2 = new TextField(" ");
tf2.addActionListener(this);
add(tf2, BorderLayout.NORTH);
p1.add(tf2);
p2.add(tf);
p2.add(ta);
p2.add(l1);
cardPanel.add(p1, BorderLayout.CENTER);
cardPanel.add(p2, BorderLayout.CENTER);
add(cardPanel, BorderLayout.CENTER);
}
public void actionPerformed(ActionEvent ae){
if((ae.getSource()==connect)){
try{
s = new Socket("localhost", 3000);
in = new BufferedReader(new InputStreamReader(s.getInputStream()));
out = new PrintWriter(s.getOutputStream(), true);
t = new Thread(this,"Whatever");
t.start();
}catch(UnknownHostException uhe){
System.out.println(uhe.getMessage());
}catch(IOException ioe){
System.out.println(ioe.getMessage());
}
connect.setEnabled(false);
disconnect.setEnabled(true);
cl.last(cardPanel);
name = tf2.getText();
out.println(name + " has entered the chat");
ChatFrame ch = (ChatFrame) SwingUtilities.getWindowAncestor(this);
ch.setTitle(name);
//l1.add(name);
}
else if(ae.getSource()== disconnect){
out.println(name + " has left the chat");
try{
s.close();
}catch(IOException ioe){
System.out.println(ioe.getMessage());
}
disconnect.setEnabled(false);
connect.setEnabled(true);
cl.first(cardPanel);
}
else if (ae.getSource()== tf){
String temp = tf.getText();
tf.setText("");
out.println(name + ": " + temp);
}
}
public void run(){
try{
for(;;){
ta.append(in.readLine() + "\n");
}
}catch(IOException ioe){
System.out.println(ioe.getMessage());
}
}
}
解决方案
这部分代码不正确。
add(l1,BorderLayout.EAST);
Panel p1 = new Panel();
Panel p2 = new Panel();
tf2 = new TextField(" ");
tf2.addActionListener(this);
add(tf2, BorderLayout.NORTH);
p1.add(tf2);
p2.add(tf);
p2.add(ta);
p2.add(l1);
一个组件 ( l1
) 只能有一个父容器。尝试为每个面板添加背景颜色,以便更轻松地检查组件是否已添加到具有预期布局的容器中。
推荐阅读
- python - 如何在 QML 中使用 QtWebEngine
- node.js - 如何在 Foreach 中同步运行 Mongoose Find
- html - 按元素抓取网页
- ios - 如何在 Xcode 中正确设置 UIButtons(图像)的约束?
- c - 这个基于指针的代码的答案是什么,为什么?
- c# - Windows IoT 上的多线程导致线程关闭
- java - BroadcastReceiver 未在 Android 8.1+ 上捕获呼叫事件
- reactjs - 具有循环连接的层次树
- java - 如何在我的单元测试中使用 Mockito 或任何 Mocking 框架来模拟 Guice 注入?
- firebase - 如何使用firebase云功能pubsub.schedule?