Mit addMouseListener() und paintComponent() für JPanel
Dies ist ein follow-up zu meinem Vorherige Frage. Ich habe vereinfacht, so viel wie ich konnte, und es funktioniert immer noch nicht! Obwohl, die gute Sache, die ich gekommen, um mit getGraphics()
.
Eine detaillierte Erklärung, was geht hier falsch ist Massiv geschätzt. Mein Verdacht ist, dass etwas falsch mit der Art, wie ich verwendet addMouseListener()
Methode hier.
BEARBEITEN völlig schrieb den code. Noch immer nicht richtig funktioniert, obwohl.
import java.awt.Color;
import java.awt.Graphics;
import java.awt.event.MouseEvent;
import java.awt.event.MouseListener;
import java.awt.event.MouseMotionListener;
import javax.swing.JFrame;
import javax.swing.JPanel;
public class RunClass{
static MainClass1 inst1 = new MainClass1();
public static void main(String args[]){
JFrame frame1 = new JFrame();
frame1.add(inst1);
frame1.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame1.setTitle("NewPaintToolbox");
frame1.setSize(200, 200);
frame1.setLocationRelativeTo(null);
frame1.setVisible(true);
}
}
class MainClass1 extends JPanel implements MouseListener, MouseMotionListener{
int xvar=30;
int yvar=30;
//static PaintClass22 inst1 = new PaintClass22();
@Override
public void mouseClicked(MouseEvent arg0) {
//TODO Auto-generated method stub
xvar = arg0.getX();
yvar = arg0.getY();
repaint(xvar,yvar,10,10);
}
@Override
public void mouseEntered(MouseEvent arg0) {
//TODO Auto-generated method stub
}
@Override
public void mouseExited(MouseEvent arg0) {
//TODO Auto-generated method stub
}
@Override
public void mousePressed(MouseEvent arg0) {
//TODO Auto-generated method stub
}
@Override
public void mouseReleased(MouseEvent e) {
//TODO Auto-generated method stub
}
@Override
public void mouseDragged(MouseEvent arg0) {
//TODO Auto-generated method stub
xvar = arg0.getX();
yvar = arg0.getY();
repaint(xvar,yvar,10,10);
}
@Override
public void mouseMoved(MouseEvent arg0) {
//TODO Auto-generated method stub
}
@Override
public void paintComponent(Graphics g){
super.paintComponent(g);
g.setColor(Color.RED);
g.fillRect(xvar, yvar, 10, 10);
}
}
Du musst angemeldet sein, um einen Kommentar abzugeben.
Müssen Sie den mouseListener auf das panel. Das passiert aber nicht standardmäßig, als Sie erwartet haben könnte 😉
BTW: es ist nicht empfehlenswert, aussetzen der öffentlichen api, die ist nur gedacht, um intern verwendet werden. Also anstatt zuzulassen, dass das panel MouseListener implementieren (was erzwingt der Exposition der Bevölkerung), lassen Sie das panel erstellen und verwenden Sie ein MouseListener:
BTW 2: Aufruf der repaint auf der begrenzten Fläche nicht genau, was Sie wollen (?) - es vorübergehend addiert die Quadrate der Malerei, Sie sind verloren, wenn das ganze panel ist neu lackiert (gleiche Wirkung wie mit getGraphics). Je nachdem, was Sie wirklich wollen,
paintComponent
vorMouseActionListener
umgesetzt wird?Beachten Sie die Tippfehler in Ihrem Methode:
Ihre Methode benannt ist
paintComponent
während Sie telefonierensuper.paintComponents
(plural). Wenn Sie eine Methode überschreiben (und ich würde stark vorschlagen, fügen Sie ein@Override
- tag, um zu vermeiden, dass aufgrund eines Tippfehlers sind Sie eigentlich nichts überschreiben) wiepaintComponent
, stellen Sie sicher, rufen Sie diesuper
Methode (die gleiche Methode, und nicht ein anderes).Erstens, die
PaintClass11
ist nie benutzt...Zweitens selbst wenn es war, erstellen Sie zwei separate Instanzen des
PaintClass22
man, das auf der frame-und eine, die Sie versuchen, zu aktualisieren...also keine updates immer auftreten, auf dem Bildschirm.Brauchen Sie nicht zwei separate Klassen. Merge
PaintClass11
undPaintClass22
in eine einzelne Klasse und hinzufügen, dass Sie Ihren RahmenpaintComponent
arbeitet bei der Initialisierung einmal, aber anscheinend ist etwas falsch mitMouseListener
.