保存ボタンまたはキャンセルボタンを備えた非常に複雑なインターフェイスをユーザーに表示する必要があり、さまざまなモニター解像度を正しく処理するためにこのインターフェイスが必要な場合、無限の問題が発生します。たとえば、このインターフェイスが1280 x 768モニターに17個のJTextFieldsとサイズ変更可能な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は、垂直解像度に応じて最大値まで垂直方向にサイズ変更されます。