我遇到了一个不寻常的问题,即JPanel中的所有对象都占用了JTextField的大小。即使我尝试在其他对象上强制调整大小,它们仍然会将为文本字段指定的大小作为自己的大小。例如,我正在尝试使用自己的方法设置单个面板,如下所示:
private JPanel setupID() {
JLabel projLbl = new JLabel("Project ID:");
JButton verifyBtn = new JButton("Verify ID");
projID = new JTextField(25);
verifyBtn.setToolTipText("Verifies that the entered ID is not already in use.");
JPanel theID = new JPanel(new GridLayout(1,0));
theID.add(projLbl);
theID.add(projID);
theID.add(verifyBtn);
return theID;
}
我最终得到的是一个看起来像这样的窗口......
正在加载的JFrame frame;
已调用frame.pack()
方法来自动调整帧大小。如果我在不同区域(例如WEST,CENTER,EAST)的BorderLayout()
中创建单个对象,它们将按预期工作,但是当它们被加载到面板中时,它们的大小都基于{{{ 1}}。任何想法为什么会这样?
答案 0 :(得分:2)
引用Java的documentation:
GridLayout类是一个布局管理器,它在矩形网格中布置容器的组件。容器分为大小相等的矩形,每个矩形中放置一个组件[...]
我的猜测是矩形大小是基于最大组件的首选大小。 您应该使用替代布局,GridBagLayout可能更适合您的需求。
答案 1 :(得分:2)
正如Code-Guru和asemax指出的那样。您似乎正在使用GridLayout
,它旨在使用可用空间均匀地布局网格中的组件。
尝试使用类似GridBagLayout
的内容......
public class BadLayout08 {
public static void main(String[] args) {
new BadLayout08();
}
public BadLayout08() {
EventQueue.invokeLater(new Runnable() {
@Override
public void run() {
try {
UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName());
} catch (Exception ex) {
}
JFrame frame = new JFrame("Testing");
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.setLayout(new BorderLayout());
frame.add(new TestPane());
frame.pack();
frame.setLocationRelativeTo(null);
frame.setVisible(true);
}
});
}
public class TestPane extends JPanel {
public TestPane() {
setLayout(new GridBagLayout());
add(new JLabel("Project ID:"));
add(new JTextField(25));
add(new JButton("Verify ID"));
}
}
}
当您需要决定使用哪种布局时,您可能会发现A Visual Guide to Layout Managers。[/ p>