JPanel矩形覆盖;不会删除

时间:2012-03-23 04:56:44

标签: java swing jframe jpanel repaint

我必须使用插入排序对10个数字的数组进行排序,并使用矩形(即条形图)显示它们。每次用户点击“下一个”时,它将对数组中的下一个位置进行排序。控制台确认我的算法正在运行,矩形将变得更大/更小,但只会覆盖另一个矩形的顶部;在绘制新矩形之前,面板不会被擦除。我怎样才能解决这个问题?以下是我的代码的重要部分:

 public class graphTest extends JFrame {

    int[] numbers = {31, 19, 76, 24, 94, 99, 21, 74, 40, 73};
    private JButton action = new JButton("Next");

    public graphTest(){
        final ImagePanel p1 = new ImagePanel();
        add(action, BorderLayout.SOUTH);
        p1.add(new ImagePanel(), BorderLayout.CENTER);
        add(p1,BorderLayout.CENTER);
        action.addActionListener(new ActionListener() {
            public void actionPerformed(ActionEvent e) {
                //Code for insertion sort
                p1.repaint();
                //System.out.println testing array
            }
        });
    }

    class ImagePanel extends JPanel{
        public void paintComponent (Graphics g){
            super.paintComponents(g);
            g.setColor(Color.black);
            for(int i = 0; i < 10; i++)
                g.drawRect(10*i+10,200-numbers[i],7,numbers[i]);
        }
    }

    public static void main(String[] args) {
        JFrame frame = new graphTest();
        frame.setTitle("Hi");
        frame.setSize(300, 300);
        frame.setLocationRelativeTo(null);
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
        frame.setVisible(true);
        }

}

我通过在绘制常规矩形之前绘制一个大的fillRect来快速解决,但我仍然想学习如何正确地重绘JPanel。

2 个答案:

答案 0 :(得分:3)

ImagePanel.paintComponent( Graphics g )

当您真正想要的是super.paintComponents(g)

时,请致电super.paintComponent(g)

答案 1 :(得分:2)

我将super.paintComponents更改为super.paintComponent(最后没有'),它似乎工作正常。