我的JScrollPane不会在我的JPanel上垂直滚动
我有一个代码,我有很多'嵌套'的布局。边界,流程,在我的主程序中我有一个GridBag。我将面板动态添加到一个面板,并将其大小设置为使每个元素都垂直添加,但不会向上或向下滚动。我在网上看了一下,发现了类似的东西,但只让我的水平滚动,而不是像我想要的那样垂直滚动。这是我写的测试代码:我的JScrollPane不会在我的JPanel上垂直滚动
import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.Dimension;
import java.awt.FlowLayout;
import java.awt.Font;
import javax.swing.BorderFactory;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.JScrollPane;
public class Main {
public Main() {
JFrame frame = new JFrame("Blah");
Font font = new Font("Sans-Serif", Font.BOLD, 30);
JPanel memoryPanel = new JPanel();
memoryPanel.setLayout(new FlowLayout(FlowLayout.CENTER, 0, 0));
//memoryPanel.setPreferredSize(new Dimension(80 * 4, 55 * 9));
JScrollPane s = new JScrollPane(memoryPanel, JScrollPane.VERTICAL_SCROLLBAR_AS_NEEDED, JScrollPane.HORIZONTAL_SCROLLBAR_AS_NEEDED);
s.getViewport().setPreferredSize(new Dimension(80 * 4, 55 * 9));
for (int i = 0; i <= 10; i++) {
JPanel nextPanel = new JPanel();
nextPanel.setLayout(new BorderLayout());
nextPanel.setBackground(Color.CYAN);
nextPanel.setForeground(Color.BLACK);
JPanel labelPanel = new JPanel();
labelPanel.setLayout(new BorderLayout());
JPanel buttonPanel = new JPanel();
buttonPanel.setLayout(new FlowLayout(FlowLayout.TRAILING, 0, 0));
JLabel label = new JLabel();
label.setText("" + i);
label.setPreferredSize(new Dimension(80 * 4, 55));
label.setHorizontalAlignment(JLabel.RIGHT);
label.setBorder(BorderFactory.createEmptyBorder(0, 0, 0, 5));
JButton button1 = new JButton("A");
JButton button2 = new JButton("B");
JButton button3 = new JButton("C");
label.setFont(font);
labelPanel.add(label);
buttonPanel.add(button1);
buttonPanel.add(button2);
buttonPanel.add(button3);
nextPanel.add(labelPanel, BorderLayout.PAGE_START);
nextPanel.add(buttonPanel, BorderLayout.PAGE_END);
memoryPanel.add(nextPanel, 0);
memoryPanel.revalidate();
memoryPanel.repaint();
}
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.add(s);
frame.setResizable(false);
frame.pack();
frame.setLocationRelativeTo(null);
frame.setVisible(true);
}
public static void main(String[] args) {
new Main();
}
}
该注释行显示了水平滚动条。它没有评论,它没有显示任何。不知道我是否使用了错误的布局,但我一直试图修复它几个小时。我添加的行是s.getViewport().setPreferredSize(new Dimension(80 * 4, 55 * 9));
这是一切水平,而不是垂直。不知道如何解决这个问题。建议?
从摆脱s.getViewport().setPreferredSize(new Dimension(80 * 4, 55 * 9));
开始。您不希望更改视图端口的大小,它是您的内容的容器,并充当显示组件可见部分的“窗口”。
接下来,摆脱frame.setResizable(false);
,这将现在允许包实际上收拾围绕内容的窗口。由于您使用的是FlowLayout
,因此这会使窗口与屏幕一样宽。
import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.Dimension;
import java.awt.FlowLayout;
import java.awt.Font;
import javax.swing.BorderFactory;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.JScrollPane;
import javax.swing.SwingUtilities;
public class Main {
public Main() {
JFrame frame = new JFrame("Blah");
Font font = new Font("Sans-Serif", Font.BOLD, 30);
JPanel memoryPanel = new JPanel();
memoryPanel.setLayout(new FlowLayout(FlowLayout.CENTER, 0, 0));
//memoryPanel.setPreferredSize(new Dimension(80 * 4, 55 * 9));
JScrollPane s = new JScrollPane(memoryPanel, JScrollPane.VERTICAL_SCROLLBAR_AS_NEEDED, JScrollPane.HORIZONTAL_SCROLLBAR_AS_NEEDED);
// s.getViewport().setPreferredSize(new Dimension(80 * 4, 55 * 9));
for (int i = 0; i <= 10; i++) {
JPanel nextPanel = new JPanel();
nextPanel.setLayout(new BorderLayout());
nextPanel.setBackground(Color.CYAN);
nextPanel.setForeground(Color.BLACK);
JPanel labelPanel = new JPanel();
labelPanel.setLayout(new BorderLayout());
JPanel buttonPanel = new JPanel();
buttonPanel.setLayout(new FlowLayout(FlowLayout.TRAILING, 0, 0));
JLabel label = new JLabel();
label.setText("" + i);
label.setPreferredSize(new Dimension(80 * 4, 55));
label.setHorizontalAlignment(JLabel.RIGHT);
label.setBorder(BorderFactory.createEmptyBorder(0, 0, 0, 5));
JButton button1 = new JButton("A");
JButton button2 = new JButton("B");
JButton button3 = new JButton("C");
label.setFont(font);
labelPanel.add(label);
buttonPanel.add(button1);
buttonPanel.add(button2);
buttonPanel.add(button3);
nextPanel.add(labelPanel, BorderLayout.PAGE_START);
nextPanel.add(buttonPanel, BorderLayout.PAGE_END);
memoryPanel.add(nextPanel, 0);
memoryPanel.revalidate();
memoryPanel.repaint();
}
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.add(s);
// frame.setResizable(false);
frame.pack();
frame.setLocationRelativeTo(null);
frame.setVisible(true);
}
public static void main(String[] args) {
SwingUtilities.invokeLater(new Runnable() {
@Override
public void run() {
new Main();
}
});
}
}
如果你想影响滚动视图区域的大小,那么你就需要根据自己的需要
'frame.setResizable'与'pack()'的功能无关。它只是确定最终用户是否可以调整窗口大小。 – VGR
@VGR真的,为什么窗口的大小超出了我的屏幕大小,并没有显示滚动条,当它被设置,当它不是,根据我的屏幕的宽度,并显示滚动条.. 。 - 个人,我避免'setResizable',它会导致更多的问题,然后它解决 – MadProgrammer
@VGR与'setResizable(false)'框架大小是'3524x110',没有它,帧大小为'1920x110' - 所以我会比如说'setResizable'对'pack'的工作方式有影响 – MadProgrammer
's.getViewport创建一个实现了
Scrollable
接口的自定义类,并返回相应的值( ).setPreferredSize(新维(80 * 4,55 * 9));'是尝试和改变的错误。 'viewport'显示“视图”的一部分,它的大小实际上应该是'JScrollPane'的大小(减去滚动条) – MadProgrammer我也摆脱了'frame.setResizable(false);'和'memoryPanel.setPreferredSize (new Dimension(80 * 4,55 * 9));'并且让窗口实际上将它自己包装在内容中 – MadProgrammer