2017-10-26 2 views
1

Ich versuche JPanel zu verwenden, um auf der Leinwand mit der Maus zu malen. Bis jetzt funktioniert alles gut. Ich kann zeichnen. und ich kann die Farbe so einstellen, wie ich es möchte. Allerdings versuche ich es so zu machen, dass wenn ich auf eine Schaltfläche klicke, ändert sich die Farbe zu der, an die die Schaltfläche angehängt ist.JPanel Farben ändern, um mit der Maus zu zeichnen

Wie wenn ich mit Schwarz zeichne, dann drücke den "Blau" -Knopf, es ändert sich zu Blau statt zu Schwarz ... Ich bin mir nicht sicher, wo ich aber falsch liege. Heres mein paintComponent Teil.

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

    button1.addActionListener(new ActionListener() { 
     @Override 
     public void actionPerformed(ActionEvent e) { 
      if (e.getSource() == button1) 
       g.setColor(Color.BLUE); 
     } 
    }); 

    for (Point point : points) 
     g.fillOval(point.x, point.y, 4 , 4); 
} 
+0

Eine einzelne leere Zeile des weißen Raumes in Quellcode all das ist * überhaupt * nötig. Leere Zeilen nach '{' oder vor '}' sind normalerweise redundant. –

Antwort

2

Nein, nein, nein. Warum fügen Sie einer Schaltfläche in einer Malmethode eine ActionListener hinzu? Die Malmethode könnte ein Dutzend Mal in schneller Folge vom Repaint-Manager aufgerufen werden, jetzt haben Sie ein Dutzend oder mehr ActionListener s auf der Schaltfläche registriert .. die nichts tun werden.

Beginnen Sie mit der Erstellung eines Feldes, in dem die gewünschte Farbe gespeichert werden kann. Registrieren Sie einen ActionListener auf Ihren Buttons, wahrscheinlich über den Klassenkonstruktor, der die "Farbe" ändert und einen neuen Malzyklus auslöst. Wenn paintComponent genannt, gelten die gewünschte Lackfarbe

private Color paintColor = Color.BLACK; 

protected void setupActionListener() { 
    button1.addActionListener(new ActionListener() { 
     @Override 
     public void actionPerformed(ActionEvent e) { 
      if (e.getSource() == button1) { 
       paintColor = Color.BLUE; 
       repaint(); 
      } 
     } 
    });  
} 

@Override 
public void paintComponent(Graphics g) 
{ 
    super.paintComponent(g); 
    g.setColor(paintColor); 
    for (Point point : points) 
     g.fillOval(point.x, point.y, 4 , 4); 


} 

Nun gehen und lesen Performing Custom Painting und Painting in AWT and Swing besser zu gewinnen verstehen, wie sich Malerei tatsächlich funktioniert in Swing

+0

Danke! Das hat eine Tonne geholfen! Ich bin sicher, dass meine offensichtlichen noob Java-Fähigkeiten gezeigt haben ... lol – user2951723

+1

Kann ich noch eine Frage stellen? Diese Methode, die du gegeben hast, hat super funktioniert, aber wie würde ich es so machen, dass alles, was bereits gezeichnet wurde, nicht verändert wird, wenn die neue Farbe geändert wird? Wenn ich zum Beispiel blau zeichne und dann rot zeichne, möchte ich, dass die blaue Zeichnung immer noch da ist. Aber stattdessen ändert sich alles zu rot. – user2951723

+0

Dies ist eine größere Frage - Sie haben zwei grundlegende Optionen. Entweder du zeichnest die Farbe auf, die benutzt wurde, um die Punkte zu fangen, wickle sie in ein benutzerdefiniertes Objekt oder du maltest in einen Hintergrundpuffer, wie ein 'BufferedImage' und dann male ich die 'paintComponent' Methode – MadProgrammer

Verwandte Themen