我有一个 JFrame,在这个 JFrame 中我有一个我在上面绘制的 JPanel,这个 Panel 可以是任何大小,所以我把它放在一个 JScrollpane 中,当面板大于窗口屏幕大小时我可以滚动。
不幸的是,它没有像我预期的那样工作:
使JFrame窗口小于JPanel大小不显示滚动条
JScrollPane 的大小现在似乎已锁定为我添加到其中的 JPanel 的大小,而之前它已调整为 JFrame 窗口的边界(它仍然有点这样做,但现在只是垂直方向?!)
JPanel 似乎采用 JScrollpane 的大小,无论我为首选大小设置了什么
我确定我在做一些愚蠢的事情,如果有人能指出我将不胜感激!
JPanel imageCanvas = new JPanel(); // 'Canvas' to draw on
JScrollPane scrollPane = new JScrollPane();
// set size of 'canvas'
imageCanvas.setMinimumSize(new Dimension(100,100));
// Scroll pane smaller then the size of the canvas so we should get scroll bars right?
scrollPane.setMinimumSize(new Dimension(50,50));
// Add a border to 'canvas'
imageCanvas.setBorder(BorderFactory.createLineBorder(new java.awt.Color(0, 0, 0)));
scrollPane.setViewportView(imageCanvas);
最佳答案
setPreferredSize() 是诀窍,组件上的 setMinimumSize() 甚至 setSize() 都会被 JScrollPane 忽略。这是一个使用红色边框的工作示例。
import java.awt.*;
import javax.swing.*;
public class Scroller extends JFrame {
public Scroller() throws HeadlessException {
final JPanel panel = new JPanel();
panel.setBorder(BorderFactory.createLineBorder(Color.red));
panel.setPreferredSize(new Dimension(800, 600));
final JScrollPane scroll = new JScrollPane(panel);
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
setLayout(new BorderLayout());
add(scroll, BorderLayout.CENTER);
setSize(300, 300);
setVisible(true);
}
public static void main(final String[] args) throws Exception {
SwingUtilities.invokeLater(new Runnable() {
@Override
public void run() {
new Scroller().setVisible(true);
}
});
}
}
关于JScrollPane 中的 Java JPanel?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9393480/