java - 如何在以下代码中根据我的喜好设置 JTextArea 和 JTextField 的大小?

标签 java swing jscrollpane layout-manager boxlayout

忽略功能。我只对 GUI 感兴趣。

我使用了一个名为 mainPanel 的 JPanel 组件,并向其中添加了一个名为 receiveWindow 的 JTextArea 和一个名为 sendWindow 的 JTextField。

尽管我在以下几行中指定了 receiveWindow 和 sendWindow 的大小,但 receiveWindow 和 sendWindow 占据了整个框架空间:

receivingWindow = new JTextArea(50,50);
sendWindow = new JTextField(30);

如何根据自己的喜好设置它们的大小?

完整代码如下:

package hf;

import java.io.*;
import java.net.*;
import java.awt.*;
import java.awt.event.*;

import javax.swing.*;
import javax.swing.event.*;

public class ChatClient 
{
    private JFrame frame;
    private JTextArea receivingWindow;
    private JTextField sendWindow;
    private JButton sendButton;
    private JPanel mainPanel;
    private Socket connectionSocket;
    private final static int serverPortNumber = 5000;
    private PrintWriter printWriter;
    private BufferedReader incomingReader;
    private InputStreamReader incomingInputStreamReader;
    private JScrollPane scrollPane;

    public static void main(String[] args)
    {
        ChatClient chatClient = new ChatClient();
        chatClient.startUp();
    }

    public void startUp()
    {
        setUpGui();
        setUpNetworking();
        handleEvents();
        setUpListenerThread();
        displayFrame();
    }

    private void setUpGui()
    {
        frame = new JFrame("Chat Client");
        receivingWindow = new JTextArea(50,50);
        sendWindow = new JTextField(30);
        sendButton = new JButton("Send");
        mainPanel = new JPanel();
        mainPanel.setLayout(new BoxLayout(mainPanel,BoxLayout.PAGE_AXIS));
        scrollPane = new JScrollPane(receivingWindow);
        scrollPane.setHorizontalScrollBarPolicy(ScrollPaneConstants.HORIZONTAL_SCROLLBAR_NEVER);
        scrollPane.setVerticalScrollBarPolicy(ScrollPaneConstants.VERTICAL_SCROLLBAR_ALWAYS);
        mainPanel.add(scrollPane);
        mainPanel.add(sendWindow);
        mainPanel.add(sendButton);
        frame.getContentPane().add(BorderLayout.CENTER, mainPanel);
    }

    private void handleEvents()
    {
        sendButton.addActionListener(new MySendButtonListener());
    }

    private void setUpNetworking()
    {
        try
        {
            connectionSocket = new Socket("127.0.0.1",serverPortNumber);
            printWriter = new PrintWriter(connectionSocket.getOutputStream());
            incomingInputStreamReader = new InputStreamReader(connectionSocket.getInputStream());
            incomingReader = new BufferedReader(incomingInputStreamReader);
        }
        catch(Exception ex)
        {
            System.out.println("Error in connecting to the server.");
        }
    }

    private class MySendButtonListener implements ActionListener
    {
        public void actionPerformed(ActionEvent event)
        {
            String message = sendWindow.getText();
            printWriter.println(message);
            printWriter.flush();
            sendWindow.setText("");
            sendWindow.requestFocus();
        }
    }

    private void setUpListenerThread()
    {
        try
        {
            Runnable incomingThread = new IncomingMessageRunnable();
            Thread thread = new Thread(incomingThread);
            thread.start();
        }
        catch(Exception ex)
        {
            System.out.println("Error in setting up thread for listening to incoming menssages.");
        }
    }

    private class IncomingMessageRunnable implements Runnable
    {
        public void run()
        {
            String incomingMessage = null;
            try
            {
                while((incomingMessage = incomingReader.readLine())!=null)
                {
                    receivingWindow.append(incomingMessage+"\n");
                }
            }
            catch(Exception e)
            {
                System.out.println("Error in receiving incoming messages");
            }
        }
    }

    private void displayFrame()
    {
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        frame.setSize(500, 500);
        frame.setVisible(true);
    }
}

最佳答案

您在代码中指定的实际上并不是面板上的大小,而是您的 JTextFieldJTextArea 分别有多少列和行或列。来自 Oracle Docs :

JTextArea(int rows, int columns)
    Constructs a new empty TextArea with the specified number of rows and columns.

JTextField(int columns)
    Constructs a new empty TextField with the specified number of columns.

您的组件占用了整个屏幕空间,因为您的 BoxLayout 将添加到面板的每个组件放入面板中,并在尊重其最大尺寸的同时垂直对齐它们,并且由于您尚未设置任何组件似乎填满了整个空间。

无论如何,我不会尝试归档像素完美的 GUI,而是找到一个更好的 LayoutManager 来归档您想要的内容。我建议你看看A Visual Guide to Layout Managers并查看哪种布局最适合您的需求。

关于java - 如何在以下代码中根据我的喜好设置 JTextArea 和 JTextField 的大小?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27526014/

相关文章:

java - 如何在调用另一个 JFrame 时删除一个 JFrame

java - 如何将光标移至 JScrollPane 内 JTextArea 的顶部

java - 无法连接到 SOCKS 代理 :Connection refused: connect

jquery - jscrollpane 不可见

java - Java 测量字符串对象大小

java - isPrime 对于相同的值返回不同的结果?

java - 如何使用 cursoradapter 实现自动完成

java - JTextArea 不会使用布局管理器收缩到 JPanel 内

java - JScrollPane 滚动条不可滚动

java - Mockito 模拟 ObjectOutputStream.writeObject 时出现 NullPointerException?