提问人:Popo 提问时间:11/17/2023 更新时间:11/17/2023 访问量:32
为什么当我向 scrollPane 添加元素时,它不能滚动?
Why doesn't the scrollPane become scrollable when I add elements to it?
问:
我正在使用 swing 在 java 中制作 GUI,但在使用 scrollPane 时遇到了一些问题。作为一点上下文,我有一个名为 leftPanel 的 JPanel,我将要向您展示的所有内容都位于其上。这是它的创建方式:
leftPanel = new JPanel();
leftPanel.setAlignmentX(Component.LEFT_ALIGNMENT);
leftPanel.setBackground(new Color(51, 51, 51));
leftPanel.setPreferredSize(new Dimension(300, 100));
在这个面板上,我有以下 JPaneels(它们里面都有一些东西,但与问题无关):
JPanel topPanel = new JPanel();
topPanel.setPreferredSize(new Dimension(300, 35));
topPanel.setLayout(new BoxLayout(topPanel, BoxLayout.LINE_AXIS));
topPanel.setBackground(new Color(51, 51, 51));
JPanel fenPanel = new JPanel(new FlowLayout());
fenPanel.setPreferredSize(new Dimension(300, 60));
fenPanel.setBackground(new Color(255, 18, 18));
JPanel perftPanel = new JPanel(new FlowLayout(FlowLayout.LEFT));
perftPanel.setPreferredSize(new Dimension(300, 35));
perftPanel.setBackground(new Color(55, 147, 86));
最后,我有 resultsPanel 和 scrollPane,这就是这篇文章的原因
resultsPanel = new JPanel();
resultsPanel.setLayout(new BoxLayout(resultsPanel, BoxLayout.PAGE_AXIS));
resultsPanel.setBackground(new Color(51, 51, 51));
JScrollPane scrollPane = new JScrollPane(resultsPanel);
scrollPane.setVerticalScrollBarPolicy(JScrollPane.VERTICAL_SCROLLBAR_ALWAYS);
scrollPane.setHorizontalScrollBarPolicy(JScrollPane.HORIZONTAL_SCROLLBAR_AS_NEEDED);
leftPanel.add(topPanel);
leftPanel.add(fenPanel);
leftPanel.add(perftPanel);
leftPanel.add(scrollPane);
resultsPanel 最初是空的,但每当按下按钮时,都会在上面打印一些东西。我是这样做的:
//This thing is in a loop, so more than 1 JLabel is added
JPanel panel = new JPanel(new FlowLayout(FlowLayout.LEFT));
panel.setPreferredSize(new Dimension(300, 20));
panel.setBackground(new Color(51, 51, 51));
JLabel label = null;
if (count == fishCount) {
label = new JLabel(counterSplit[counterIndex]);
label.setFont(new Font("Ariel", Font.BOLD, 12));
label.setBackground(new Color(51, 51, 51));
label.setForeground(new Color(66, 131, 0));
label.setOpaque(true);
} else {
label = new JLabel(counterSplit[counterIndex] + "Stockfish: " + fishCount);
label.setFont(new Font("Ariel", Font.BOLD, 12));
label.setBackground(new Color(51, 51, 51));
label.setForeground(new Color(126, 0, 0));
label.setOpaque(true);
}
panel.add(label);
resultsPanel.add(panel);
使用上面的代码,我没有指定首选大小,并且由于某种原因,resultsPanel 没有扩展以容纳所有内容。
如果我确实添加了首选大小,JLables 可以打印得很好,但 resultPanel 只显示几行,我无法滚动查看其余部分,即使它们被 100% 添加。我知道它们正在被打印出来,因为如果我把结果面板做得非常大,我可以看到那里的标签。出于某种原因,它永远不会变得可滚动,我不知道我做错了什么。
我还写了这段代码,只是为了确保我不会发疯
JFrame frame = new JFrame("ScrollPane Example");
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
JPanel contentPanel = new JPanel();
contentPanel.setLayout(new BoxLayout(contentPanel, BoxLayout.Y_AXIS));
JScrollPane scrollPane = new JScrollPane(contentPanel);
frame.add(scrollPane);
for (int i = 0; i < 100; i++) {
contentPanel.add(new JLabel("Label " + i));
}
frame.setSize(300, 200);
frame.setLocationRelativeTo(null);
frame.setVisible(true);
这完全符合预期,也是我想要实现的目标。如果有人能指出我做错了什么,我将不胜感激。
答: 暂无答案
评论