首页 > 解决方案 > 如何制作 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());
        }
    }
}

标签: javaawtlayout-managercardlayoutborder-layout

解决方案


这部分代码不正确。

    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) 只能有一个父容器。尝试为每个面板添加背景颜色,以便更轻松地检查组件是否已添加到具有预期布局的容器中。


推荐阅读