views:

175

answers:

1

I've tried the add() method but nothing is displayed when I try to add Test to GraphicsTest. How should I be adding it? Can someone show me? I've included the code I'm using.

This is my way and it's not working. Can someone show me or make me aware of what the problem actually is?

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

Here is the other class:

   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  A: 

Your problem is g2d.dispose(). Take those out and it should work. I suspect this may cause different behavior on different jvms. It appears what is happening is the g2d object is used to draw stuff on the GraphicsTest object. Then the same g2d object tries to draw stuff on on the Test object, but it has been disposed so it can't draw anything. There are cases where you want to call g2d.dispose() but this is not one of them.

The other thing I did to make your code work was I changed the layout manager:

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

The default layout should be Flow Layout. I'm not sure off hand why it wouldn't work with Flow Layout.

Jay Askren
I have tried your suggestion and removed both of the g2d.dispose(); to no avail.
Oops, I actually made two changes in the code to make it work. I didn't think the other change would make a difference.
Jay Askren
Thank you! It works finally! It has taken me all day to try to figure this out... Is Sun working on fixing this annoyance or is this documented somewhere else?
I'm not sure why Flow Layout doesn't work. My guess is that it has something to do what not setting the size of your Test instance.
Jay Askren
+1 for spotting `dispose()`. Also correct about `Flow Layout`. Override `getPreferredSize()` in `Test` and examine `super.getPreferredSize()` to see.
trashgod
I tried setting the preferredSize which should pretty much do the same thing. It didn't seem to work.
Jay Askren