Java Swing滚动浏览图形

Java Swing滚动浏览图形,java,swing,jscrollpane,paintcomponent,Java,Swing,Jscrollpane,Paintcomponent,我正在尝试将JScrollpane添加到我的JPanel中。问题是滚动窗格无法识别我的绘图在框架之外。那么如何正确添加JScrollpane呢 主要类别: public MainFrame() extends JFrame{ public MainFrame() { Container container = getContentPane(); container(new BorderLayout()); container.add(new

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

主要类别:

public MainFrame() extends JFrame{

public MainFrame() {

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

        setSize(1280,720);
        setVisible(true);
    }
绘图类:

public class Drawing() extends JPanel {

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

您的代码中有几个错误,让我们逐一分析:

您正在扩展JFrame,应该避免使用它,请参阅:了解有关它的更多信息。实际上,您没有改变它的行为,因此不需要扩展它

为了让JScrollPane显示整行,您需要将窗口的大小更改为@MadProgrammer中显示的行大小

与第2点相关,避免使用setSize。。。而是覆盖getPreferredSize:有关更多信息,请参阅

你忘了叫super.paintComponent。。。方法在您的paintComponent方法中

与第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);
        }
    }
}
这产生了类似的结果:


为了更快地获得更好的帮助,请发布一个适当的帖子,您是否正在呼叫pack?你在扩展JFrame吗?这不是一个好主意:请看我的MainFrame扩展了JFrame,而我的绘图类扩展了JPanel。我不是在给pack打电话。你看过这两个链接了吗?需要一个MCVE,这样我们可以帮助您更快更好我扩展了代码,这重现了我的问题最可能的问题是,您的绘图面板的大小与您的绘图30000X10的大小不同。您必须专门设置其大小,它不会根据您绘制的内容自动设置。