Pourquoi ne pas la taille préférée de mon JPanel changement lorsque son contenu JScrollPane fait dans GroupLayout?
-
02-10-2019 - |
Question
Utilisation GroupLayout et le code ci-dessous, je remarque que le leftPanel n'est pas mise à jour de sa taille préférée. Je pensais que cela était censé être automatique et semble fonctionner dans d'autres gestionnaires de mise en page. Comment puis-je obtenir ce comportement avec 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
La solution
La taille préférée d'un composant est basé sur la taille préférée des composants ajoutés.
Oui, la taille préférée du JList changera lorsque vous ajoutez des éléments à la liste. Cependant, le JList est ajouté à un JScrollPane, de sorte que sa taille préférée de l'JScrollPane qui est utilisé pour déterminer la taille préférée de l'JPanel.
Puisque vous utilisez un IDE pour créer votre interface graphique est ressemble à la taille préférée des JScrollPane est déterminée au moment de la conception et la contrainte dans hardcoded. La taille préférée des JScrollPane ne changera pas le cadre est redimensionné ou que vous ajoutez des éléments à la JList. La « taille » du JScrollPane et JPanel changera que le cadre est redimensionnée.
Autres conseils
ne sont pas tous LayoutManagers prennent Component.preferredSize () en compte lors de faire leur mise en page. Les deux que je connaisse qui ne sont FlowLayout et BoxLayout (d'autres pourraient, mais ils ne pourraient pas).