Java Swing 滚动浏览绘图

Java Swing Scroll through drawing

我正在尝试将 JScrollpane 添加到我的 JPanel。问题是滚动窗格无法识别我的绘图在框架之外。那么如何正确添加 JScrollpane 呢?

主要class:

public MainFrame() extends JFrame{

public MainFrame() {

        Container container = getContentPane(); 
        container(new BorderLayout());
        container.add(new JScrollPane(new Drawing()));

        setSize(1280,720);
        setVisible(true);
    }

画图class:

public class Drawing() extends JPanel {

    @Override
    protected void paintComponent(Graphics g) {
       g.drawLine(10, 100, 30000, 10);
    }
}

您的代码中有几个错误,让我们逐步解决每个错误:

  1. 您正在扩展 JFrame,您应该避免它,请参阅:Extends JFrame vs. creating it inside the program 了解更多信息。你实际上并没有改变它的行为,所以不需要扩展它。

  2. 为了使 JScrollPane 显示整行,您需要将 window 的大小更改为与行的大小相同(如 this answer @MadProgrammer).

  3. 与第 2 点相关,避免使用 setSize(...) 而是覆盖 getPreferredSize():有关详细信息,请参阅 Should I avoid the use of set(Preferred|Maximum|Minimum)Size methods in Java Swing?

  4. 您忘记在 paintComponent() 方法中调用 super.paintComponent(...) 方法。

  5. 关于第 2、3 点,您需要调用 pack(),以便 Swing 计算出您的组件的最佳首选大小。

看这个例子:

import java.awt.Dimension;
import java.awt.Graphics;
import java.awt.Graphics2D;

import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.JScrollPane;
import javax.swing.SwingUtilities;

public class LongDraw {
    private JFrame frame;
    private Drawing drawing;

    public static void main(String[] args) {
        SwingUtilities.invokeLater(new LongDraw()::createAndShowGui);
    }

    private void createAndShowGui() {
        frame = new JFrame(getClass().getSimpleName());

        drawing = new Drawing();

        JScrollPane scroll = new JScrollPane(drawing);

        frame.add(scroll);

        frame.pack();
        frame.setVisible(true);
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    }

    class Drawing extends JPanel {
        @Override
        protected void paintComponent(Graphics g) {
            super.paintComponent(g);

            Graphics2D g2d = (Graphics2D) g;
            g2d.drawLine(10, 100, 3000, 10);
        }

        @Override
        public Dimension getPreferredSize() {
            return new Dimension(3000, 500);
        }
    }
}

产生类似这样的东西: