java - 垂直滚动条未出现

标签 java swing

我刚刚开始使用 Swing。我正在尝试制作一个图库应用程序。我收到手动导入的图像并显示它们。根据我输入参数的列数,计算图像的尺寸以正确显示。但是,在一定数量的行之后,我想要一个可以滚动并显示其余图像的滚动条。

图像正确显示,就像我希望的那样,但我尝试实现滚动条,但它没有出现。

你能告诉我我的代码有什么问题吗?

    GUI(String title, int width, int height, int columns) {
        this.frame = new JFrame();
        this.frameWidth = width;
        this.columns = columns;

        // set Frame's size
        frame.setSize(width, height);

        // set Frame's action on close button clicked
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

        // set Frame's title
        frame.setTitle(title);
        frame.setResizable(false);

        // set Frame's position at screen's center
        Dimension dim = Toolkit.getDefaultToolkit().getScreenSize();
        frame.setLocation(dim.width / 2 - frame.getSize().width / 2, (dim.height / 2 - frame.getSize().height / 2));

        panel = new JPanel();
        frame.setLayout(new GridLayout());

        this.scrollBar = new JScrollPane();
        scrollBar.setVerticalScrollBarPolicy(JScrollPane.VERTICAL_SCROLLBAR_ALWAYS);
        frame.getContentPane().add(scrollBar, BorderLayout.EAST);

        displayImages();

        frame.setContentPane(panel);
    }

显示图像():

    private void displayImages() {
        for (File currentImage : getImagesList()) {
            // 5 is flowlayout's default borders
            // 2 because we got left and right borders
            int totalBorders = (columns * 5) * 2;
            int buttonWidth = (frameWidth - totalBorders) / columns;

            ImageIcon image = new ImageIcon(new ImageIcon(currentImage.getAbsolutePath()).getImage().getScaledInstance(buttonWidth - 20, buttonWidth - 50, Image.SCALE_DEFAULT));
            JButton button = new JButton(currentImage.getName());

            button.setPreferredSize(new Dimension(buttonWidth, buttonWidth));
            button.setIcon(image);
            button.setHorizontalTextPosition(AbstractButton.CENTER);
            button.setVerticalTextPosition(AbstractButton.BOTTOM);

            button.addActionListener(e -> onImageClicked(currentImage.getName()));
            panel.add(button);
        }
    }

谢谢,最诚挚的问候

最佳答案

    panel = new JPanel();
    frame.setLayout(new GridLayout());

    this.scrollBar = new JScrollPane();
    scrollBar.setVerticalScrollBarPolicy(JScrollPane.VERTICAL_SCROLLBAR_ALWAYS);
    frame.getContentPane().add(scrollBar, BorderLayout.EAST);

    displayImages();

    frame.setContentPane(panel);

上面的代码大部分是错误的。您需要:

  1. 设置面板布局并向面板添加按钮
  2. 将包含按钮的面板添加到滚动 Pane

基本代码应该是这样的:

//panel = new JPanel( new GridLayout(0, 1) );
layout = new GridLayout(0, 1);
panel = new JPanel( layout );
displayImages();
//frame.setLayout(new GridLayout());
this.scrollBar = new JScrollPane(panel);
scrollBar.setVerticalScrollBarPolicy(JScrollPane.VERTICAL_SCROLLBAR_ALWAYS);
frame.add(scrollBar, BorderLayout.EAST);
//displayImages();
//frame.setContentPane(panel);

此外,无需调整面板上每个组件的大小。 GridLayout 将使所有按钮具有相同的大小。

编辑:

当您想增加 GridLayout 中的列时,只需执行以下操作:

layout.setColumns( layout.getColumns() + 1 );
panel.revalidate(); // this invokes the layout manager
//panel.repaint(); // sometimes needed to force repainting of panel.

关于java - 垂直滚动条未出现,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55268657/

相关文章:

java - 抛出异常时 Servlet 过滤器不工作

java - 如何在 jtree 中制作一个组合框,显示其菜单?

java - 在文件夹中创建 .asm 文件作为 JMenuItems 并将它们添加到 JMenu,添加 ActionListener 事件

java - 将某些模式的字符串替换为某些模式

java - 为什么需要动态绑定(bind)?

java - 如何检查属性文件路径是否设置正确

java - 如何使用 Postman 中的 JSON 将值存储在特定列中(值由下划线_分隔)

java - JTable 构造函数可以接受数组以外的其他数据结构吗?

java - 与日志框架相关的特殊死锁

java - 如何从父框架关闭所有子框架?