Пользовательский JComponent не отображается в пользовательском JPanel - PullRequest
3 голосов
/ 14 марта 2010

Я попробовал метод 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 Ответ

1 голос
/ 14 марта 2010

Ваша проблема - g2d.dispose (). Уберите их, и это должно сработать. Я подозреваю, что это может вызвать различное поведение на разных jvms. Похоже, что происходит, когда объект g2d используется для рисования объектов в объекте GraphicsTest. Затем тот же объект g2d пытается нарисовать материал на объекте Test, но он был удален, поэтому он ничего не может нарисовать. Есть случаи, когда вы хотите вызвать g2d.dispose (), но это не один из них.

Еще одна вещь, которую я сделал, чтобы ваш код работал, я изменил менеджер раскладки:

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

Макет по умолчанию должен быть Flow Layout. Я не уверен, почему это не сработает с Flow Layout.

...