0

スクロールバーもあるJPanelにいくつかのチェックボックスを追加するダイアログを実装しました。プログラムを実行するたびにチェックボックスの数は固定されていませんが、ダイアログを作成する前に確認できます。

残念ながら、ダイアログを追加するためのチェックボックスが多数ある場合は、次のようになります。

ここに画像の説明を入力してください

私のコードは次のとおりです。

        JPanel listPanel = new JPanel(new GridLayout(files.size() + 2, 1));

        for (int i = 0; i < files.size(); i++) {
            listPanel.add(files.get(i));
        }

        listPanel.setPreferredSize(new Dimension(600, 1400));
        JScrollPane sp =
                new JScrollPane(listPanel, JScrollPane.VERTICAL_SCROLLBAR_AS_NEEDED,
                        JScrollPane.HORIZONTAL_SCROLLBAR_AS_NEEDED);
        sp.setPreferredSize(new Dimension(300, 200));

        mainPanel.add(sp, BorderLayout.CENTER);
        mainPanel.add(buttonPane, BorderLayout.EAST);

        getContentPane().setLayout(new FlowLayout());

        getContentPane().add(mainPanel);

        pack();
        setResizable(false);

フレームに影響を与えずに、スクロールペイン内のパネルのサイズをより大きなサイズに設定するにはどうすればよいですか?

4

2 に答える 2

3

使用を避けsetPreferredSize、レ​​イアウトマネージャーに実際に必要なサイズを決定させてください...

例で更新

JViewportスクロールペインのは、の推奨サイズを使用して、必要listPaneな表示可能スペースの量を決定します。これは多くの場合です...

これを克服するには、コンポーネントが実際に表示できるサイズに関して、ビューポートに適切なヒントを提供する必要があります。コンポーネントのはここpreferredSizeでは機能しません。インターフェースpreferredScrollableViewportSizeから供給する必要がありますScrollable

ここに画像の説明を入力してください

public class BadList {

    public static void main(String[] args) {
        new BadList();
    }

    public BadList() {
        EventQueue.invokeLater(new Runnable() {
            @Override
            public void run() {
                try {
                    UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName());
                } catch (ClassNotFoundException | InstantiationException | IllegalAccessException | UnsupportedLookAndFeelException ex) {
                }

                JFrame frame = new JFrame("Testing");
                frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
                frame.setLayout(new BorderLayout());
                frame.add(new TestPane());
                frame.pack();
                frame.setLocationRelativeTo(null);
                frame.setVisible(true);
            }
        });
    }

    public class TestPane extends JPanel {

        public TestPane() {

            List<String> files = new ArrayList<>(2000);
            for (int index = 0; index < 2000; index++) {
                files.add(Integer.toString(index));
            }

            ListPane listPanel = new ListPane();
            listPanel.setLayout(new GridBagLayout());
            GridBagConstraints gbc = new GridBagConstraints();
            gbc.weightx = 1;
            gbc.fill = GridBagConstraints.HORIZONTAL;
            gbc.gridwidth = GridBagConstraints.REMAINDER;

            for (String file : files) {
                listPanel.add(new JCheckBox(file), gbc);
            }

            JScrollPane sp = new JScrollPane(listPanel);

            JPanel mainPanel = new JPanel(new BorderLayout());
            JPanel buttonPane = new JPanel(new GridBagLayout());
            buttonPane.add(new JButton("Select All"), gbc);
            buttonPane.add(new JButton("Deselect All"), gbc);
            gbc.weighty = 1;
            buttonPane.add(new JPanel(), gbc);

            mainPanel.add(sp, BorderLayout.CENTER);
            mainPanel.add(buttonPane, BorderLayout.EAST);

            setLayout(new BorderLayout());

            add(mainPanel);
        }
    }

    public class ListPane extends JPanel implements Scrollable {

        @Override
        public Dimension getPreferredScrollableViewportSize() {
            return new Dimension(200, 200);
        }

        @Override
        public int getScrollableUnitIncrement(Rectangle visibleRect, int orientation, int direction) {
            return 128;
        }

        @Override
        public int getScrollableBlockIncrement(Rectangle visibleRect, int orientation, int direction) {
            return 128;
        }

        @Override
        public boolean getScrollableTracksViewportWidth() {
            return false;
        }

        @Override
        public boolean getScrollableTracksViewportHeight() {
            return false;
        }

    }
}

nb-この例では任意のマジックナンバーを使用しましたが、必要に応じてより現実的な値を提供する方法を説明します。

于 2013-02-04T08:51:22.427 に答える
3
  • JPanel実装しましたFlowLayout

  • FlowLayoutのみを受け入れるPreferredSizeと、あなたJScrollPaneは正しく敷設されます

  • (non_naturalスクロール、変更する必要があります)に子を追加する代わりに、 JTable(put there Boolean value、 presenting )を使用しますJCheckBoxJPanelscroll increment

  • listPanel.setPreferredSize(new Dimension(600, 1400));良くないですDimmension、このコード行にコメントしてください、pack()

  • この仕事のために(ここに投稿されたコード)私は使用法の代わりに直接置かれJScrollPane、そうでなければSSCCEを投稿しますbuttonPaneJFramemainPanel()

于 2013-02-04T09:11:14.247 に答える