我遇到了在东面板上设置的文本字段和组合框组件的问题。出于某种原因,当我添加Box布局以按Y排列它们时,上面列出的某些组件没有与按钮正确对齐和缩放大小,就像它们应该一样。
import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.Dimension;
import java.awt.FlowLayout;
import javax.swing.BorderFactory;
import javax.swing.Box;
import javax.swing.JButton;
import javax.swing.JComboBox;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.JTable;
import javax.swing.JTextField;
/**
*
* @author Isaac
*/
public class Test2 extends JFrame {
private JButton addNewColumnButton;
private JButton calculateColumnButton;
private JButton resultButton;
private JLabel textLabel;
private JTextField columnField;
private JTextField resultField;
private JComboBox columnListCB;
private JTable table;
private String[] tableCols = {"Fisrt Column", "Second Column", "Third Column", "", "", "", "", ""};
private Object[][] tableRows = {
{true, null, null, null, null, null, null, null},
{true, null, null, null, null, null, null, null},
{true, null, null, null, null, null, null, null},
{true, null, null, null, null, null, null, null},
{true, null, null, null, null, null, null, null},
{true, null, null, null, null, null, null, null},
{true, null, null, null, null, null, null, null},
{true, null, null, null, null, null, null, null}
};
public Test2() {
this.setSize(new Dimension(600, 280));
this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
this.setLocationRelativeTo(null);
this.setResizable(false);
this.init();
this.add(getUIPanel());
this.pack();
this.setVisible(true);
}
private JPanel getUIPanel() {
JPanel panel = new JPanel(new BorderLayout());
panel.setBorder(BorderFactory.createEmptyBorder(5, 5, 5, 5));
panel.setBackground(Color.blue);
JPanel center = new JPanel();
center.add(table);
JPanel eastPanel = new JPanel();
eastPanel.setBackground(Color.MAGENTA);
Box eastPanelBox = Box.createVerticalBox();
eastPanelBox.add(addNewColumnButton);
eastPanelBox.add(Box.createVerticalStrut(14));
eastPanelBox.add(columnField);
eastPanelBox.add(Box.createVerticalStrut(5));
eastPanelBox.add(columnListCB);
eastPanelBox.add(Box.createVerticalStrut(5));
eastPanelBox.add(calculateColumnButton);
eastPanel.add(eastPanelBox);
JPanel southPanel = new JPanel(new FlowLayout(FlowLayout.LEFT, 5, 5));
southPanel.setBackground(Color.green);
southPanel.add(resultButton);
southPanel.add(textLabel);
southPanel.add(resultField);
panel.add(center, BorderLayout.WEST);
panel.add(southPanel, BorderLayout.SOUTH);
panel.add(eastPanel, BorderLayout.EAST);
return panel;
}
private void init() {
final int COMPONENT_WIDTH = 130;
final int COMPONENT_HEIGHT = 25;
table = new JTable(tableRows, tableCols);
addNewColumnButton = new JButton("New Column");
addNewColumnButton.setPreferredSize(new Dimension(COMPONENT_WIDTH, COMPONENT_HEIGHT));
columnField = new JTextField();
columnField.setPreferredSize(new Dimension(COMPONENT_WIDTH, COMPONENT_HEIGHT));
columnListCB = new JComboBox(tableCols);
columnListCB.setPreferredSize(new Dimension(COMPONENT_WIDTH, COMPONENT_HEIGHT));
calculateColumnButton = new JButton("Calculate Column");
calculateColumnButton.setPreferredSize(new Dimension(COMPONENT_WIDTH, COMPONENT_HEIGHT));
resultButton = new JButton("Calculate");
calculateColumnButton.setPreferredSize(new Dimension(COMPONENT_WIDTH, COMPONENT_HEIGHT));
textLabel = new JLabel("Result:");
resultField = new JTextField();
resultField.setPreferredSize(new Dimension(COMPONENT_WIDTH / 2, COMPONENT_HEIGHT));
}
public static void main(String[] args) {
new Test2();
}
}
答案 0 :(得分:1)
您的示例中出现了几个问题:
“In general,由顶部到底部BoxLayout
对象控制的所有组件应具有相同的X对齐。”
使用适当的构造函数指定JTextField
的初始大小。
如果您真的要覆盖getPreferredSize()
,请不要使用setPreferredSize()
。
调用pack()
和然后设置位置&可视性。
正确使用initial threads。
不要不必要地延长top-level component,例如JFrame
。
在不可调整大小的容器上避免使用此pitfall。
import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.Dimension;
import java.awt.EventQueue;
import java.awt.FlowLayout;
import java.awt.GridLayout;
import javax.swing.BorderFactory;
import javax.swing.Box;
import javax.swing.JButton;
import javax.swing.JComboBox;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.JScrollPane;
import javax.swing.JTable;
import javax.swing.JTextField;
/**
* @author Isaac
* @see https://stackoverflow.com/a/18037704/230513
*/
public class Test2 {
private JButton addNewColumnButton;
private JButton calculateColumnButton;
private JButton resultButton;
private JLabel textLabel;
private JTextField columnField;
private JTextField resultField;
private JComboBox columnListCB;
private JTable table;
private String[] tableCols = {
"Fisrt Column", "Second Column", "Third Column"
};
private Object[][] tableRows = {
{true, null, null, null, null, null, null, null},
{true, null, null, null, null, null, null, null},
{true, null, null, null, null, null, null, null},
{true, null, null, null, null, null, null, null},
{true, null, null, null, null, null, null, null},
{true, null, null, null, null, null, null, null},
{true, null, null, null, null, null, null, null},
{true, null, null, null, null, null, null, null}
};
public Test2() {
JFrame f = new JFrame("Test2");
f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
f.add(getUIPanel());
f.pack();
f.setLocationRelativeTo(null);
f.setVisible(true);
}
private JPanel getUIPanel() {
JPanel panel = new JPanel(new BorderLayout());
panel.setBorder(BorderFactory.createEmptyBorder(5, 5, 5, 5));
panel.setBackground(Color.blue);
JPanel center = new JPanel(new GridLayout());
table = new JTable(tableRows, tableCols);
table.setPreferredScrollableViewportSize(new Dimension(240, 120));
center.add(new JScrollPane(table));
JPanel eastPanel = new JPanel();
eastPanel.setBackground(Color.MAGENTA);
Box eastPanelBox = Box.createVerticalBox();
addNewColumnButton = new JButton("New Column");
addNewColumnButton.setAlignmentX(Box.CENTER_ALIGNMENT);
eastPanelBox.add(addNewColumnButton);
eastPanelBox.add(Box.createVerticalStrut(14));
columnField = new JTextField();
columnField.setAlignmentX(Box.CENTER_ALIGNMENT);
eastPanelBox.add(columnField);
eastPanelBox.add(Box.createVerticalStrut(5));
columnListCB = new JComboBox(tableCols);
columnListCB.setAlignmentX(Box.CENTER_ALIGNMENT);
eastPanelBox.add(columnListCB);
eastPanelBox.add(Box.createVerticalStrut(5));
calculateColumnButton = new JButton("Calculate Column");
calculateColumnButton.setAlignmentX(Box.CENTER_ALIGNMENT);
eastPanelBox.add(calculateColumnButton);
eastPanel.add(eastPanelBox);
JPanel southPanel = new JPanel(new FlowLayout(FlowLayout.LEFT, 5, 5));
southPanel.setBackground(Color.green);
resultButton = new JButton("Calculate");
southPanel.add(resultButton);
textLabel = new JLabel("Result:");
southPanel.add(textLabel);
resultField = new JTextField(10);
southPanel.add(resultField);
panel.add(center, BorderLayout.WEST);
panel.add(southPanel, BorderLayout.SOUTH);
panel.add(eastPanel, BorderLayout.EAST);
return panel;
}
public static void main(String[] args) {
EventQueue.invokeLater(new Runnable() {
@Override
public void run() {
new Test2();
}
});
}
}