为什么我的绘图面板,有时是绘画和其他时间没有,在窗口调整大小?

时间:2012-03-12 06:24:38

标签: java swing drawing paintcomponent

我有这个简单的应用程序,其中像RECT 10 20 100 150这样的命令在DrawPanel上绘制一个带有指定参数的矩形(扩展JPanel)。

此外,在绘制基元后,它将其添加到List<String> cmdList;,以便在中 DrawPanel的paintComponent(Graphics g)我遍历列表,处理每个命令,并绘制每个命令。

我遇到的问题是在绘制几个形状后,调整大小(或最大化)面板变空。再次调整大小几次,所有的shpaes都被正确绘制。

这是绘制几个原语后的屏幕截图。 enter image description here

将窗口略微向左拉伸后,基元消失了。 enter image description here

DrawPanel

的代码
public class DrawPanel extends JPanel {

    private List<String> cmdList;
    public final Map<String,Shape> shapes;

    public DrawPanel()
    {
        shapes = new HashMap<String,Shape>();
        shapes.put("CIRC", new Circ());
        shapes.put("circ", new Circ());
        shapes.put("RECT", new Rect());
        shapes.put("rect", new Rect());
        shapes.put("LINE", new Line());
        //... and so on

        cmdList = new ArrayList<String>();
    }
    public void addCmd(String s)
    {
        cmdList.add(s);
    }
    public void removeCmd()
    {
        cmdList.remove(cmdList.size());
    }
    public void paintComponent(Graphics g) 
    {
        super.paintComponent(g);

        setBackground(Color.BLACK);

        for (int i = 0;  i < cmdList.size(); ++i){
            StringTokenizer cmdToken = new StringTokenizer(cmdList.get(i));

            String cmdShape = cmdToken.nextToken(); 
            int []args = new int[cmdToken.countTokens()];

            for(int i1 = 0; cmdToken.hasMoreTokens(); i1++){
                args[i1] = Integer.valueOf(cmdToken.nextToken());
            }

            shapes.get(cmdShape).draw(this, args);
        }
    }

    public void getAndDraw(String cmdShape, int[] args)
    {
        shapes.get(cmdShape).draw(this, args);
    }
    public void rect(int x1, int y1, int width, int height)
    {
        Graphics g = getGraphics();
        g.setColor(Color.BLUE);
        g.drawRect(x1, y1, width, height);
    }
    public void circ(int cx, int cy, int radius)
    {
        Graphics g = getGraphics();
        g.setColor(Color.CYAN);
        g.drawOval(cx - radius, cy - radius, radius*2, radius*2);
    }
}

形状(接口)的部分代码

public interface Shape {
    void draw(DrawPanel dp, int[] data);
}

class Rect implements Shape {
    public void draw(DrawPanel dp, int[] data) {
        dp.rect(data[0], data[1], data[2], data[3]);
    }
}

输入每个命令后, MainFrame (扩展JFrame)中使用的行进行绘制。

drawPanel.getAndDraw(cmdShape, args);
drawPanel.addCmd(cmd);

为什么在窗口调整大小时,绘图面板(有时是绘画和其他时间没有)? 如何获得稳定的输出?

注意:如果我错过了什么,请询问。

1 个答案:

答案 0 :(得分:3)

这是因为你应该使用作为paintComponent参数传递的Graphics对象时使用getGraphics()。

哦,顺便说一句,setBackground(Color.BLACK)应该在构造函数中,而不是在paintComponent方法中。