自定义JComponent未显示在自定义JPanel中

时间:2010-03-13 21:58:57

标签: java jpanel java-2d jcomponent

我尝试过add()方法但是当我尝试将Test添加到GraphicsTest时没有显示任何内容。我应该如何添加它?有人能告诉我吗?我已经包含了我正在使用的代码。

这是我的方式而且不起作用。有人可以告诉我或让我知道问题到底是什么吗?

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

public class Test extends JComponent
{
    @Override
    public void paintComponent(Graphics g)
    {
        super.paintComponent(g);
        Graphics2D g2d = (Graphics2D) g.create();
        g2d.setColor(Color.red);
        g2d.drawString("Hello", 50, 50);
        g2d.dispose();
    }
}

这是另一个类:

   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;

   GraphicsTest()
   {
       Test t = new Test();
       t.setVisible(true);
       add(t);
   }

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

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

       g2d.dispose();
    }

    public void setState(String state) { this.state = state; }
    public String getState() { return state; }
    public void setX(int x) { this.x = x; repaint(); }
    public void setY(int y) { this.y = y; repaint(); }
}

1 个答案:

答案 0 :(得分:1)

你的问题是g2d.dispose()。拿出那些它应该工作。我怀疑这可能会导致不同的jvms上出现不同的行为。看来正在发生的是g2d对象用于在GraphicsTest对象上绘制东西。然后相同的g2d对象尝试在Test对象上绘制东西,但它已被处理,因此它无法绘制任何东西。有些情况下你想调用g2d.dispose(),但这不是其中之一。

我为使代码工作而做的另一件事是我更改了布局管理器:

setLayout(new BorderLayout());
add(t, BorderLayout.CENTER);

默认布局应为Flow Layout。我不确定为什么它不适用于Flow Layout。