JScrollPane内组件默认首选宽度设置、支持收缩的实现问题咨询
JScrollPane内组件默认首选宽度设置、支持收缩的实现问题咨询
大家好,我最近在做Swing开发时遇到了一个关于JScrollPane和组件尺寸控制的问题,折腾了好久没搞定,想请教下各位大佬:
我的需求是这样的:
- 组件要有一个默认的「首选宽度」,这一点很重要——初始显示的时候,组件不能是收缩状态
- 组件本身是可以被收缩到一定程度的,不是完全不能缩小
- 这个组件需要放在JScrollPane里面
但现在遇到了一个矛盾点:当把组件放进JScrollPane后,组件的preferredSize好像就被当成了minimumSize来对待,根本不会收缩,只会被容器裁剪。就像我测试时看到的那样,只要把窗口缩到比组件的首选宽度还小,组件就会被裁剪而不是自适应缩小。
我理想的逻辑应该是:JScrollPane的滚动条(我设置的是横向滚动条从不显示,但核心逻辑通用)应该在组件的最小尺寸无法被满足的时候才“触发”——也就是当容器小到连组件的最小尺寸都放不下时,再出现滚动条或者处理溢出,而不是一小于首选尺寸就开始裁剪/显示滚动条。
下面是我写的测试代码,大家可以帮忙看看哪里需要调整:
import javax.swing.BorderFactory; import javax.swing.JFrame; import javax.swing.JPanel; import javax.swing.JScrollPane; import javax.swing.SwingUtilities; import javax.swing.WindowConstants; import java.awt.Color; import java.awt.Dimension; public class ScrollPaneDemo { public static void main(String[] args) { SwingUtilities.invokeLater(ScrollPaneDemo::launch); } private static void launch() { JFrame frame = new JFrame("ScrollPane Demo"); frame.setContentPane(createScrollPane()); frame.setLocationRelativeTo(null); frame.pack(); frame.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE); frame.setVisible(true); } private static JScrollPane createScrollPane() { JScrollPane scrollPane = new JScrollPane(createScrollablePanel()); scrollPane.setHorizontalScrollBarPolicy(JScrollPane.HORIZONTAL_SCROLLBAR_NEVER); return scrollPane; } private static JPanel createScrollablePanel() { JPanel panel = new JPanel(); panel.setBorder(BorderFactory.createLineBorder(Color.RED, 3)); panel.setPreferredSize(new Dimension(250, 150)); return panel; } }
内容来源于stack exchange
相关产品推荐
相关产品推荐

