在JScrollPane内部绘制JPanel

时间:2015-12-10 00:20:27

标签: java swing jpanel jscrollpane

我尝试使用覆盖paintComponent方法的类来绘制JPanel。

当整个面板重新绘制时,这样可以正常工作。当我向左,向上或向下滚动或调整大小时,它工作正常。按整个"页面移动滚动条"在右边也似乎工作正常。

但是,当我向右滚动,通过拖动条形图或单击小调整按钮时,图形似乎略微偏移到它们应该的位置的左侧,当与部分重绘结合时直线变坏了。

此示例再现了该问题。只需运行它并将水平滚动条拖动一点。

import java.awt.Dimension;
import java.awt.EventQueue;
import java.awt.Graphics;

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

public class test {

    private class MyPanel extends JPanel {
        public MyPanel() {
            super();
        }

        public Dimension getPreferredSize() {
            return new Dimension(2000, 200);
        }

        public void paintComponent(Graphics g) {
            super.paintComponent(g);

            g.drawLine(0, 0, 2000, 200);
            g.drawLine(0, 200, 2000, 0);
        }
    }

    private JFrame frame;
    private JScrollPane sp;
    private MyPanel mp;

    /**
     * Launch the application.
     */
    public static void main(String[] args) {
        EventQueue.invokeLater(new Runnable() {
            public void run() {
                try {
                    test window = new test();
                    window.frame.setVisible(true);
                } catch (Exception e) {
                    e.printStackTrace();
                }
            }
        });
    }

    /**
     * Create the application.
     */
    public test() {
        initialize();
    }

    /**
     * Initialize the contents of the frame.
     */
    private void initialize() {
        frame = new JFrame();
        frame.setBounds(100, 100, 450, 200);
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

        mp = new MyPanel();
        sp = new JScrollPane(mp);
        frame.add(sp);
    }

}

这就是我得到的:

screenshot

我做错了什么?

1 个答案:

答案 0 :(得分:1)

显然这是OpenJDK 7中的一个错误。

完全相同的代码在OpenJDK 8中无需重新编译即可运行。