【发布时间】:2020-03-17 21:42:43
【问题描述】:
我正在尝试制作一个表单,dataIn 面板将有一个标签,后跟其各自的文本字段,供用户输入数据。
所以我发现 GridBagLayout 是最好的方法,但我还不知道如何使用它。
到目前为止,这是结果。我的整个表单是 BorderLayout 但我们只关注它的北部,用户将在那里输入数据。
这个北部容器包含一个 4 行 2 列的 GridLayout。 在这个 GridLayout 的 (0,0) 内部,我用 GridBagLayout、JLabel 和 JTextfield 创建了另一个面板。这个想法是让这个容器响应并填充现在显示为灰色的整个剩余区域,我希望它都是文本字段。
如果有人可以帮助我学习如何使用 GridBagLayout 来做到这一点,我将不胜感激。我知道我所做的可能不是最佳的,所以我会听取更好的建议。
谢谢。
import java.awt.*;
import javax.swing.*;
import javax.swing.table.DefaultTableCellRenderer;
import javax.swing.table.TableCellRenderer;
import java.awt.Insets;
import java.awt.event.*;
@SuppressWarnings("serial")
public class UserForm extends JFrame {
public UserForm() {
// Miscelaneous
Font font0 = new Font("Tahoma", Font.PLAIN, 12);
Font font1 = new Font("Tahoma", Font.BOLD, 11);
Font font2 = new Font("Tahoma", Font.BOLD, 12);
// Frame layout -> north: data-in form, center: Jtable displayed, south:
// buttons.
JPanel mainP = new JPanel(new BorderLayout(5, 25));
JPanel dataIn = new JPanel(new GridLayout(4, 2, 60, 3));
JPanel displayT = new JPanel(new BorderLayout(0, 20));
JPanel buttons = new JPanel(new GridLayout(0, 3, 10, 5));
// Data-In Form Components
JLabel idl = new JLabel("Id:");
JLabel namel = new JLabel("Name:");
JLabel ln1l = new JLabel("First Lastname:");
JLabel ln2l = new JLabel("Second Lastname:");
JLabel agl = new JLabel("Age:");
JLabel adl = new JLabel("Address:");
JLabel pnl = new JLabel("Phone Number:");
JLabel eml = new JLabel("E-Mail:");
JTextField idtf = new JTextField("");
JTextField nametf = new JTextField("");
JTextField ln1tf = new JTextField("");
JTextField ln2tf = new JTextField("");
JTextField agtf = new JTextField("");
JTextField adtf = new JTextField("");
JTextField pntf = new JTextField("");
JTextField emtf = new JTextField("");
// Data-In Form Containers
JPanel dataId = new JPanel(new GridBagLayout());
JPanel dataName = new JPanel(new GridBagLayout());
JPanel dataLN1 = new JPanel(new GridBagLayout());
JPanel dataLN2 = new JPanel(new GridBagLayout());
JPanel dataAg = new JPanel(new GridBagLayout());
JPanel dataAd = new JPanel(new GridBagLayout());
JPanel dataPN = new JPanel(new GridBagLayout());
JPanel dataEM = new JPanel(new GridBagLayout());
// Components into individual containers
// GridBagLayout Constraints label
GridBagConstraints c1 = new GridBagConstraints();
c1.gridx = 0;
c1.gridy = 0;
c1.gridwidth = 1;
c1.gridheight = 1;
c1.weightx = 0.5;
c1.anchor = GridBagConstraints.FIRST_LINE_START;
c1.insets = new Insets(3,10,0,0);
// GridBagLayout Constraints tf
GridBagConstraints c2 = new GridBagConstraints();
c2.gridx = 1;
c2.gridy = 0;
//c2.gridwidth = 4;
c2.gridheight = 1;
c2.weightx = 0.5;
c2.anchor = GridBagConstraints.WEST;
c2.insets = new Insets(3,0,0,10);
c2.fill = GridBagConstraints.HORIZONTAL;
dataId.add(idl, c1);
dataId.add(idtf, c2);
dataName.add(namel, c1);
dataName.add(nametf, c2);
dataLN1.add(ln1l, c1);
dataLN1.add(ln1tf, c2);
dataLN2.add(ln2l, c1);
dataLN2.add(ln2tf, c2);
dataAg.add(agl, c1);
dataAg.add(agtf, c2);
dataAd.add(adl, c1);
dataAd.add(adtf, c2);
dataPN.add(pnl, c1);
dataPN.add(pntf, c2);
dataEM.add(eml, c1);
dataEM.add(emtf, c2);
// Miscelaneous
idl.setFont(font2);
idtf.setFont(font0);
namel.setFont(font2);
nametf.setFont(font0);
ln1l.setFont(font2);
ln1tf.setFont(font0);
ln2l.setFont(font2);
ln2tf.setFont(font0);
agl.setFont(font2);
agtf.setFont(font0);
adl.setFont(font2);
adtf.setFont(font0);
pnl.setFont(font2);
pntf.setFont(font0);
eml.setFont(font2);
emtf.setFont(font0);
// Set tf editable
idtf.setEditable(true);
nametf.setEditable(true);
ln1tf.setEditable(true);
ln2tf.setEditable(true);
agtf.setEditable(true);
adtf.setEditable(true);
pntf.setEditable(true);
emtf.setEditable(true);
dataIn.add(dataId);
dataIn.add(dataAg);
dataIn.add(dataName);
dataIn.add(dataAd);
dataIn.add(dataLN1);
dataIn.add(dataPN);
dataIn.add(dataLN2);
dataIn.add(dataEM);
// JTable Creation
String[] headline = { "Id", "Name", "First Lastname", "Second Lastname", "Age", "Address", "Phone Number",
"E-Mail" };
String[][] data = { { "", "", "", "", "", "", "", "" }, { "", "", "", "", "", "", "", "" } };
JTable dataShow = new JTable(data, headline);
// Table Personalization
dataShow.getTableHeader().setFont(font1);
new HeaderRenderer(dataShow);
// Add to container
JPanel tableP = new JPanel(new BorderLayout(1, 1));
tableP.add(dataShow.getTableHeader(), BorderLayout.NORTH);
tableP.add(dataShow, BorderLayout.CENTER);
JScrollPane sP = new JScrollPane();
sP.setViewportView(tableP);
displayT.add(sP, BorderLayout.CENTER);
// buttons Components and Cointainers
JButton save = new JButton("Save");
JButton del = new JButton("Delete");
JButton edit = new JButton("Edit");
JLabel empty = new JLabel("");
// Add to button panel
buttons.add(save);
buttons.add(del);
buttons.add(edit);
buttons.add(empty);
// Miscelaneous
save.setFont(font2);
del.setFont(font2);
edit.setFont(font2);
// Add subpanels to main panel
mainP.add(dataIn, BorderLayout.NORTH);
mainP.add(displayT, BorderLayout.CENTER);
mainP.add(buttons, BorderLayout.SOUTH);
// set content pane
setContentPane(mainP);
setVisible(true);
setTitle("User Form");
setSize(900, 500);
setResizable(true);
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
// For future table filling
/*
* String ids = idtf.getText(); String names = nametf.getText(); String ln1s =
* ln1tf.getText(); String ln2s = ln2tf.getText(); String ags = agtf.getText();
* String ads = adtf.getText(); String pns = pntf.getText(); String ems =
* emtf.getText();
*/
}
public static void main(String[] args) {
// invoke runnable for thread safety
SwingUtilities.invokeLater(new Runnable() {
@Override
public void run() {
new UserForm();
}
});
}
// LEFT alignment renderer
private class HeaderRenderer implements TableCellRenderer {
DefaultTableCellRenderer renderer;
public HeaderRenderer(JTable table) {
renderer = (DefaultTableCellRenderer) table.getTableHeader().getDefaultRenderer();
renderer.setHorizontalAlignment(JLabel.LEFT);
}
@Override
public Component getTableCellRendererComponent(JTable table, Object value, boolean isSelected, boolean hasFocus,
int row, int col) {
return renderer.getTableCellRendererComponent(table, value, isSelected, hasFocus, row, col);
}
}
}
【问题讨论】:
-
但我们只关注它的北部, - 所以你发布的代码应该只是带有北部的框架,所以我们可以专注于代码导致问题。这称为minimal reproducible example。
-
1) 以最小尺寸提供 ASCII 艺术或 GUI 的 预期 布局的简单绘图,如果可调整大小,则具有更大的宽度和高度 - 以显示额外的应该使用空间。 2) 为了可用性,标签应该右对齐,文本字段左对齐,以便更紧密地关联控件与其标签。
-
关于我之前的评论:我认为像this GUI 这样的东西在美学上更令人愉悦和可用(因为标签更接近它们对应的字段)。这能满足您的要求吗?
标签: java swing user-interface layout-manager