私はGroupLayoutを使っていくつかの奇妙な動作を観察しています。 JFrameの内部に含まれているJTextAreaを取得しています。JTextAreaはJFrameのサイズ変更と他のコンポーネントのプッシュを行うJScrollPaneの内部に含まれています。奇妙なことに、JTextAreaの上または下に何もないようにレイアウトを並べ替えると(ギャップもなく)、うまく動作します。それは、テキスト領域がコンテナにどれくらいのスペースがあるかを尋ねているかのように、他のコンポーネントにかかわらず、コンテナの100%をとっているかのようです。もう1つの奇妙なことは、コンテナ内のJTextArea(JScrollPaneではなく)のサイズと他のコンポーネントの高さがShort.MAX_VALUEに達した場合にのみ発生するように見えるということです。JTextAreaがGroupLayoutのフレームをオーバーフローさせるのはなぜですか?
スクロールペインの垂直グループの最大サイズ(レイアウトにコンポーネントを追加するとき)をShort.MAX_VALUEより小さい値に指定すると、問題が解決されたようです(ただし、 Short.MAX_VALUEは、の他のコンポーネントの高さよりも大きいです)。例えば私は小さな正の値にし、代わりにGroupLayout.PREFERRED_SIZEまたはGroupLayout.DEFAULT_SIZEの推奨サイズを設定した場合
.addComponent(textArea, GroupLayout.DEFAULT_SIZE, GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE - 500)
また、また、この動作は離れて行くように思われます。例えば
.addComponent(textArea, 0, 1, Short.MAX_VALUE)
GroupLayout上のJavaチュートリアルは、このことについては何も言及し、あらゆる場所にShort.MAX_VALUEを使用する傾向があるように思えません。私はグーグルで答えを見つけようとしましたが、この問題を検索用語で説明することは非常に困難でした。
バグが見つかりましたか、GroupLayoutを理解できませんでしたか?後者は確かにそうであるようです。
この例では、単純なテキスト領域が作成されます。下のボタンを押してテキストを入力します(JScrollPane内のJTextAreaのサイズを変更します)。テキスト領域の内側をクリックして、行を追加または削除することができます。余分な行を追加した後、再描画ボタンをクリックするか、フレームのサイズを変更して、奇妙な動作を確認します。
public class GroupLayoutTest {
public GroupLayoutTest() {
SwingUtilities.invokeLater(new Runnable() {
@Override
public void run() {
final JFrame frame = new JFrame("GroupLayout test");
Container panel = frame.getContentPane();
GroupLayout layout = new GroupLayout(panel);
panel.setLayout(layout);
JButton addBtn = new JButton("Add Lines");
JButton redrawBtn = new JButton("Redraw");
final JTextArea textArea = new JTextArea();
final JScrollPane textPane = new JScrollPane(textArea);
layout.setHorizontalGroup(layout.createParallelGroup()
.addComponent(redrawBtn)
.addComponent(textPane)
.addComponent(addBtn));
layout.setVerticalGroup(layout.createSequentialGroup()
.addComponent(redrawBtn)
.addComponent(textPane)
.addComponent(addBtn));
addBtn.addActionListener(new ActionListener() {
int m = 0;
@Override
public void actionPerformed(ActionEvent e) {
for (int i = m; m < i + 2044; ++m) {
textArea.append("Line " + m + "\n");
}
// redraw the frame
frame.validate();
}
});
redrawBtn.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
frame.validate();
}
});
frame.setPreferredSize(new Dimension(640, 480));
frame.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);
frame.pack();
frame.setLocationRelativeTo(null);
frame.setVisible(true);
}
});
}
public static void main(String[] args) {
new GroupLayoutTest();
}
}
1 - のhttp:// sscce.org/ –