JScrollPane用于JPanel中的JPanel

时间:2014-07-28 02:50:39

标签: java swing jpanel jscrollpane layout-manager

阅读this answer后,我来到了using getPreferredSize instead of setPreferredSize。但我仍然无法使用@Override getPreferredSize,但这不是我现在面临的主要问题。

我有一个CardLayout应用程序,它调用一个名为 HiraganaData

的类

HiraganaData 是一个扩展JPanel的类,因此CardLayout可以使用它,但它上面还有2个JPanel,一个用于“后退”按钮,另一个用于其余按钮,在使用这个想法之前我使用的是JTable,但是在将单元格设置为按钮方面存在问题,所以我放弃了这个想法并使用{{1}来添加新的}。一些按钮将被禁用,无论如何我可以这样做,并且不会包含该代码,因为它不相关。

所以我的实际问题或问题是:

  • 如何向GridLayout添加JScrollPane ,尽我所能 试图将它添加到整个“全球”窗格中,但没有成功。

这是我用类相同的代码我可以做的最近似的GUI我只是添加了一个JFrame。

不确定是否相关,但我使用的buttonsPanel大小不同,就像@MadProgrammer在this answer上建议的那样。

CardLayout

这就是我在完整申请中的样子

enter image description here

这就是它在MCVE中的样子。

enter image description here

1 个答案:

答案 0 :(得分:4)

您遇到的主要问题是,当您将buttonsPane添加到pane时,您会从滚动窗格中移除JScrollPane scroll = new JScrollPane(buttonsPanel); pane.add(buttonsPanel); this.add(pane, BorderLayout.CENTER); ...

buttonsPane

而且你从未真正将滚动窗格添加到任何内容这一事实也无济于事。

组件可能只有一个父组件,因此当您将pane添加到HiraganaPage时,它会从滚动窗格中有效删除

相反,将BorderLayout的布局管理器设置为buttonsPanel,将CENTER添加到滚动窗格,然后将滚动窗格添加到HiraganaPage的{​​{1}}位置{1}}然后将pane添加到NORTH

HiraganaPage位置

Buttons

import java.awt.BorderLayout;
import java.awt.Dimension;
import java.awt.EventQueue;
import java.awt.GridLayout;
import javax.swing.BoxLayout;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.JScrollPane;
import javax.swing.UIManager;
import javax.swing.UnsupportedLookAndFeelException;

public class TestScrollPane {

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

    public TestScrollPane() {
        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 HiraganaPage());
                frame.pack();
                frame.setLocationRelativeTo(null);
                frame.setVisible(true);
            }
        });
    }

    public class HiraganaPage extends JPanel {

        JFrame frame = new JFrame("Hello");
        JButton kanas[][] = new JButton[26][5];
        JButton backButton = new JButton("back");
        JPanel backPanel = new JPanel();
        JPanel buttonsPanel = new JPanel();

        public HiraganaPage() {
            setLayout(new BorderLayout());

            JPanel pane = new JPanel();
            backPanel.add(backButton);
            buttonsPanel.setLayout(new GridLayout(0, 5));
            pane.setLayout(new BoxLayout(pane, BoxLayout.Y_AXIS));
            pane.add(backPanel);

//            pane.setPreferredSize(new Dimension(500, 500));

            for (int i = 0; i < 26; i++) {
                for (int j = 0; j < 5; j++) {
                    kanas[i][j] = new JButton("1");
                    buttonsPanel.add(kanas[i][j]);
                }
            }

            add(pane, BorderLayout.NORTH);
            add(new JScrollPane(buttonsPanel));
        }

        @Override
        public Dimension getPreferredSize() {
            return new Dimension(500, 500);
        }
    }

}