JScrollPane 不适用于 JPanel 绘图图形

JScrollPane is not working with JPanel drawing Graphics

我正在做一个为图形绘制 GUI 的项目,似乎 JScrollPane 没有很好地实现,因为当某些节点被绘制出面板的边界时它不起作用,这是代码:

public class Test extends JFrame {
public Test() {
    // TODO Auto-generated constructor stub
    MyPanel panel = new MyPanel();

    JScrollPane scrollPane = new JScrollPane(panel);
    scrollPane
            .setHorizontalScrollBarPolicy(JScrollPane.HORIZONTAL_SCROLLBAR_ALWAYS);
    scrollPane
            .setVerticalScrollBarPolicy(JScrollPane.VERTICAL_SCROLLBAR_ALWAYS);
    scrollPane.setBounds(50, 30, 500, 500);

    JPanel contentPane = new JPanel(null);
    contentPane.setPreferredSize(new Dimension(600, 600));
    contentPane.add(scrollPane);

    this.setContentPane(contentPane);
    this.pack();
    this.setSize(600, 600);
    this.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);
    this.setLocationRelativeTo(null);
    this.setVisible(true);
}
private class MyPanel extends JPanel {
    @Override
    public void paint(Graphics g) {
        // in panel range
        g.fillOval(0, 200, 100, 100);
        // out of panel range needs scroll bar
        g.fillOval(1000, 200, 100, 100);
    }
}

您的 JPanel 需要通过实现 getPreferredSize() 来宣传其大小,就像 Swing 中的任何其他组件一样。 JPanel 是一个绘制不透明背景(及其子背景)的组件。您正在实现一个自定义组件(可能没有子组件),因此您需要为其父组件(此处为滚动窗格)提供一些大小信息,以确保一切都布置得很好。

您也不应该在滚动窗格上设置边界。使用 LayoutManager 自动布置所有内容。切勿对 GUI 进行硬编码。