jscrollpaneが含まれているのに、JPanelの優先サイズがGrouplayoutで変化しないのはなぜですか?
-
02-10-2019 - |
質問
Grouplayoutと以下のコードを使用して、Leftpanelが優先サイズを更新していないことに気付きました。私はこれが自動であるはずであり、他のレイアウトマネージャーで機能しているように見えると思いました。どうすればその動作をgrouplayoutで入手できますか?
import javax.swing.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
public class SizeTesting {
public static void main(String[] args) {
JFrame frame = new JFrame();
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.setSize(400,400);
JSplitPane splitPane = new JSplitPane();
final JPanel leftPanel = new JPanel();
final DefaultListModel listModel = new DefaultListModel();
final JList list = new JList(listModel);
final JScrollPane jsp = new JScrollPane(list);
leftPanel.add(jsp);
splitPane.setLeftComponent(leftPanel);
GroupLayout panel1Layout = new GroupLayout(leftPanel);
leftPanel.setLayout(panel1Layout);
panel1Layout.setHorizontalGroup(
panel1Layout.createParallelGroup()
.addComponent(jsp, GroupLayout.Alignment.TRAILING, GroupLayout.DEFAULT_SIZE, 157, Short.MAX_VALUE)
);
panel1Layout.setVerticalGroup(
panel1Layout.createParallelGroup()
.addGroup(GroupLayout.Alignment.TRAILING, panel1Layout.createSequentialGroup()
.addContainerGap()
.addComponent(jsp, GroupLayout.DEFAULT_SIZE, 377, Short.MAX_VALUE))
);
JPanel rightPanel = new JPanel();
JButton button = new JButton("Add Long Item");
button.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent actionEvent) {
System.out.println("Preferred Size of List BEFORE: " + list.getPreferredSize());
System.out.println("Preferred Size of ScorllPane BEFORE: " + jsp.getPreferredSize());
System.out.println("Preferred size of LeftPanel BEFORE: " + leftPanel.getPreferredSize());
System.out.println();
listModel.addElement("Really long, new Item in List");
System.out.println("Preferred Size of List AFTER: " + list.getPreferredSize());
System.out.println("Preferred Size of ScorllPane AFTER: " + jsp.getPreferredSize());
System.out.println("Preferred size of LeftPanel AFTER: " + leftPanel.getPreferredSize());
}
});
rightPanel.add(button);
splitPane.setRightComponent(rightPanel);
listModel.addElement("Test");
listModel.addElement("Test2");
listModel.addElement("Test3");
frame.add(splitPane);
frame.setVisible(true);
}
} // end class SizeTesting
解決
コンポーネントの優先サイズは、追加されたコンポーネントの優先サイズに基づいています。
はい、JLISTの優先サイズは、リストにアイテムを追加すると変更されます。ただし、JLISTはJScrollpaneに追加されるため、JPanelの優先サイズを決定するために使用されるJScrollpaneの優先サイズです。
IDEを使用してGUIを作成しているため、JScrollpaneの優先サイズが設計時に決定され、制約にハードコードされているように見えます。 jscrollpaneの優先サイズは、フレームがサイズ変更されたり、JLISTにアイテムを追加しても変更されません。 jscrollpaneとjpanelの「サイズ」は、フレームがサイズ変更されると変化します。
他のヒント
すべてのレイアウトマネージャーがcomponent.preferredsize()をレイアウトを行うときに考慮しているわけではありません。私が知っている2つは、FlowLayoutとBoxLayoutです(他の人はそうではないかもしれませんが)。
所属していません StackOverflow