【发布时间】:2013-03-09 13:00:44
【问题描述】:
当我需要向用户展示一些带有保存或取消按钮的非常复杂的界面并且需要该界面正确处理不同的显示器分辨率时,我遇到了无穷无尽的问题。 例如,假设此接口需要在 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 根据最大垂直分辨率垂直调整自身大小。
【问题讨论】:
-
“但是我可以调用 pack() 和 setSize 并在一些尝试后找到正确的大小。” 目的是在每台计算机上进行“一些尝试”是打算跑上去的吗?因为一个数字不一定适用于另一个屏幕/PLAF/OS...
-
如果这里的答案不是
JScrollPane那么我不明白这个问题(这也是一个很大的可能性)。 -
Java 的目的是根据屏幕分辨率和我指定的最小尺寸计算窗口的正确尺寸。 JScrollPane 对于解决方案来说太极端了,因为我不想隐藏元素。
-
为sscce+1。
标签: java swing screen-resolution joptionpane jdialog