لماذا لا يتغير حجم JPanel المفضل لدي عندما يكون JScrollpane المحتوى في Grouplayout؟

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

  •  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 أثناء إضافة عناصر إلى القائمة. ومع ذلك ، تتم إضافة JLILD إلى JSCROLLPANE ، لذلك فإن الحجم المفضل لـ JSCROLLPANE المستخدم لتحديد الحجم المفضل لـ JPANEL.

نظرًا لأنك تستخدم IDE لإنشاء واجهة المستخدم الرسومية الخاصة بك ، يبدو أن الحجم المفضل لـ JScrollPane يتم تحديده في وقت التصميم ويتم ترميزه في القيد. لن يتغير الحجم المفضل لـ JScrollPane حيث يتم تغيير حجم الإطار أو عند إضافة عناصر إلى JLILD. سيتغير "حجم" JScrollpane و JPanel عند تغيير حجم الإطار.

نصائح أخرى

لا يأخذ كل من المخططين مكونًا. preferredsize () في الاعتبار عند القيام بتخطيطهم. الاثنان اللذان أعرفهما هما FlowLayout و Boxlayout (قد يكون الآخران ، لكنهما قد لا يفعلان).

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top