Hi,
bin gerade das Tutorial von Sun am durcharbeiten zu painting in Swing: Creating the Demo Application (Step 3) (The Java™ Tutorials > Creating a GUI with JFC/Swing > Performing Custom Painting)
Klappt soweit auch, nur hab ich mal ein bisschen rumprobiert, um es zu verinnerlichen und dabei stellt sich mir folgende Frage:
Den folgenden Code rufe ich in einer von JPanel abgeleiteten Klasse auf:
Das sollte doch bedeuten, dass alle Pixel im Rechteck 10,10 und 19,19 neu gezeichnet werden und drumherum alles "beim Alten" bleibt. Komischerweise verändern sich allerdings auch Pixel drumherum. Ohne dass ich die parameterlose repaint()-Methode aufrufe, dürfte da doch nichts passieren?!
Der komplette Code:
(das JPanel zeichnet ein Rechteck an der Stelle squareX, squareY mit der Kantenlänge squareW, squareH. Beim Auslösen eines MouseEvents wird die Position verändert, an der alten Stelle der Bildschirm "gereinigt" an der neuen Stelle das Rechteck gezeichnet. Das funktioniert wunderbar. Ich habe noch hinzuprogrammiert, dass in einer Ecke die Koordinaten ausgegeben werden (wird bei jedem MouseEvent hingezeichnet) und mal ausprobiert, wenn ich dort nicht den gesamten Schriftbereich repaint(x,y,w,h) aktualisiere sondern nur o.g. 10x10-Pixel-Rechteck. Trotzdem ändert sich aber auch außerhalb davon die Darstellung. Zur Kontrolle hab ich mal ein Rechteck an der Stelle dazugezeichnet, an der aktualisiert werden soll)
Dank im Voraus für Erläuterungen!
bin gerade das Tutorial von Sun am durcharbeiten zu painting in Swing: Creating the Demo Application (Step 3) (The Java™ Tutorials > Creating a GUI with JFC/Swing > Performing Custom Painting)
Klappt soweit auch, nur hab ich mal ein bisschen rumprobiert, um es zu verinnerlichen und dabei stellt sich mir folgende Frage:
Den folgenden Code rufe ich in einer von JPanel abgeleiteten Klasse auf:
Code:
repaint(10,10,10,10)
Der komplette Code:
(das JPanel zeichnet ein Rechteck an der Stelle squareX, squareY mit der Kantenlänge squareW, squareH. Beim Auslösen eines MouseEvents wird die Position verändert, an der alten Stelle der Bildschirm "gereinigt" an der neuen Stelle das Rechteck gezeichnet. Das funktioniert wunderbar. Ich habe noch hinzuprogrammiert, dass in einer Ecke die Koordinaten ausgegeben werden (wird bei jedem MouseEvent hingezeichnet) und mal ausprobiert, wenn ich dort nicht den gesamten Schriftbereich repaint(x,y,w,h) aktualisiere sondern nur o.g. 10x10-Pixel-Rechteck. Trotzdem ändert sich aber auch außerhalb davon die Darstellung. Zur Kontrolle hab ich mal ein Rechteck an der Stelle dazugezeichnet, an der aktualisiert werden soll)
Code:
package painting;
import java.awt.Color;
import java.awt.Dimension;
import java.awt.Graphics;
import javax.swing.BorderFactory;
import javax.swing.JPanel;
import java.awt.event.MouseEvent;
import java.awt.event.MouseAdapter;
public class MyPanel extends JPanel {
private int squareX = 50;
private int squareY = 50;
private int squareW = 20;
private int squareH = 20;
public MyPanel(){
setBorder(BorderFactory.createLineBorder(Color.black,5));
addMouseListener(new MouseAdapter(){
public void mousePressed(MouseEvent e){
moveSquare(e.getX(),e.getY());
}
});
addMouseMotionListener(new MouseAdapter(){
public void mouseDragged(MouseEvent e){
moveSquare(e.getX(),e.getY());
}
});
}
private void moveSquare(int x, int y){
int OFFSET = 1;
if ((squareX != x) || (squareY != y)){
repaint(squareX, squareY, squareW+OFFSET, squareH+OFFSET);
squareX = x;
squareY = y;
repaint(squareX, squareY, squareW+OFFSET, squareH+OFFSET);
repaint(10,10,10,10);
}
}
public Dimension getPreferredSize(){
return new Dimension(250,200);
}
public void paintComponent(Graphics g){
System.out.println("paintComponent, " + squareX + ", " + squareY);
super.paintComponent(g);
g.drawString("Hello Component!",50,200);
g.setColor(Color.red);
g.fillRect(squareX, squareY, squareW, squareH);
g.setColor(Color.black);
g.drawRect(squareX, squareY, squareW, squareH);
g.drawString("|" + squareX + "|" + squareY + "|", 2,20);
g.drawRect(10,10,10,10);
}
}