Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/369.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 多个图形2D对象_Java_Swing_Components_Graphics2d - Fatal编程技术网

Java 多个图形2D对象

Java 多个图形2D对象,java,swing,components,graphics2d,Java,Swing,Components,Graphics2d,我有一个JPanel的图形对象,运行良好: import java.awt.Color; import java.awt.Graphics; import java.awt.Graphics2D; import java.awt.geom.Rectangle2D; import javax.swing.JPanel; public class GraphicsTest extends JPanel { private Graphics2D g2d; private String

我有一个JPanel的图形对象,运行良好:

import java.awt.Color;
import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.geom.Rectangle2D;
import javax.swing.JPanel;

public class GraphicsTest extends JPanel
{
    private Graphics2D g2d;
    private String state;
    private int x, y;

    @Override
    public void paintComponent(Graphics g)
    {
        super.paintComponent(g);
        g2d = (Graphics2D) g;
        g2d.setClip(0, 0, getWidth(), getHeight());

        g2d.setColor(Color.BLACK);
        g2d.drawString("STATE: " + state, 5, 15);
        g2d.drawString("Mouse Position: " + x + ", " + y, 5, 30);

        g2d.setColor(Color.red);
        Rectangle2D r2d = new Rectangle2D.Double(x,y,10,10);
        g2d.draw(r2d);
        Test t = new Test();
        super.add(t);

        repaint();
    }

    public void setState(String state) { this.state = state; }
    public String getState() { return state; }

    public void setX(int x) { this.x = x; }
    public void setY(int y) { this.y = y; }
}
我正在试验一个新的图形组件,当我实例化一个新的测试并将其添加到GraphicsTest中时,什么都没有发生。我做错了什么

import java.awt.Color;
import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.geom.Rectangle2D;
import javax.swing.JComponent;

public class Test extends JComponent
{
    private Graphics2D g2d;
    private String state;
    private int x, y;

    @Override
    public void paintComponent(Graphics g)
    {
        super.paintComponent(g);
        g2d = (Graphics2D) g.create();

        g2d.setColor(Color.GREEN);
        g2d.fill(new Rectangle2D.Double(60, 60,
                10, 10));

        repaint();
    }

    public void setState(String state) { this.state = state; }
    public String getState() { return state; }

    public void setX(int x) { this.x = x; }
    public void setY(int y) { this.y = y; }

}

谢谢

您应该只添加一次测试组件并设置布局:

public GraphicTest()
{
    super();
    setLayout(new BorderLayout());
    add(new Test(),BorderLayout.CENTER);
}

另外,不要保存
Graphics2D
对象,因为一旦
paintComponent
完成,这些对象将无效,并且不要在
paintComponent
内部调用
repaint
。如果需要动画,请使用计时器,并在
setXXX
方法中调用
repaint
,以更改组件的外观。

那么就不可能在JPanel上绘制新的图形对象了吗?测试组件可以有自己的paintComponent方法来绘制某些内容。您可能希望使用
setOpaque(false)
方法使其透明。如何将其添加到JPanel?要添加子组件,请使用
add
方法。查看答案。在调试器中检查子组件的大小和坐标(
getSize
getLocation
方法)。您需要使用布局(推荐方法)或手动管理其相对于父零部件的大小和位置。