从Java中的另一个方法调用paint()

时间:2014-06-20 07:53:01

标签: java swing graphics components paint

我想用Java实现的是能够从另一种方法中绘制随机形状,而不必从头开始绘制那些形状(用户选择x,y,w,h本身)

这是我到目前为止所做的:

public class Design extends JComponent {
private static final long serialVersionUID = 1L;

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

public void drawRect(int xPos, int yPos, int width, int height) {
    Graphics g = null;
    g.drawRect(width, height, xPos, yPos);
}
}

正如你在上面看到的那样,我有drawRect函数编码,但是我不知道怎么做它所以当我调用drawRect()函数时,它得到paint()函数来绘制一个矩形,而这正是什么paint函数在其中输入g.drawRect()和你的x,y,w,h。 我之所以这样做而不仅仅是直接使用paint()是因为我正在尝试创建一个组件而不必每次都输出paint()函数,我只是将这个类添加到我的Swing中它是完成。

希望你明白我在这里想要实现的目标。 感谢。

2 个答案:

答案 0 :(得分:1)

你需要做的第一件事是放弃你可以控制绘画过程的想法,你不能,你可以回应绘制事件并向RepaintManager发出更新请求可能需要。

基本上,你不能直接打电话给paint,为了回应RepaintManager想要画的东西而调用画。

请查看Painting in AWT and SwingPerforming Custom Painting

转到您的代码。不要覆盖paint,当然不要绕过油漆过程,相反,它应该看起来更像这样......

@Override
protected void paintComponent(Graphics g) {
    super.paintComponent(g);
    drawRect(g, 10, 10, 10, 10);
}

protected void drawRect(Graphics g, int xPos, int yPos, int width, int height) {
    g.drawRect(xPos, yPos, width, height);
}

Graphics#drawRect实际上按顺序获取参数xywidthheight ...

  

我这样做的原因并不仅仅是直接使用paint()是因为我试图制作一个组件而不必每次都输出paint()函数

没有意义,这是使用paint方法的重点,因此您可以自定义组件的绘制方式,创建大量实例并将其添加到GUI中......这就是所有Swing控件的工作原理......

此外,您可能会发现感兴趣的2D Graphics

根据评论更新

所以,你想要一个其他对象可以调用的方法,它将使它们能够添加一个"矩形"到现有的对象/组件......

首先定义Rectangle

的实例变量
private Rectangle rectangle;

paintComponent中,检查rectangle是否null是否为protected void paintComponent(Graphics g) { super.paintComponent(g); if (rectangle != null) { Graphics2D g2d = (Graphics2D)g; g2d.draw(rectangle); } } ,如果不是,请将其绘制成......

drawRect

现在,更新您的Rectangle方法以创建实例public void drawRect(int xPos, int yPos, int width, int height) { rectangle = new Rectangle(xPos, yPos, width, height); repaint(); } 并请求重新绘制该组件

public class Design extends JComponent {

    private Rectangle rectangle;

    protected void paintComponent(Graphics g) {
        super.paintComponent(g);
        if (rectangle != null)  {
            Graphics2D g2d = (Graphics2D)g;
            g2d.draw(rectangle);
        }
    }

    public void drawRect(int xPos, int yPos, int width, int height) {
        rectangle = new Rectangle(xPos, yPos, width, height);
        repaint();
    }
}

例如......

List

现在,如果你想支持多个矩形,你可以简单地使用Rectangle并根据需要添加任意数量的实例List,迭代paintComponent {{1}} 1}}方法

答案 1 :(得分:1)

您需要通过调用paintComponent()super.paintComponent()方法内完成所有绘画。

我建议您在List中存储所有需要的形状,并在paintComponent()中绘制所有形状。 而不是drawRect使用addRect之类的内容,为List添加新形状并调用repaint()方法。检查下一个简单的例子:

import java.awt.BorderLayout;
import java.awt.Dimension;
import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.Rectangle;
import java.awt.Shape;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.util.ArrayList;
import java.util.List;
import java.util.Random;

import javax.swing.JButton;
import javax.swing.JComponent;
import javax.swing.JFrame;

public class TestFrame extends JFrame {

    public TestFrame() {
        System.out.println("as".equalsIgnoreCase(null));
        setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        init();
        pack();
        setVisible(true);
    }

    private void init() {
        final Design d = new Design();
        d.addRect(0,0,10,20);

        JButton b = new JButton("add");
        b.addActionListener(new ActionListener() {

            @Override
            public void actionPerformed(ActionEvent e) {
                Random r = new Random();
                int w = r.nextInt(100);
                int h = r.nextInt(100);
                d.addRect(0,0,w,h);
            }
        });
        add(d);
        add(b,BorderLayout.SOUTH);
    }

    public static void main(String... strings) {
        new TestFrame();
    }

    private class Design extends JComponent {
        private static final long serialVersionUID = 1L;

        private List<Shape> shapes = new ArrayList<Shape>();

        public void paint(Graphics g) {
            super.paintComponent(g);
            Graphics2D g2d = (Graphics2D) g;
            for(Shape s : shapes){
                g2d.draw(s);
            }
        }

        public void addRect(int xPos, int yPos, int width, int height) {
            shapes.add(new Rectangle(xPos,yPos,width,height));
            repaint();
        }

        @Override
        public Dimension getPreferredSize() {
            return new Dimension(100,100);
        }

    }

}