繁体   English   中英

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

[英]How to set the size of the JTextArea and JTextField to my liking in the following code?

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

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

尽管我在以下几行中指定了它们的大小,但是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来归档您的想法。 我建议您查看《布局管理器视觉指南》 ,看看哪种布局最适合您的需求。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM