当我需要向用户展示一些带有保存或取消按钮的非常复杂的界面并且需要这个界面来正确处理不同的显示器分辨率时,我遇到了无穷无尽的问题。例如,假设这个接口需要在一个 1280 x 768 的显示器中容纳 17 个 JTextField 和一个可调整大小的 JTextArea(我的 13 英寸笔记本电脑的垂直尺寸为 760 像素)。
这是一个SSCCE:
import java.awt.*;
import javax.swing.*;
public class OptionPanePanel extends JFrame
{
private static Container layoutComponents(String title, float alignment)
{
JPanel container = new JPanel();
BoxLayout layout = new BoxLayout(container, BoxLayout.Y_AXIS);
container.setLayout(layout);
for (int i = 0, n = 7; i < n; i++)
{
JTextField jtextField= new JTextField("jtextfield "+i, n);
jtextField.setAlignmentX(alignment);
container.add(jtextField);
container.add( new javax.swing.Box.Filler(new java.awt.Dimension(0, 20), new java.awt.Dimension(0, 20),
new java.awt.Dimension(32767, 20)));
}
JTextArea jTextArea = new JTextArea(15, 30);
container.add(jTextArea);
for (int i = 6, n = 13; i < n; i++)
{
JTextField jtextField= new JTextField("jtextfield "+i, n);
jtextField.setAlignmentX(alignment);
container.add(jtextField);
container.add( new javax.swing.Box.Filler(new java.awt.Dimension(0, 20), new java.awt.Dimension(0, 20),
new java.awt.Dimension(32767, 20)));
}
return container;
}
public static void main(String args[])
{
Container panel1 = layoutComponents("Left", Component.LEFT_ALIGNMENT);
JOptionPane.showConfirmDialog(
null, panel1, "addRecord", JOptionPane.OK_CANCEL_OPTION, JOptionPane.PLAIN_MESSAGE);
}
}
现在我希望上面的例子表现得这样:
- 窗口大小调整不裁剪任何内容
- 根据显示器的分辨率,窗口的大小会有所不同。
- 我不必静态指定 maximumSize、MinimumSize 和 preferredSize(例如使用 NetBeans GUI 编辑器),因此每次我必须进行大量测试才能找出正确的大小
- JtextArea 根据最大垂直分辨率垂直调整自身大小。