Swing Rechteck uebermalen

G

gmx777

Gast
Hallo,

ich moechte einen Rechteck uebermalen. In einer Schleife will ich erst einen Rechteck zeichnen mit roter Farbe, dann eine Zeitverzoegerung einbauen und nach Ablauf der Zeit an selber Stelle soll ein Rechteck mit gleicher Groesse aber in blauer Farbe gezeichnet werden, dann wieder eine Zeitverzoegerung und dann soll die Schleife wieder den Vorgang wiederholen.
Ich habe es so probiert:


[JAVA=1]
import java.awt.BasicStroke;
import java.awt.Color;
import java.awt.Graphics;
import java.awt.Graphics2D;
import javax.swing.JPanel;


public class Rechteck1 extends JPanel{


private static final long serialVersionUID = 1L;

@Override
protected void paintComponent(Graphics g) {

super.paintComponent(g);

Graphics2D grafik2=(Graphics2D)g;



for(int i=0; i<40; i++){

try {
grafik2.setStroke(new BasicStroke(5));
g.setColor(Color.red);
g.drawRect(10, 10, 100, 100);
Thread.sleep(1000);
}
catch (InterruptedException e) {
e.printStackTrace();
}
try {
g.setColor(Color.blue);
g.drawRect(10, 10, 100, 100);
Thread.sleep(1000);
}
catch (InterruptedException e) {
e.printStackTrace();
}
}
}
}

[/code]


Leider geht es nicht. Erst wird ein leerer und durchsichtiger Rahmen angezeigt und dann das blaue Rechteck gewuenschter Effekt fehlt. Noch besser waere es mit einem Timer zu realesieren, leider fehlt mir das noetige Wissen dazu. Kann mir bitte jemand helfen?
 
G

gmx777

Gast

Hallo,

Danke fuer schnelle Hilfe, Tutorial ist sehr interessant, leider sehr gross

in paint nur malen, keine sleep-Verzögerung, das muss in einem separaten Thread passieren

Meinst eine extra Methode dafuer anlegen?

So etwa

[JAVA=0]
public void time(){
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}

}
[/code]

Und dann die Methode in paintComponent() aufrufen?

[JAVA=1]
@Override
protected void paintComponent(Graphics g) {

super.paintComponent(g);

Graphics2D grafik2=(Graphics2D)g;


for(int i=0; i<4; i++){


grafik2.setStroke(new BasicStroke(5));
g.setColor(Color.red);
g.drawRect(10, 10, 100, 100);

time();

g.setColor(Color.blue);
g.drawRect(10, 10, 100, 100);
System.out.println("text");

time();
}

}

[/code]

Geht leider auch nicht, vielleicht in einer Woche, wenn Tutorial durchgearbeitet? :)
 

André Uhres

Top Contributor
Hallo gmx777,

um ein Rechteck dadurch zu animieren, dass seine Farbe periodisch verändert wird, brauchen wir es nur ein einziges Mal in paintComponent zu zeichnen. Die Farbe setzen wir dort aufgrund eine Instanzvariablen "color".

Dann brauchen wir nur noch einen "javax.swing.Timer", der die Farbe "color" periodisch verändert und "repaint()" auf unserem JPanel aufruft, etwa so:
Java:
i = 40;
timer = new javax.swing.Timer(1000, new ActionListener() {

    @Override
    public void actionPerformed(final ActionEvent e) {
        if (i-- < 0) {
            timer.stop();
        } else {
            color = i % 2 == 0 ? Color.RED : Color.BLUE;
        }
        repaint();
    }
});
timer.start();
Dieser Timer wird außerhalb der paintComponent-Methode erzeugt und gestartet, etwa im Konstruktor des JPanels.
Siehe auch Malen in Swing Teil 1: der grundlegende Mechanismus - Byte-Welt Wiki

Gruß,
André
 
G

gmx777

Gast
blätter einfach paar Seiten durch, irgendwo kommt sicher Code mit Runnable oder Thread,
sowas muss es schon sein, einfache Methodenaufrufe helfen nicht

andere Links:
Java ist auch eine Insel – 15.33 AWT, Swing und die Threads
Threads and Swing

Hallo habe das Tutorial soweit durcharbeitet und das Programm uebermallt etwas, zwar eine Zahl die einem Text angehaengt wird, hier der Quelltext:
[JAVA=1]
import java.awt.*;
import javax.swing.*;


public class GamePanel extends JPanel implements Runnable{

private static final long serialVersionUID = 1L;
boolean game_running=true;

long delta=0;
long last=0;
long fps=0;

//Paint Methode
@Override
public void paint(Graphics g) {
super.paint(g);
g.setColor(Color.red);
g.drawString("FPS: "+Long.toString(fps), 200, 100);

}

public static void main(String[] args) {
new GamePanel(800, 600);

}



//Konstruktor
public GamePanel(int w, int h){
this.setPreferredSize(new Dimension(w,h));

JFrame frame = new JFrame("GameDemo");
frame.setLocation(100,100);
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

frame.add(this);
frame.pack();
frame.setVisible(true);
doIntialisations();
}


public void doIntialisations(){
last=System.nanoTime();
Thread t=new Thread(this);
t.start();
}

@Override
public void run() {
while(game_running){

computeDelta();
repaint();

try{
Thread.sleep(100);
}
catch (InterruptedException e) {
// TODO: handle exception
}
}

}//Ende run()

private void computeDelta(){
delta=System.nanoTime()-last;
last=System.nanoTime();
fps=((long)1e9)/delta;
}//Ende


}
[/code]

Wie kann man dies jetzt umbauen das es die Rechtecke statt der Zahl uebermahlt werden?
 
S

SlaterB

Gast
du hast das Runnable mit der Schleife, darin kannst du eine unbegrenzte Zahl von Klassenattributen beliebig verändern,
meinetwegen
> boolean maleJetztXYRechteck;
auf true oder false setzen und wer weiß was alles, dazu repaint(),
und dann hat die paint-Methode eine leere Zeichenfläche vor sich und malt anhand der Informationen in den Klassenattributen genau das, was du für diesen Zeitpunkt als richtig erachtest
 
G

gmx777

Gast
du hast das Runnable mit der Schleife, darin kannst du eine unbegrenzte Zahl von Klassenattributen beliebig verändern,
meinetwegen
> boolean maleJetztXYRechteck;
auf true oder false setzen und wer weiß was alles, dazu repaint(),
und dann hat die paint-Methode eine leere Zeichenfläche vor sich und malt anhand der Informationen in den Klassenattributen genau das, was du für diesen Zeitpunkt als richtig erachtest

Hallo SlaterB,

kannst es bitte gleich an einem Beispiel erklaeren? Mein Problem ist, dass ich deine Beschreibung nicht in die Tat umsetzen kann.
 
S

SlaterB

Gast
Attribut
boolean maleJetztXYRechteck;

run:
maleJetztXYRechteck = true;
maleJetztXYRechteck = false;

paint:
if (maleJetztXYRechteck) {
male sowieo;
} else {
male was anderes
}
 

André Uhres

Top Contributor
Hallo gmx777,

wenn wir zum Beispiel nur die Farbe ändern möchten, geht es auch so:
g.setColor(Color.red); -------ersetzen durch-------> g.setColor(getForeground());
...
setForeground(getForeground() == Color.RED ? Color.BLUE : Color.RED);
repaint();//(*)

Statt paint wird in Swing übrigens immer nur paintComponent überschrieben. Warum das so ist, wird hier erklärt: Malen in AWT und Swing - Byte-Welt Wiki

Gruß,
André

(*) repaint() kann man dann auch weglassen, weil setForeground schon einen repaint() macht.
 
Zuletzt bearbeitet:
Ähnliche Java Themen
  Titel Forum Antworten Datum
berserkerdq2 Kann ich ein Rechteck mittig im Fenster halten, egal wie ich die Bildschirmgröße verändere? AWT, Swing, JavaFX & SWT 3
berserkerdq2 Mein Rechteck hat 4 Seiten, ich soll je nach dem, welche Seite berührt wurde, etwas ausführen, wie prüfe ich das? AWT, Swing, JavaFX & SWT 12
B AWT Rechteck abnehmen lassen AWT, Swing, JavaFX & SWT 9
N Mit KeyListener ein rechteck zeichnen AWT, Swing, JavaFX & SWT 9
E Button verschwindet nachdem ein Rechteck gezeichnet wurde AWT, Swing, JavaFX & SWT 5
T Java Swing - kleines Rechteck unter dem cursor AWT, Swing, JavaFX & SWT 5
S Swing Rechteck über JTable zeichnen (per MouseListener) AWT, Swing, JavaFX & SWT 1
L Swing Ein Rechteck in ein Grid Zeichnen AWT, Swing, JavaFX & SWT 5
D Quadrat, Rechteck zeichnen AWT, Swing, JavaFX & SWT 3
F Java Swing Rechteck in JPanel zeichnen AWT, Swing, JavaFX & SWT 7
F 2D-Grafik Gestricheltes Rechteck AWT, Swing, JavaFX & SWT 1
Z Frame mit Rechteck! AWT, Swing, JavaFX & SWT 16
T Problem beim Zeichnen von Rechteck AWT, Swing, JavaFX & SWT 3
S Warum wird dieses Rechteck nicht korrekt gemalt? AWT, Swing, JavaFX & SWT 7
S "Quadrat oder Rechteck" - Check AWT, Swing, JavaFX & SWT 3
C Rechteck drehen AWT, Swing, JavaFX & SWT 1
D 2D-Grafik Rechteck befindet sich unter dem Rahmen des JFrame. AWT, Swing, JavaFX & SWT 1
M JavaFX Rechteck mit MausListener AWT, Swing, JavaFX & SWT 3
B Rechteck Mit Hilfe Von Timeline, KeyFrames animieren AWT, Swing, JavaFX & SWT 3
I Rechteck eines Graphics eines JPanels in einem anderen JPanel anzeigen AWT, Swing, JavaFX & SWT 7
T transparent geht nicht (btw: rechteck) AWT, Swing, JavaFX & SWT 13
J SWT Rechteck Füllfarbe wird bei Action falsch gefüll AWT, Swing, JavaFX & SWT 2
H Rechteck via Mouse bewegen AWT, Swing, JavaFX & SWT 2
A Rechteck zeichen AWT, Swing, JavaFX & SWT 4
C Auto fahren - Rechteck JFrame AWT, Swing, JavaFX & SWT 6
E Swing Rechteck und Kreise verschieben AWT, Swing, JavaFX & SWT 3
M Rechteck "umdrehen"/über die Kante drehen AWT, Swing, JavaFX & SWT 4
J 2D-Grafik Rechteck mit dickerem Rand zeichnen AWT, Swing, JavaFX & SWT 8
H Rechteck grafisch ausgeben (2D) AWT, Swing, JavaFX & SWT 3
G Rechteck mit Farbverlauf AWT, Swing, JavaFX & SWT 5
E Rechteck in JPanel Zeichnen AWT, Swing, JavaFX & SWT 6
G Rechteck zeichnen + "special features" :-) AWT, Swing, JavaFX & SWT 16
A Java Button mal nicht nur als rechteck AWT, Swing, JavaFX & SWT 16
B awt rechteck zeichnen AWT, Swing, JavaFX & SWT 3
R Rechteck drehen! AWT, Swing, JavaFX & SWT 4
K Problem mit JLabel, Rechteck, repaint() ;) AWT, Swing, JavaFX & SWT 2
J Auf Button - Druck soll Rechteck Farbe verändern AWT, Swing, JavaFX & SWT 8
M Rechteck zeichnen AWT, Swing, JavaFX & SWT 4
TheJavaKid Kreis, Rechteck, Linie. verschieben AWT, Swing, JavaFX & SWT 5
S Rechteck per Mouse aufziehen AWT, Swing, JavaFX & SWT 7
A Dreidimensionales Rechteck AWT, Swing, JavaFX & SWT 3
C Schräges Rechteck in Swing? AWT, Swing, JavaFX & SWT 7
G Rechteck normalisieren AWT, Swing, JavaFX & SWT 2
P Rechteck "verkehrt" herum zeichnen AWT, Swing, JavaFX & SWT 2

Ähnliche Java Themen


Oben