Perché non lo fa preferita cambio formato dei miei JPanel quando il suo JScrollPane contenuta fa in GroupLayout?

StackOverflow https://stackoverflow.com/questions/3680531

  •  02-10-2019
  •  | 
  •  

Domanda

Utilizzo GroupLayout e il codice qui sotto, ho notato che il leftPanel non sta aggiornando la sua dimensione preferita. Ho pensato che questo doveva essere automatico e sembra funzionare in altri gestori di layout. Come posso ottenere che il comportamento con 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
È stato utile?

Soluzione

La dimensione preferita di un componente si basa sulla dimensione preferita dei componenti aggiunti ad esso.

Sì, la dimensione preferita del JList cambierà quando si aggiungono voci all'elenco. Tuttavia, il JList viene aggiunto a un JScrollPane, quindi la sua la dimensione preferita del JScrollPane che viene utilizzato per determinare la dimensione preferita del JPanel.

Dal momento che si sta utilizzando un IDE per creare la GUI è sguardi come la dimensione preferita del JScrollPane è determinato in fase di progettazione e insita nel vincolo. La dimensione preferita del JScrollPane non cambierà come il telaio viene ridimensionato o quando si aggiungono elementi al JList. La "dimensione" della JScrollPane e JPanel cambierà il telaio viene ridimensionato.

Altri suggerimenti

Non tutti i LayoutManagers prendono Component.preferredSize () in considerazione quando si fa la loro disposizione. I due, che io sappia che fare sono FlowLayout e BoxLayout (altri potrebbero, ma non potrebbe).

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top