我应该如何使用 Java Swing 构建此 UI,而不使用 GUI 构建器?
我不需要解决方案,只需要一些有关如何开始使用此问题的一般指导。具体来说,是选择最佳布局和 Swing 组件来完成工作的提示。
到目前为止我所做的是构建一个带有标签、文本字段对的 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 都有不同的布局,这有助于提供不同的住宿。
以下代码产生此输出:
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/