Grafik wird "übermalt"

Xym

Erfahrenes Mitglied
Ich versuche als Übung eine Art Paint-Programm zu schaffen.

Mein 1. Ziel ist es ein Strich mit der Maus zu malen.

Das Problem ist nur, dass das Viereck nur der Maus folgt. Eig. war es so geplant das bei jeder neuen veränderung der Maus das Viereck sich verändert und das alte bleibt.

Außerdem soll es auf Buttonklick eine "neue" Weiße Fläche erscheinen. Doch diese erscheint nur sehr kurz und wird auch wieder übermalt.

Code:
import java.awt.*;
import java.awt.event.*;
import javax.swing.*;

public class Paint extends JFrame implements MouseMotionListener
{
  public  int neu = 0;
    int linie=0;
    private int x,y;

    public Paint()
    {
        super(Paint.class.getName());
        Container cp = getContentPane();
        cp.setLayout(new BorderLayout());

        JButton button = new JButton("Neu");
        button.addActionListener(new ActionListener()
        {
            public void actionPerformed(final ActionEvent e)
            {
             neu = 1;
            }
        });

        JButton button2 = new JButton("Linie");
        button2.addActionListener(new ActionListener()
        {
          public void actionPerformed(ActionEvent e)
          {
           linie=1;
          }
        });

        Box menuBox = new Box(BoxLayout.X_AXIS);
        menuBox.add(button);
        menuBox.add(button2);


        cp.add(menuBox, BorderLayout.NORTH);

        final AnyPanel panel = new AnyPanel();
        cp.add(panel, BorderLayout.CENTER);
        setSize(600, 480);
        setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        setVisible(true);
        addMouseMotionListener( this );
    }


    public void mouseMoved( MouseEvent e )
   {
     x = e.getX();
     y = e.getY()-50;
     repaint();
     e.consume();

   }
  public void mouseDragged( MouseEvent e ) { }



    public static void main(final String[] argv)
    {
        new Paint();
    }
class AnyPanel extends JPanel
{

@Override
    public void paint( Graphics g)
    {
      super.paintComponents(g);
      if(neu==1)
      {
        g.setColor(Color.white);
        g.fillRect(1,1,10000,100000);
        neu=0;
      }
      if(linie==1)
      {
       g.setColor(Color.black);
       g.fillRect(x,y,10,10);
       linie=1;
      }
    }
}
}

Ich hoffe mal , dass ihr ein paar gute Einfälle habt. ;)
 
Zuletzt bearbeitet:
Hallo,

du solltest nochmal im Anypanel die paintComponent überschreiben und nicht die paint.

Wenn du einen Strich malen möchtest, musst du dir die Positionen merken.
Die paint-Methoden zeichnen ja die Component. Das heißt immer, wenn du das Fenster vergrößerst oder verkleinerst oder auch wenn du repaint aufrufst, werden die Components neu gezeichnet.
Das heißt das was schon gezeichnet ist wird sogesehen verworfen und neu gezeichnet.

Wenn du dir nicht alles merken möchtest, wo du gezeichnet hast, wäre es sinnvoll, wenn du das ganze auf ein Bufferedimage zeichnest und dieses immer wieder auf das Fenster zeichnest.

Gruß

Sascha
 
Habe bei google nach einer Lösung nun gesucht , aber es funktioniert leider noch nicht.
So siehts im moment aus:
Code:
import java.awt.*;
import java.awt.event.*;
import javax.swing.*;

public class Paint extends JFrame implements MouseMotionListener
{
  public  int neu = 0;
  int linie=0;
  private int x,y;
  Image image;


    public Paint()
    {
        super(Paint.class.getName());
        Container cp = getContentPane();
        cp.setLayout(new BorderLayout());

        JButton button = new JButton("Neu");
        button.addActionListener(new ActionListener()
        {
            public void actionPerformed(final ActionEvent e)
            {
             neu = 1;
            }
        });

        JButton button2 = new JButton("Linie");
        button2.addActionListener(new ActionListener()
        {
          public void actionPerformed(ActionEvent e)
          {
           linie=1;
          }
        });

        Box menuBox = new Box(BoxLayout.X_AXIS);
        menuBox.add(button);
        menuBox.add(button2);


        cp.add(menuBox, BorderLayout.NORTH);

        final AnyPanel panel = new AnyPanel();
        cp.add(panel, BorderLayout.CENTER);
        setSize(600, 480);
        setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        setVisible(true);
        addMouseMotionListener( this );
    }



    public void mouseMoved( MouseEvent e )
   {
     x = e.getX();
     y = e.getY()-50;

     e.consume();

   }
  public void mouseDragged( MouseEvent e ) { }



  public static void main(final String[] argv)
  {
      new Paint();
  }
    
    
class AnyPanel extends JPanel
{
   @Override
    public void paintComponents( Graphics g)
    {
      int width   = image.getWidth(this);
      int height  = image.getHeight(this);
      BufferedImage bImage  = new BufferedImage(width, height, BufferedImage.TYPE_INT_RGB);
      bImage.getGraphics().drawImage(image, 0, 0, this);

      super.paintComponents(g);
      if(neu==1)
      {
        g.setColor(Color.white);
        g.fillRect(1,1,10000,100000);
        neu=0;
      }
      if(linie==1)
      {
       g.setColor(Color.black);
       g.fillRect(x,y,10,10);
       linie=1;
      }
    }

}
}
 
Zurück