repaint reagiert nicht

flosparrow

Mitglied
die folgende classe reagiert nicht auf einen externen repaint befeht bzw. paintComponent wird nicht erneut aufgerufen.

Java:
class Zeichenblatt extends JComponent {

    private int x;
    private int y;
    private Color[][] farbe = new Color[10][10];
    Graphics2D g2d;

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

        g2d = (Graphics2D) g;

        
        this.zeichnesenkrecht();
        this.zeichnewaagrecht();
        this.zeichnekreise();

    }
 

flosparrow

Mitglied
Java:
class Benutzeroberfläche 
{
    
    private Zeichenblatt zeichenblatt;
    
    JFrame frame = new JFrame("F");
    
    public Benutzeroberfläche() {
        
        zeichenblatt = new Zeichenblatt(breite, hoehe);
        
        frame.setLayout(new BorderLayout());
       
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        
        zeichenblatt.setPreferredSize(new Dimension(300,300));
         
        frame.add(zeichenblatt,BorderLayout.CENTER);
        
        frame.add(createControls(),BorderLayout.SOUTH);
        
        frame.pack();
        
        frame.setVisible(true);
        frame.setLocationRelativeTo(null);
        
 
    }
    
    private Component createControls() {
        
        JPanel panel = new JPanel(new FlowLayout());
        
        JButton start = new JButton("Start");
        panel.add(start);
        start.addActionListener(new ActionListener() {});
        
        return panel;
    }

    public void male(){
	zeichenblatt.add();
        zeichenblatt.repaint();
    }
}




import java.awt.*;
import javax.swing.*;
import java.awt.Color;
import java.awt.Graphics;
import java.awt.Graphics2D;
import javax.swing.JComponent;

class Zeichenblatt extends JComponent {

    Graphics2D g2d;
    int x = 0;

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

        g2d = (Graphics2D) g;
	if(x ==1){
	    g2d.fillOval(30,30, 20, 20);
	}        

    }

    public void add(){
	x=1;
    }
}

es funktioniert nicht
 

hdi

Top Contributor
Du solltest ein KSKB posten. Jetzt rate mal, wofür das zweite K steht ;) ...der Code Kompiliert gar nicht, da du die actionPerformed()-Methode im ActionListener gar nicht implementierst (Zeile 36).

Abgesehen davon steckt deine Zeichenanweisung in einem
Code:
if(x==1)
. Aber x wird anfangs mit 0 initialisiert, und das bleibt es auch, da du die Methode add(), bzw. male() niemals aufrufst. Ich nehme an der Aufruf von male() sollte in den ActionListener für den Button? Aber wie gesagt, schau erstmal dass das kompiliert.
 
Zuletzt bearbeitet:

flosparrow

Mitglied
das obere beispiel sollte das prinzip verdeutlichen.

Im Anschluß der "komplete" quellcode. Natürlich bin ich mir auch da bewusst, das zum beispiel die methode
Code:
einfärben
noch nirgends aufgerufen wird. Trotzdem ist das die eigentliche Problemmethode. Das darin enthaltene repaint ruft nicht die methode paintComponent im Zeichenblatt auf.

Java:
import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.Component;
import java.awt.Dimension;
import java.awt.FlowLayout;

import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
 
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JPanel;
 
 
public class Benutzeroberfläche 
{
    
    private Zeichenblatt zeichenblatt;
    
    JFrame frame = new JFrame("Finde das Ziel");
    

    public Benutzeroberfläche(int breite, int hoehe, int sx, int sy, int zx, int zy) {
        
        zeichenblatt = new Zeichenblatt(breite, hoehe);
        
        //einen JFrame erzeugen
        
        
        frame.setLayout(new BorderLayout());
        
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        
        zeichenblatt.setPreferredSize(new Dimension(300,300));
        
        frame.add(zeichenblatt,BorderLayout.CENTER);
        
        frame.add(createControls(),BorderLayout.SOUTH);
        
        frame.pack();
        
        frame.setVisible(true);
        frame.setLocationRelativeTo(null);
        
        this.startzielknoten(sx, sy, zx, zy);
    }
    


    private Component createControls() {
        
        JPanel panel = new JPanel(new FlowLayout());
        
       
        JButton start = new JButton("Start");
        panel.add(start);
        start.addActionListener(new ActionListener() {
        
            @Override
            public void actionPerformed(ActionEvent e) {
                
            }
        
        });
        
        return panel;
    }
    
    public void startzielknoten(int sx, int sy, int zx, int zy){
        zeichenblatt.seteinfärben(sx, sy, Color.RED);
        zeichenblatt.seteinfärben(zx, zy, Color.RED);
        zeichenblatt.repaint();
        
    }
    
    public void einfärben(int x, int y, Color farbe){
        
        zeichenblatt.seteinfärben(x, y, farbe);
        zeichenblatt.repaint();
        
    }
    
}

Java:
package Oberfläche_Finde_das_Ziel;

import java.awt.*;
import javax.swing.*;
import java.awt.Color;
import java.awt.Graphics;
import java.awt.Graphics2D;
import javax.swing.JComponent;

class Zeichenblatt extends JComponent {

    private int x;
    private int y;
    private Color[][] farbe = new Color[10][10];
    Graphics2D g2d;

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

        g2d = (Graphics2D) g;

        
        this.zeichnesenkrecht();
        this.zeichnewaagrecht();
        this.zeichnekreise();

    }

    public void zeichnekreise() {


        for (int i = 0; i < x; i++) {
            for (int k = 0; k < y; k++) {
                g2d.setColor(farbe[i][k]);
                g2d.fillOval((i * 30), (k * 30), 20, 20);
            }
        }

    }

    public void zeichnesenkrecht() {
        g2d.setColor(Color.GRAY);

        for (int i = 0; i < x-1; i++) {
            for (int k = 0; k < y; k++) {//nur für die letzten nicht
                g2d.drawLine((i * 30) + 15, (k * 30) + 10, ((i + 1) * 30) + 15, (k * 30) + 10);
            }
        }

    }

    public void zeichnewaagrecht() {
        g2d.setColor(Color.GRAY);

        for (int i = 0; i < x; i++) {//nur für die letzten nicht
            for (int k = 0; k < y-1; k++) {
                g2d.drawLine((i * 30) + 10, (k * 30) + 15, ((i) * 30) + 10, ((k + 1) * 30) + 15);
            }
        }

    }

    public void seteinfärben(int i, int k, Color farbe) {
        this.farbe[i][k] = farbe;
    }

    public Zeichenblatt(int x, int y) {
        this.x = x;
        this.y = y;
        
        for (int i = 0; i < x; i++) {
            for (int k = 0; k < y; k++) {
                this.farbe[i][k] = Color.LIGHT_GRAY;
            }
        }
    }
}
 
S

SlaterB

Gast
wie bitte?!
du sagst also, dass deiner Ansicht nach ein repaint() von einfärben() aus nicht funktioniert,
postest aber bewußt 'zum Beweis' oder auch nur 'zur Info' ein Programm in dem einfärben() nie aufgerufen wird??

was soll man denn damit anfangen, das ist ja wirklich ungeheuerlich,
ich glaube auch mit 25.000 Postings erlebe ich hier wieder was neues ;)

wenn man den Code noch um korrekte einfärben()-Aufrufe ergänzt, dann funktioniert das selbstverständlich, siehe Testprogram weiter unten,
du rufst einfärben() vielleicht auf andere Weise auf, das kann natürlich schiefgehen, ohne das zu posten bleibt der Fehler aber verborgen

einmal raten ist erlaubt: du hast auch einen längeren Ablauf so wie meine 10 sec-Schleife, nur bei dir nicht in einem separaten Thread,
sondern von einem Listener aus gestartet -> GUI blockiert, es passiert gar nichts mehr

Java:
public class Test
{
    public static void main(String[] args)
        throws Exception
    {
        Benutzeroberfläche b = new Benutzeroberfläche(10, 10, 2, 2, 7, 7);

        for (int i = 0; i < 10; i++)
        {
            b.einfärben(i, 3, Color.BLUE);
            Thread.sleep(1000);
        }
    }
}


class Benutzeroberfläche
{

    private Zeichenblatt zeichenblatt;

    JFrame frame = new JFrame("Finde das Ziel");


    public Benutzeroberfläche(int breite, int hoehe, int sx, int sy, int zx, int zy)
    {

        zeichenblatt = new Zeichenblatt(breite, hoehe);

        // einen JFrame erzeugen


        frame.setLayout(new BorderLayout());

        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

        zeichenblatt.setPreferredSize(new Dimension(300, 300));

        frame.add(zeichenblatt, BorderLayout.CENTER);

        frame.add(createControls(), BorderLayout.SOUTH);

        frame.pack();

        frame.setVisible(true);
        frame.setLocationRelativeTo(null);

        this.startzielknoten(sx, sy, zx, zy);
    }


    private Component createControls()
    {

        JPanel panel = new JPanel(new FlowLayout());


        JButton start = new JButton("Start");
        panel.add(start);
        start.addActionListener(new ActionListener()
            {

                public void actionPerformed(ActionEvent e)
                {

                }

            });

        return panel;
    }

    public void startzielknoten(int sx, int sy, int zx, int zy)
    {
        zeichenblatt.seteinfärben(sx, sy, Color.RED);
        zeichenblatt.seteinfärben(zx, zy, Color.RED);
        zeichenblatt.repaint();

    }

    public void einfärben(int x, int y, Color farbe)
    {

        zeichenblatt.seteinfärben(x, y, farbe);
        zeichenblatt.repaint();

    }

}


class Zeichenblatt
    extends JComponent
{

    private int x;
    private int y;
    private Color[][] farbe = new Color[10][10];
    Graphics2D g2d;

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

        g2d = (Graphics2D)g;


        this.zeichnesenkrecht();
        this.zeichnewaagrecht();
        this.zeichnekreise();

    }

    public void zeichnekreise()
    {


        for (int i = 0; i < x; i++)
        {
            for (int k = 0; k < y; k++)
            {
                g2d.setColor(farbe[i][k]);
                g2d.fillOval((i * 30), (k * 30), 20, 20);
            }
        }

    }

    public void zeichnesenkrecht()
    {
        g2d.setColor(Color.GRAY);

        for (int i = 0; i < x - 1; i++)
        {
            for (int k = 0; k < y; k++)
            {// nur für die letzten nicht
                g2d.drawLine((i * 30) + 15, (k * 30) + 10, ((i + 1) * 30) + 15, (k * 30) + 10);
            }
        }

    }

    public void zeichnewaagrecht()
    {
        g2d.setColor(Color.GRAY);

        for (int i = 0; i < x; i++)
        {// nur für die letzten nicht
            for (int k = 0; k < y - 1; k++)
            {
                g2d.drawLine((i * 30) + 10, (k * 30) + 15, ((i) * 30) + 10, ((k + 1) * 30) + 15);
            }
        }

    }

    public void seteinfärben(int i, int k, Color farbe)
    {
        this.farbe[i][k] = farbe;
    }

    public Zeichenblatt(int x, int y)
    {
        this.x = x;
        this.y = y;

        for (int i = 0; i < x; i++)
        {
            for (int k = 0; k < y; k++)
            {
                this.farbe[i][k] = Color.LIGHT_GRAY;
            }
        }
    }
}
 

flosparrow

Mitglied
Java:
public void einfaerben(Knoten zu_bemalen, Color farbe){
        
        int i = 0;
        int k = 0;
        int breite = 10;
        int hoehe = 10;
       
        for (i = 0; i < breite; i++) {
            for (k = 0; k < hoehe; k++) {
                if (zu_bemalen == knoten[i][k]) {
                    beob.einfärben(i, k, farbe);
                    try {
                        Thread.sleep(1000);
                    } catch (InterruptedException e) {
                    }
                    
                   

                }
            }
        }
    }

Hier ist die Methode in einer anderen Klasse wo einfärben aufgerufen wird.
ich hatte sie nur nicht gepostet, weil ich dachte daran könnte es nicht liegen.:bahnhof:
 
S

SlaterB

Gast
dazu fehlt wiederum wer sie aufruft, nur Gesamtprogramme zeigen wirklich alles,
aber ich sollte mit meinem Tipp richtig liegen:
solange der GUI-Thread einen Listener und allen Code darin inklusive spleep() ab'arbeiten' muss,
wird nichts neugezeichnet + auf keine User-Aktionen wie Tastatur + Maus reagiert

jede längerfristige Aktion gehört in einen separaten Thread, ein Standard-Problem,
Thread bekannt? gui-modisch evtl. auch SwingWorker, Beispiele im Internet zu finden?
 

flosparrow

Mitglied
und die Threads arbeitet, er dann nicht nacheinander ab?
die hängen alle zeimlich voneinander ab, also die langfristigen Aktionen, aber ich werde mein glück versuchen.
Danke auf jeden fall. es hatt mir geholfen.
 
Ähnliche Java Themen
  Titel Forum Antworten Datum
D Repaint Funktioniert nicht AWT, Swing, JavaFX & SWT 2
D JUNG Repaint function does not work AWT, Swing, JavaFX & SWT 2
E repaint Probleme AWT, Swing, JavaFX & SWT 13
G listener repaint() - verschiedene Darstellung AWT, Swing, JavaFX & SWT 24
ExceptionOfExpectation Textdarstellung auf einem Canvas mit Hilfe von repaint(); AWT, Swing, JavaFX & SWT 6
J actionperformed wird nicht aufgerufen/ repaint() AWT, Swing, JavaFX & SWT 6
L Swing repaint() ruft paintComponent(g1d) nicht auf AWT, Swing, JavaFX & SWT 12
G Repaint wird nicht durchgeführt AWT, Swing, JavaFX & SWT 8
I Swing Verhindern, dass repaint() kaskadiert AWT, Swing, JavaFX & SWT 6
ms_cikar Update swingUtilities Repaint in der Schleife AWT, Swing, JavaFX & SWT 3
T Swing Probleme mit repaint() bzw. JScrollPane AWT, Swing, JavaFX & SWT 7
N Swing JButtons werden nach repaint() doppelt dargestellt AWT, Swing, JavaFX & SWT 12
K Methode repaint() AWT, Swing, JavaFX & SWT 1
B Swing Wann brauche ich repaint() ? AWT, Swing, JavaFX & SWT 1
javampir Swing repaint in JavaFX Anwendung AWT, Swing, JavaFX & SWT 3
A repaint(); AWT, Swing, JavaFX & SWT 9
J Swing ungewünschter Nebeneffekt bei der repaint() Methode AWT, Swing, JavaFX & SWT 3
A Problem: repaint() - Schleife AWT, Swing, JavaFX & SWT 3
S 2D-Grafik repaint()-Aufruf. Und nichts geschieht. AWT, Swing, JavaFX & SWT 5
Joew0815 JDialog repaint() funktioniert nicht wie gewünscht. AWT, Swing, JavaFX & SWT 2
P JPanel und Repaint AWT, Swing, JavaFX & SWT 5
J JavaFX Automatisches Neuzeichnen ("Repaint") abstellen. AWT, Swing, JavaFX & SWT 10
F JTable Repaint Issue AWT, Swing, JavaFX & SWT 1
N Observer: update ruft nicht repaint auf AWT, Swing, JavaFX & SWT 0
C Repaint() funktioniert nicht in TabbedPanel AWT, Swing, JavaFX & SWT 5
S JList repaint AWT, Swing, JavaFX & SWT 1
L NullpointerException und Probleme mit repaint() AWT, Swing, JavaFX & SWT 11
M Repaint mittels Button richtig aufrufen klappt nicht AWT, Swing, JavaFX & SWT 1
B Repaint auf JFrame, JLabel und ImageIcon AWT, Swing, JavaFX & SWT 4
K 2D-Grafik Paint - Wie binde ich repaint ein? AWT, Swing, JavaFX & SWT 8
D repaint() klappt anders als vorgestellt AWT, Swing, JavaFX & SWT 15
R Repaint() in Schleifen, Threads AWT, Swing, JavaFX & SWT 13
B Swing Repaint Problem - mal wieder AWT, Swing, JavaFX & SWT 5
P 2D-Grafik Gezielter Repaint einzelner Frames in Java-Game AWT, Swing, JavaFX & SWT 6
javampir Bei repaint nix los AWT, Swing, JavaFX & SWT 2
B Swing repaint() AWT, Swing, JavaFX & SWT 3
Ernesto95 AnimationLoop - Problem bei Aufruf von repaint AWT, Swing, JavaFX & SWT 6
P 2D-Grafik repaint(); steigender RAM Verbauch AWT, Swing, JavaFX & SWT 6
Y KeyListener, GUI Thread, repaint AWT, Swing, JavaFX & SWT 7
S Applet Repaint AWT, Swing, JavaFX & SWT 3
M Programm hängt sich auf nachdem repaint() benutzt wurde AWT, Swing, JavaFX & SWT 2
R Swing Grafikfehler bei repaint AWT, Swing, JavaFX & SWT 2
N repaint() blockieren AWT, Swing, JavaFX & SWT 6
K canvas zeig nach repaint nichts an AWT, Swing, JavaFX & SWT 8
M Repaint() AWT, Swing, JavaFX & SWT 14
J Swing repaint, repaint, repaint AWT, Swing, JavaFX & SWT 8
M Applet repaint() verlangsamen AWT, Swing, JavaFX & SWT 7
R paintComponent malt bei repaint() Rahmen um Panel AWT, Swing, JavaFX & SWT 7
P EDT Problem? Kein Aufruf der repaint Methode AWT, Swing, JavaFX & SWT 6
V Applet JApplet Flackern durch Repaint AWT, Swing, JavaFX & SWT 11
kodela Problem mit repaint() AWT, Swing, JavaFX & SWT 3
N Swing Funktion repaint() updated nicht AWT, Swing, JavaFX & SWT 5
S AWT Probleme mit repaint() AWT, Swing, JavaFX & SWT 2
D Repaint()? Oder was??? AWT, Swing, JavaFX & SWT 5
M Eine nicht korrekte Darstellung bei repaint() warum? AWT, Swing, JavaFX & SWT 4
T 2D-Grafik Kreis "von Hand" zeichnen -> jedesmal repaint()? AWT, Swing, JavaFX & SWT 6
R validate(), repaint funktionieren nicht! AWT, Swing, JavaFX & SWT 7
B AWT Canvas überdeckt nach repaint() JComboBox-Optionen AWT, Swing, JavaFX & SWT 2
B Swing verschachteltes GUI: repaint() ändert mehr als nur gewünschte Component AWT, Swing, JavaFX & SWT 4
S validate(), invalidate(), repaint(),... Was kommt wann? AWT, Swing, JavaFX & SWT 5
M 2D-Grafik repaint() löscht altes Bild nicht AWT, Swing, JavaFX & SWT 2
J repaint() nicht richtig? AWT, Swing, JavaFX & SWT 6
R repaint erzwingen AWT, Swing, JavaFX & SWT 3
Zettelkasten repaint() von anderen Klassen aufrufen AWT, Swing, JavaFX & SWT 4
H repaint()-Problem - 50% CPU-Auslastung AWT, Swing, JavaFX & SWT 4
P repaint während Thread läuft AWT, Swing, JavaFX & SWT 9
D Repaint Frage, Design Frage AWT, Swing, JavaFX & SWT 2
N Swing MainWindow(JFrame) aktualisieren(neuzeichnen) repaint AWT, Swing, JavaFX & SWT 4
T repaint() Problem AWT, Swing, JavaFX & SWT 2
A 2D-Grafik Repaint - Alternative? AWT, Swing, JavaFX & SWT 3
C JLabel, JTextArea, JScrollPane. repaint(); ? AWT, Swing, JavaFX & SWT 6
N Swing repaint() funktioniert nicht AWT, Swing, JavaFX & SWT 5
T Swing repaint funktioniert nur manchmal? AWT, Swing, JavaFX & SWT 6
K Jpanel repaint problem (Fullscreen) AWT, Swing, JavaFX & SWT 5
V Swing Bei repaint() tut sich nichts AWT, Swing, JavaFX & SWT 7
G ColorReader, bei Fadenkreuz zeichnen mit repaint() flackern AWT, Swing, JavaFX & SWT 19
I Canvas Repaint Probleme AWT, Swing, JavaFX & SWT 2
D Swing Actionlistener verhindert repaint?! AWT, Swing, JavaFX & SWT 2
S JLabel repaint AWT, Swing, JavaFX & SWT 8
C Swing Linux mag mein Swing-repaint() nicht... AWT, Swing, JavaFX & SWT 7
J Swing paintComponent() - repaint() - BufferedImage anzeigen AWT, Swing, JavaFX & SWT 5
Luk10 repaint() auch in anderen Klassen! AWT, Swing, JavaFX & SWT 6
A repaint() zu langsam, bitte um alternativen AWT, Swing, JavaFX & SWT 5
T Überlappende Transparenz und repaint() AWT, Swing, JavaFX & SWT 10
E EINFACHE Verständnisfrage zu repaint(), paintComponent(), usw. AWT, Swing, JavaFX & SWT 16
O Girdbag Formatierung nach repaint verloren AWT, Swing, JavaFX & SWT 2
E Swing - repaint() AWT, Swing, JavaFX & SWT 6
T Image wird nicht angezeigt?! - MediaTracker/repaint AWT, Swing, JavaFX & SWT 9
E AWT Problem mit Repaint (in Loop oder Timer) AWT, Swing, JavaFX & SWT 3
O Exception bei repaint AWT, Swing, JavaFX & SWT 3
D Fragen zu Swing, paintComponent() und repaint AWT, Swing, JavaFX & SWT 6
Dit_ Zeilenmarkierung verschwindet nach repaint() AWT, Swing, JavaFX & SWT 12
A Swing Infinite repaint loop unterbrechen AWT, Swing, JavaFX & SWT 7
hdi Swing EDT macht kein repaint() AWT, Swing, JavaFX & SWT 2
F "Verrutschen" von Komponenten bei repaint() AWT, Swing, JavaFX & SWT 9
Junker Fensterinhalt vor ausführen von repaint komplett löschen. AWT, Swing, JavaFX & SWT 2
T Fenster wird trotz repaint() und revalidate() nicht sofort neu gezeichnet AWT, Swing, JavaFX & SWT 6
E Graphics2D: altes Objekt löschen, wenn repaint aufgerufen wird AWT, Swing, JavaFX & SWT 7
J Swing Verständnis-Problem repaint(int x,int y,int width,int height) AWT, Swing, JavaFX & SWT 3
C Frame repaint hat keine Wirkung AWT, Swing, JavaFX & SWT 6

Ähnliche Java Themen

Neue Themen


Oben