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();

    }
 
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
 
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:
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;
            }
        }
    }
}
 
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;
            }
        }
    }
}
 
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:
 
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?
 
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.
 

Neue Themen


Zurück
Oben