Java Swing 面板布局

问题描述 投票:0回答:2

我正在为大学开发一个 Java 项目,其中涉及设置 TCP 服务器和客户端。我已经完成了该部分的工作,现在为了给我的项目添加更多感觉,我想添加一个 GUI。

我们还没有开始学习 Java 中的 GUI。不过我想尝试一下,因为我认为这将是一个有用的练习。我设置了一个非常基本的 GUI,并为按钮设置了适当的 ActionListener。我的下一个问题是定位我的面板,使它们在框架上看起来整洁......

目前我将所有组件都放在一个面板中,如下所示:

public ClientGUI(){

    //Initialise Frame
    frame = new JFrame("TCP Client");

    //Initialise Panel 1 & Components
    p1 = new JPanel();

    //Set Layout
    p1.setLayout(new GridLayout(1,2));

    //Label 1 - For TextArea
    l1 = new JLabel("Chat Log");
    p1.add(l1);

    //TextArea - To display conversation
    t1 = new JTextArea(10,10);
    p1.add(t1);

    //Label 2 - For TextField
    l2 = new JLabel("Message");
    p1.add(l2);

    //Message Box - For user input
    t2 = new JTextField(10);
    p1.add(t2);

    //Button 1 - To send message
    b1 = new JButton("Send");
    p1.add(b1);

    //Add panels to frame
    frame.add(p1);

    //Frame properties...
    frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    frame.setSize(400,400);
    frame.setVisible(true);

    //Add Event listener to button
    b1.addActionListener(new ActionListener(){
        public void actionPerformed(ActionEvent ev){
            //do something
            t1.setText(t2.getText());
        }
    });

我希望它看起来像下面的粗略线框。

Desired Layout

如果有人提供任何反馈,我将不胜感激!非常感谢。

java swing jframe jpanel layout-manager
2个回答
3
投票

您想要的称为 BoxLayout,它以列或行的形式提供 UI 元素。 然后你可以将它们嵌套在一起,例如将一个水平框布局面板作为另一个垂直框布局面板中的元素(有点像嵌套的 HTML 表格)。 因此,所有元素都将进入顶级垂直 BoxLayout,并且具有 JLabel2 和 JTextField 的行将是其自己的水平 BoxLayout,嵌套在顶级垂直布局中。 Here是一个关于布局管理器的相当不错的教程,它包括 BoxLayout。


3
投票

有很多不同的方法,也有很多不同的

LayoutManager
可以使用。 在这里阅读更多关于它们的信息:

这是我制作的一个例子,它使用

GridBagLayout

enter image description here

//necessary imports
import java.awt.BorderLayout;
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.JLabel;
import javax.swing.JPanel;
import javax.swing.JScrollPane;
import javax.swing.JTextArea;
import javax.swing.JTextField;
import javax.swing.UIManager;
import javax.swing.UIManager.LookAndFeelInfo;

public class Test {

    /**
     * Default constructor for Test.class
     */
    public Test() {
        initComponents();
    }

    public static void main(String[] args) {
        /**
         * Set look and feel of app
         */
        try {
            for (LookAndFeelInfo info : UIManager.getInstalledLookAndFeels()) {
                if ("Nimbus".equals(info.getName())) {
                    UIManager.setLookAndFeel(info.getClassName());
                    break;
                }
            }
        } catch (Exception e) {
            // If Nimbus is not available, you can set the GUI to another look and feel.
        }
        /**
         * Create GUI and components on Event-Dispatch-Thread
         */
        javax.swing.SwingUtilities.invokeLater(new Runnable() {
            @Override
            public void run() {
                Test test = new Test();
            }
        });
    }

    /**
     * Initialize GUI and components (including ActionListeners etc)
     */
    private void initComponents() {

        JFrame jFrame = new JFrame("Chat Test");
        jFrame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        jFrame.setResizable(false);

        //Initialise Panel 1 & Components
        JPanel p1 = new JPanel(new GridBagLayout());
        JPanel p2 = new JPanel(new GridBagLayout());
        //Label 1 - For TextArea
        JLabel l1 = new JLabel("Chat Log");
        //TextArea - To display conversation
        final JTextArea t1 = new JTextArea(10, 10);
        JScrollPane pane = new JScrollPane(t1);
        //Label 2 - For TextField
        JLabel l2 = new JLabel("Message");
        //Message Box - For user input
        final JTextField t2 = new JTextField(10);
        //Button 1 - To send message
        JButton b1 = new JButton("Send");

        GridBagConstraints gc = new GridBagConstraints();

        gc.fill = GridBagConstraints.HORIZONTAL;
        gc.weightx = 1;
        gc.gridx = 0;
        gc.gridy = 0;
        p1.add(l1, gc);

        gc.gridx = 0;
        gc.gridy = 1;
        p1.add(pane, gc);

        GridBagConstraints gc2 = new GridBagConstraints();
        gc2.fill = GridBagConstraints.HORIZONTAL;
        gc2.weightx = 1;
        gc2.gridx = 0;
        gc2.gridy = 0;
        gc2.ipadx = 10;
        p2.add(l2, gc2);

        gc2.gridx = 1;
        gc2.gridy = 0;
        p2.add(t2, gc2);

        gc2.gridx = 1;
        gc2.gridy = 1;
        p2.add(b1, gc2);

        b1.addActionListener(new ActionListener() {
            @Override
            public void actionPerformed(ActionEvent ev) {
                //do something
                t1.setText(t2.getText());
            }
        });

        jFrame.add(p1, BorderLayout.CENTER);
        jFrame.add(p2, BorderLayout.SOUTH);

        //pack frame (size JFrame to match preferred sizes of added components and set visible
        jFrame.pack();
        jFrame.setVisible(true);
    }
}
© www.soinside.com 2019 - 2024. All rights reserved.