且构网

分享程序员开发的那些事...
且构网 - 分享程序员编程开发的那些事

JScrollPane中的Java JPanel?

更新时间:2023-12-05 08:29:46

setPreferredSize()是技巧,comcrollPane将忽略组件上的setMinimumSize()甚至setSize()。这是一个使用红色边框的工作示例。

  import java.awt。*; 

import javax.swing。*;

公共类Scroller扩展JFrame {

public Sc​​roller()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)抛出异常{
SwingUtilities.invokeLater(new Runnable(){
@Override
public void run(){
new Scroller()。setVisible(true);
}
});
}
}


I have a JFrame, in this JFrame I have a JPanel that I draw on, this Panel can be any size and so I placed it into a JScrollpane to let me scroll when the panel is larger than the window screen size.

Unfortunately does not work as I expected:

  1. Making the JFrame window smaller than the JPanel size does not show scroll bars

  2. The JScrollPane size now seems locked to the size of the JPanel I have added to it, where as before it resized to the bounds of it's JFrame window (it still kinda does this but only vertically now?!)

  3. The JPanel seems to assume the size of the JScrollpane regardless of what I set for preferred size

I am sure I'm doing something stupid, if someone could point out what I would be most grateful!

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(JPanel);

Many thanks

David

setPreferredSize() is the trick, setMinimumSize() and even setSize() on the component will be ignored by JScrollPane. Here's a working example using a red border.

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