通过Java在ScrollPane中绘制一个巨大的面板

4
我的问题是我想画一个巨大的面板,但在小尺寸的框架中无法看到该面板,因此我决定使用ScrollPane,并且我已经使用了它。
但是通过滚动会发生冲突,所以我无法看到任何面板。我只想解决这个问题。
请有人查看我的代码并运行它,帮助解决这个问题。
import java.awt.*;
import javax.swing.*;

public class Swing{
    JFrame frame;
    Panel panel;
    public static void main(String [] args){
        Swing a  = new Swing();
        a.go();
    }
    public void go(){
        frame  = new JFrame();
        panel = new Panel();
        panel.setPreferredSize(new Dimension(5000, 5000));
        JScrollPane scroll = new JScrollPane(panel);
        frame.add(scroll);
        frame.pack();
        frame.setVisible(true);
    }

    class Panel extends JPanel{
        public void paintComponent(Graphics g){
            Graphics2D a = (Graphics2D)g;
            a.setColor(Color.RED);
            a.drawLine(50, 50, 5000, 5000);
        }
    }
}

谢谢您提前的支持!


2
顺便说一句,很好的代码示例!它直接切入主题,并且(对于我们理解Swing绘图的人来说)清楚地说明了为什么它失败了。 - Andrew Thompson
1个回答

6

始终确保调用super.paintComponent(g);以重新绘制组件的其余部分。否则,这些类型的绘画伪影将会出现。

import java.awt.*;
import javax.swing.*;

public class Swing{
    JFrame frame;
    Panel panel;
    public static void main(String [] args){
        Swing a  = new Swing();
        a.go();
    }
    public void go(){
        frame  = new JFrame();
        panel = new Panel();
        panel.setPreferredSize(new Dimension(5000, 5000));
        JScrollPane scroll = new JScrollPane(panel);
        frame.add(scroll);
        frame.pack();
        frame.setVisible(true);
    }

    class Panel extends JPanel{
        public void paintComponent(Graphics g){
            super.paintComponent(g);  // VERY IMPORTANT!
            Graphics2D a = (Graphics2D)g;
            a.setColor(Color.RED);
            a.drawLine(50, 50, 5000, 5000);
        }
    }
}

@MadProgrammer 提到了一个经常出现的问题。请参见在Java Swing中应避免使用set(Preferred|Maximum|Minimum)Size方法吗?(是的)。我不会编辑答案,因为这只需要“一行代码”即可解决问题。但请仔细阅读该线程。我怀疑在这种情况下,最好重写自定义组件中的getPreferredSize()方法。 - Andrew Thompson
1
@user3148422,你应该把勾选标记还给这个答案。我只是提出了一个建议。super.paintComponent是你的主要问题。 - Paul Samsotha

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