Java JScrollPane中的JPanel?

16

我有一个JFrame,在它里面我有一个JPanel,我在这个面板上进行了绘制,这个面板可以是任何大小,因此我将它放置到了JScrollPane中,以便在面板大于窗口屏幕尺寸时进行滚动。

不幸的是,它并没有像我期望的那样工作:

  1. 当JFrame窗口小于JPanel大小时,不显示滚动条

  2. JScrollPane现在的大小似乎被锁定为我添加到它上面的JPanel的大小,而之前它会调整为它的JFrame窗口的边界(虽然现在它只在垂直方向上这样做?!)

  3. 无论我设置什么首选大小,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);
5个回答

17

调用setPreferredSize()方法是关键,对于JScrollPane组件,setMinimumSize()甚至是setSize()都会被忽略。以下是一个使用红色边框的可行示例。

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);
            }
        });
    }
}

7
// suggest a size of 'canvas'
_ImageCanvas.setPreferredSize(new Dimension(100,100));

// Scroll pane smaller then the size of the canvas so we should get scroll bars right?
_ScrollPane.setPreferredSize(new Dimension(50,50)); 

// ..later 
_Frame.pack();

1
frame.pack(); 重新调整它。 - Marcos Vasconcelos

1
  • 在画布上设置首选大小。
  • 增加尺寸100,100对于我的电脑来说太小了,至少要增加。
  • 如果您希望滚动窗格在扩展框架时也能扩展,请使用new GridLayout(1,1);为您的JFrame。

0

查看 Scrollable 接口,这可能有助于解决大小问题。

这两种方法可能有帮助:

boolean getScrollableTracksViewportWidth();

boolean getScrollableTracksViewportHeight();

0

嗨Puce,谢谢你的建议,结果我需要在scrollView中添加一个“holder”jPanel,然后给它一个布局管理器才能获得所需的效果。 - FiniteRed

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接