java - 垂直滚动条没有出现
问题描述
我刚开始摇摆。我正在尝试制作一个画廊应用程序。我正在获取手动导入的图像并显示它们。根据我输入参数的列数,计算图像的尺寸以正确显示。但是,在一定数量的行之后,我想要一个可以滚动并显示其余图像的滚动条。
图像正确显示,就像我希望的那样,但我尝试实现滚动条但它没有出现。
你能告诉我我的代码有什么问题吗?
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);
上面的代码大多是错误的。你需要:
- 设置面板的布局并将按钮添加到面板
- 将包含按钮的面板添加到滚动窗格
基本代码应该是这样的:
//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.
推荐阅读
- c# - 通过 OneDrive SDK 上传文件时的文件路径
- python - Python - 矩阵乘法
- reactjs - 使用 Formik + Yup 验证反应输入掩码长度
- python - 如何在 Python Pandas 中合并两个数据帧,其中键列名称不同,但想从第二个数据帧中检索一些列?
- java - 检查回文程序的字符串
- java - 始终在最大搜索特定节点的 thread_pool
- kotlin - 在 Kotlin 中解析 webp 文件头以获取其高度和宽度,但得到意想不到的结果
- node.js - 如何在 NODE JS 中使用 AXIOS 将文件从远程 AWS S3 发送到其他服务器
- python - 将 XML 文件转换为 pyspark 数据框
- react-native - 如何从函数组件中获取数据?