java - 使用 Java Swing 构建 UI

标签 java swing

我应该如何使用 Java Swing 构建此 UI,而不使用 GUI 构建器?

我不需要解决方案,只需要一些有关如何开始使用此问题的一般指导。具体来说,是选择最佳布局和 Swing 组件来完成工作的提示。

enter image description here

到目前为止我所做的是构建一个带有标签、文本字段对的 JFrame,如下所示:

import java.awt.*;
import javax.swing.*;

import javax.swing.border.TitledBorder;

class AdminForm {

    AdminForm() {
        JFrame f = new JFrame("Panel Example");
        JPanel gui = new JPanel(new BorderLayout(2,2));

        JPanel labelFields = new JPanel(new BorderLayout(2,2));
        labelFields.setBorder(new TitledBorder("BorderLayout"));

        JPanel labels = new JPanel(new GridLayout(0,2,1,1));
        labels.setBorder(new TitledBorder("GridLayout"));
        JPanel fields = new JPanel(new GridLayout(0,2,1,1));
        fields.setBorder(new TitledBorder("GridLayout"));

        for (int ii=1; ii<8; ii++) {
            labels.add(new JLabel("Label " + ii));
            // if these were of different size, it would be necessary to
            // constrain them using another panel
            labels.add(new JTextField(10));
        }

        labelFields.add(labels, BorderLayout.CENTER);
        //labelFields.add(fields, BorderLayout.EAST);

        gui.add(labelFields, BorderLayout.NORTH);
        //gui.add(guiCenter, BorderLayout.CENTER);

        f.add(gui);
        f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        f.setVisible(true);
    }

    public static void main(String[] args) throws Exception {
        //Create the GUI on the event dispatching thread
        SwingUtilities.invokeLater(new Runnable(){
            @Override
            public void run() {
                new AdminForm();
            }
        });
    }
}

担忧:

  • 我不确定我是否使用了最佳布局配置来获取标签 和文本字段列表到位。有更好的方法吗?

  • 当我运行此命令时,面板缩小了。我想我需要指定一个 面板尺寸?

  • 显然我需要在其右侧放置另一个面板。如何引入新面板并使其与我已有的面板保持一致?

最佳答案

当您使用Layout Managers时你需要知道你可以将它们结合起来。您可能会问“我该怎么做?”

简单,将 JPanel 嵌套在彼此内部,每个 JPanel 都有自己的布局管理器。

对于您的具体案例,我看到以下结构:

JFrame (The window)
    JPanel (The main pane) - Flow Layout (Default layout of a JPanel)
        JPanel (Left pane) - GridLayout (As your image shows, all labels & fields have the same size)
        JPanel (Right pane) - GridBagLayout (It's a weird accomodation of the buttons, so I did my best to replicate & give a better look)

正如您所看到的,我们在另一个 JPanel 中嵌套了 2 个 JPanel,每个 JPanel 都有不同的布局,这有助于提供不同的住宿。

以下代码产生此输出:

enter image description here

import java.awt.Color;
import java.awt.GridBagConstraints;
import java.awt.GridBagLayout;
import java.awt.GridLayout;
import java.awt.Insets;

import javax.swing.BorderFactory;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.JTextField;
import javax.swing.SwingUtilities;

public class AdminForm {
    private static final String[] labels = {"Car Number", "Car No. Plate", "Model", "Capacity", "Date Purchased",
            "Insurance Status", "Date Insured", "Insurance Expiry Date", "Availability"};
    
    private JFrame frame;
    private JPanel pane;
    private JPanel leftPane;
    private JPanel rightPane;
    private JTextField[] fields;
    private JButton searchButton;
    private JTextField searchField;
    private JButton updateButton;
    private JButton deleteButton;
    private JButton clearButton;
    private JButton nextButton;
    private JButton previousButton;
    
    public static void main(String[] args) {
        SwingUtilities.invokeLater(new AdminForm()::createAndShowGUI);
    }
    
    private void createAndShowGUI() {
        frame = new JFrame();
        pane = new JPanel();
        leftPane = createLeftPane();
        rightPane = createRightPane();
        
        pane.add(leftPane);
        pane.add(rightPane);
        
        frame.add(pane);
        frame.pack();
        frame.setVisible(true);
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    }
    
    private JPanel createRightPane() {
        JPanel panel = new JPanel();
        
        searchButton = new JButton("Search");
        searchField = new JTextField(10);
        updateButton = new JButton("Update");
        deleteButton = new JButton("Delete");
        clearButton = new JButton("Clear");
        nextButton = new JButton("Next");
        previousButton = new JButton("Previous");
        
        panel.setLayout(new GridBagLayout());
        
        GridBagConstraints gbc = new GridBagConstraints();
        
        gbc.gridx = 0;
        gbc.gridy = 0;
        gbc.fill = GridBagConstraints.BOTH;
        gbc.insets = new Insets(5, 5, 5, 5);
        
        panel.add(searchButton, gbc);
        
        gbc.gridy++;
        gbc.gridwidth = 2;
        
        panel.add(searchField, gbc);
        
        gbc.gridy++;
        gbc.gridwidth = 1;
        
        panel.add(updateButton, gbc);
        
        gbc.gridy++;
        
        panel.add(deleteButton, gbc);
        
        gbc.gridx++;
        panel.add(clearButton, gbc);
        
        gbc.gridx = 0;
        gbc.gridy++;
        
        panel.add(nextButton, gbc);
        
        gbc.gridy++;
        panel.add(previousButton, gbc);
        
        panel.setBorder(BorderFactory.createLineBorder(Color.GRAY));
        
        return panel;
    }
    
    private JPanel createLeftPane() {
        JPanel panel = new JPanel();
        fields = new JTextField[labels.length];
        
        panel.setLayout(new GridLayout(0, 2, 5, 5));
        
        for (int i = 0; i < fields.length; i++) {
            fields[i] = new JTextField(10);
            
            //This makes text fields not editable for certain ones.
            switch (i) {
                case 4:
                case 6:
                case 7:
                case 8:
                    fields[i].setEditable(false);
                    break;
                default:
                    break;
            }
            
            panel.add(new JLabel(labels[i]));
            panel.add(fields[i]);
        }
        
        //Investigate how to change color of border, etc
        panel.setBorder(BorderFactory.createTitledBorder(BorderFactory.createLineBorder(Color.GRAY), "Update Data"));
        
        return panel;
    }
}

只需调整这些值即可获得所需的输出。

旁注:

给你的变量更好的命名,稍后你会问“什么是f”?

JFrame f = new JFrame("Panel Example");

关于java - 使用 Java Swing 构建 UI,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50949189/

相关文章:

java - Findbugs BC_UNCONFIRMED_CAST 警告

c# - 从已部署的应用程序中检索最后一次提交 ID/修订号

java - 如何修复java中的NoClassDefFoundError

java - 如何向 JFrame 添加文本?

java - BouncycaSTLe 依赖冲突

java - XmlPullParser 未关闭标记忽略

java - JScrollPane 滚动条在 JEditorPane.setText() 上向下跳转

java - 将特定于操作系统的窗口渲染到 BufferedImage

java - 在我创建 JPanel 的同一部分绘制网格线?

java - 没有参数的 Lambda 函数 - 无法推断功能接口(interface)类型