[英]Swing App - Adjusting Position of East Panel Components
I have a problem with text field and combo box components which are set on the east panel. 我在东面板上设置的文本字段和组合框组件有问题。 For some reason, when I added Box layout to arrange them by Y, some of the components listed above, doesn't align and scale size properly with buttons, just as they should be.
出于某种原因,当我添加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();
}
}
Several issues arise in your example: 您的示例中出现几个问题:
" In general , all the components controlled by a top-to-bottom BoxLayout
object should have the same X alignment." “ 通常 ,由顶部到底部
BoxLayout
对象控制的所有组件都应具有相同的X对齐方式。”
Specify the initial size of a JTextField
using the appropriate constructor. 使用适当的构造函数指定
JTextField
的初始大小。
Don't use setPreferredSize()
when you really mean to override getPreferredSize()
. 当您确实要覆盖
getPreferredSize()
时,请勿使用setPreferredSize()
getPreferredSize()
。
Invoke pack()
and then set the location & visibility. 调用
pack()
, 然后设置位置和可见性。
Use initial threads correctly. 正确使用初始线程 。
Don't needlessly extend a top-level component , eg JFrame
. 不必不必要地扩展顶级组件 ,例如
JFrame
。
Avoid this pitfall on non-resizable container. 避免在不可调整大小的容器上出现此陷阱 。
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();
}
});
}
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.