【问题标题】:Multiple Graphics2D Objects多个 Graphics2D 对象
【发布时间】:2011-01-27 04:19:37
【问题描述】:

我有一个 JPanel 的 Graphics 对象,它工作正常:

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; }
}

我正在试验一个新的 Graphics 组件,当我实例化一个新的 Test 并将它添加到 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; }

}

谢谢!

【问题讨论】:

    标签: java swing components graphics2d


    【解决方案1】:

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

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

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

    【讨论】:

    • 那么就不可能在JPanel之上绘制一个新的图形对象吗?
    • Test 组件可以有自己的paintComponent 方法来绘制一些东西。您可能希望使用setOpaque(false) 方法使其透明。
    • 我如何将它添加到 JPanel 中?
    • 添加子组件使用add 方法。查看答案。
    • 在调试器中检查子组件的大小和坐标(getSizegetLocation 方法)。您需要使用布局(推荐方法)或手动管理其相对于父组件的大小和位置。
    猜你喜欢
    • 2013-03-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-11-27
    • 1970-01-01
    相关资源
    最近更新 更多