【发布时间】:2017-03-29 23:58:48
【问题描述】:
我有一个代码,其中有很多“嵌套”布局。 Border、Flow 和在我的主程序中我有一个 GridBag。我将面板动态添加到一个面板,并调整其大小,以便垂直添加每个元素,但不会向上或向下滚动。我在网上看了看,发现了类似的东西,但这只允许我水平滚动,而不是像我想要的那样垂直滚动。这是我写的测试代码:
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));是错误的尝试和改变。viewport显示“视图”的一部分,它的大小实际上应该是JScrollPane的大小(减去滚动条) -
我也会摆脱
frame.setResizable(false);和memoryPanel.setPreferredSize(new Dimension(80 * 4, 55 * 9));并让窗口真正将其自身包装在内容周围
标签: java swing jpanel scrollbar jscrollpane