WARUM wird paintComponent nicht aufgerufen?

ernst

Top Contributor
Hallo allerseits,
Mit dem Visual-Editor von Netbeans habe ich eine _einfache_ grafische Oberfläche erzeugt.
Dort soll sich von links nach rechts ein Ball bewegen.
Meine Frage:
Warum wird die Methode paintComponent nicht aufgerufen?
Was muß ich machen, damit diese aufgerufen wird?
Wer kann mir helfen? ich komme hier nicht weiter !

mfg
Ernst


Java:
package packT1;

public class MyJFrame extends javax.swing.JFrame {

    public MyJFrame() {
        initComponents();
    }

    @SuppressWarnings("unchecked")
    // <editor-fold defaultstate="collapsed" desc="Generated Code">
    private void initComponents() {

        jPanel1 = new javax.swing.JPanel();

        setDefaultCloseOperation(javax.swing.WindowConstants.EXIT_ON_CLOSE);

        jPanel1.setBackground(new java.awt.Color(255, 255, 102));
        jPanel1.setBorder(javax.swing.BorderFactory.createLineBorder(new java.awt.Color(0, 0, 0)));
        jPanel1.setLayout(new java.awt.BorderLayout());

        javax.swing.GroupLayout layout = new javax.swing.GroupLayout(getContentPane());
        getContentPane().setLayout(layout);
        layout.setHorizontalGroup(
            layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
            .addGroup(layout.createSequentialGroup()
                .addGap(43, 43, 43)
                .addComponent(jPanel1, javax.swing.GroupLayout.PREFERRED_SIZE, 308, javax.swing.GroupLayout.PREFERRED_SIZE)
                .addContainerGap(49, Short.MAX_VALUE))
        );
        layout.setVerticalGroup(
            layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
            .addGroup(layout.createSequentialGroup()
                .addGap(22, 22, 22)
                .addComponent(jPanel1, javax.swing.GroupLayout.PREFERRED_SIZE, 207, javax.swing.GroupLayout.PREFERRED_SIZE)
                .addContainerGap(71, Short.MAX_VALUE))
        );

        pack();
    }// </editor-fold>

    public static void main(String args[]) {
        java.awt.EventQueue.invokeLater(new Runnable() {
            public void run() {
//                new MyJFrame().setVisible(true);
            MyJFrame myJFrame = new MyJFrame();
            myJFrame.setSize(700, 700);
            MyJPanel myJPAnel  = new MyJPanel();
            myJFrame.getContentPane().add(myJPAnel);
            myJFrame.setVisible(true); 
            }
        });
    }

    // Variables declaration - do not modify
    private javax.swing.JPanel jPanel1;
    // End of variables declaration

}


Java:
package packT1;

import java.awt.Color;
import java.awt.Graphics;
import java.awt.Point;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import javax.swing.Timer;

public class MyJPanel extends javax.swing.JPanel {
    private Timer t;
    private Ball  ball;

    public MyJPanel() {
        initComponents();
        ball = new Ball(this);
        t = new Timer(20,
                new ActionListener() {

                    public void actionPerformed(ActionEvent ae) {
                        System.out.println("Hallo1");
                        myupdate();
                        repaint();
                    }
                });

        t.start();
    }

    public void setTimer(int millis) {
        t.setDelay(millis);
    }


    public int getTimerTime() {
        return t.getDelay();
    }

    public void myupdate() {
        ball.berechnePos();
    }

// ??????????????????????????????????????????????????????????????
// ????  Warum wird dieses paintComponent nicht aufgerufen  ?????
// ??????????????????????????????????????????????????????????????

    public void paintComponent(Graphics g) {
        System.out.println("Wo befindet sich Hallo2");
/*
        super.paintComponent(g);
        Point pos;
        pos = ball.getPos();
        g.drawImage(ball.getImage(), pos.x, pos.y, this);
        System.out.println("Wo befindet sich Hallo2");
*/
    }

    /** This method is called from within the constructor to
     * initialize the form.
     * WARNING: Do NOT modify this code. The content of this method is
     * always regenerated by the Form Editor.
     */
    @SuppressWarnings("unchecked")
    // <editor-fold defaultstate="collapsed" desc="Generated Code">
    private void initComponents() {

        setBorder(javax.swing.BorderFactory.createLineBorder(new java.awt.Color(0, 0, 0)));
        setLayout(new java.awt.BorderLayout());
    }// </editor-fold>


    // Variables declaration - do not modify
    // End of variables declaration

}



Java:
package packT1;

import java.awt.Point;
import java.awt.image.BufferedImage;
import java.io.File;
import java.io.IOException;
import javax.imageio.ImageIO;

public class Ball {
    // x-Koordinate der Kugel
    private int x;
    // y-Koordinate der Kugel
    private int y;
    // Das Bild der Kugel befindet sich als Datei auf Festplatte
    private BufferedImage bild;
    private MyJPanel myJPanel;

    public Ball(MyJPanel pspielJPanel){
        try {
            myJPanel = pspielJPanel;
            bild = ImageIO.read(new File("meinebilder/ball.png"));
        } catch (IOException ex) {
            System.out.println("Datei existiert nicht:" +ex.toString());
            ex.printStackTrace();
            System.exit(0);
        }
    }


    public BufferedImage getImage() {
        return bild;
    }

    public void berechnePos() {
        if( x < myJPanel.getWidth()){
           x+=3;
        }
        else{
           x=0;
        }
        System.out.println("myJPanel.getWidth()="+myJPanel.getWidth());

    }

    public Point getPos() {
       return new Point(x, y);
    }

}
 

icarus2

Top Contributor
Damit eine Komponente seinen Inhalt neu zeichnet musst du die Methode repaint() aufrufen.

In deinem Fall myJPanel.repaint()
 
S

SlaterB

Gast
Ausgabe erscheint bei mir mit untenstehenden Programm, durch den Timer sehr oft,
habe deins vereinfacht, mit manchem von deinem Code (wie initComponents() in MyPanel)
gehts auch, aber lohnt nicht da weiter zu schauen,

kannst deins nach und nach alles einbauen

Java:
public class Test {

	public static void main(String[] args) throws Exception {
		EventQueue.invokeLater(new Runnable() {
			public void run() {
				MyJFrame myJFrame = new MyJFrame();
				myJFrame.setSize(700, 700);
				MyJPanel myJPAnel = new MyJPanel();
				myJFrame.getContentPane().add(myJPAnel);
				myJFrame.setVisible(true);
			}
		});

	}
}

class MyJFrame extends JFrame {

}

class MyJPanel extends JPanel {
	private Timer t;

	public MyJPanel() {
		t = new Timer(20, new ActionListener() {

			public void actionPerformed(ActionEvent ae) {
				System.out.println("Hallo1");
				repaint();
			}
		});

		t.start();
	}

	public void paintComponent(Graphics g) {
		System.out.println("Wo befindet sich Hallo2");
	}

}
 

ernst

Top Contributor
Damit eine Komponente seinen Inhalt neu zeichnet musst du die Methode repaint() aufrufen.

In deinem Fall myJPanel.repaint()

Wenn ich ab Zeile 21 (siehe Quellcode MyJPanel) in:
public void actionPerformed(ActionEvent ae) {
System.out.println("Hallo1");
myupdate();
repaint();
}

statt
repaint()
schreibe:
myJPAnel.repaint()
bekomme ich eine Fehlermeldung (Variable myJPAnel ist unbekannt)
Außerdem:
Warum reicht nicht - wie bei meinem Quellcode - einfach nur repaint() ???

mfg
Ernst
 
S

SlaterB

Gast
ok, ich habe es mir mit obigen Code zu leicht gemacht,
es liegt anscheinend doch an initComponents() von MyJFrame, dort wird GroupLayout gesetzt,
deswegen funktioniert anscheinend das einfache add() des MyPanel nicht, dieses ist nicht in der GUI,
ein repaint bzw dann das zugehörige paint wird nicht ausgeführt
 

ernst

Top Contributor
Ausgabe erscheint bei mir mit untenstehenden Programm, durch den Timer sehr oft,
habe deins vereinfacht, mit manchem von deinem Code (wie initComponents() in MyPanel)
gehts auch, aber lohnt nicht da weiter zu schauen,

kannst deins nach und nach alles einbauen
-------------------------------------
Danke für den Test.
Aber was ist bei mir falsch?
Wo ist mein Denkfehler?

mfg
Ernst
 
Zuletzt bearbeitet von einem Moderator:

ernst

Top Contributor
ok, ich habe es mir mit obigen Code zu leicht gemacht,
es liegt anscheinend doch an initComponents() von MyJFrame, dort wird GroupLayout gesetzt,
deswegen funktioniert anscheinend das einfache add() des MyPanel nicht, dieses ist nicht in der GUI,
ein repaint bzw dann das zugehörige paint wird nicht ausgeführt
Was muß ich machen, damit mein repaint ausgeführt wird?

mfg
Ernst
 

ernst

Top Contributor
wenn du so fragst: denken
z.B. auf Visual irgendwas verzichten und Programmieren lernen,
Lesson: Laying Out Components Within a Container (The Java™ Tutorials > Creating a GUI With JFC/Swing)

1) Danke für das Herausfinden des Fehlers.
Mit
public class MyJFrame extends javax.swing.JFrame {
public MyJFrame() {
//initComponents();
}
...
}

funktioniert es wieder. Allerdings kann ich dann nicht mehr die Vorzüge des Visual-Editors von Netbeans nutzen.

2)
Ich will allerdings nicht mehr die Vorzüge des Visual-Editors von Netbeans missen.
Früher hatte ich meine Programm alle von Hand gemacht. Das ist sehr mühselig.
Dein Link weist auf eine Menge Test hin.
Deswegen:
Bevor ich das ganze Zeug durchlese frage ich dich, ob du weißt, was ich an initComponents()
ändern muss, dass alles wieder funktioniert?

mfg
Ernst
 
S

SlaterB

Gast
leider weiß ich da nicht weiter,

so komplizierten Code wie

layout.setVerticalGroup(
layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
.addGroup(layout.createSequentialGroup()
.addGap(22, 22, 22)
.addComponent(jPanel1, javax.swing.GroupLayout.PREFERRED_SIZE, 207, javax.swing.GroupLayout.PREFERRED_SIZE)
.addContainerGap(71, Short.MAX_VALUE))
);

kann nur ein Programm automatisch erstellen, jede manuelle Modifikation wäre zum Scheitern verurteilt,
designe deine GUI komplett mit was auch immer und tausche dann evtl. panel342786 durch ein eigenes aus, so dass es an einer korrekt initalisierten Stelle der GUI sitzt
 

ernst

Top Contributor
leider weiß ich da nicht weiter,

so komplizierten Code wie

layout.setVerticalGroup(
layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
.addGroup(layout.createSequentialGroup()
.addGap(22, 22, 22)
.addComponent(jPanel1, javax.swing.GroupLayout.PREFERRED_SIZE, 207, javax.swing.GroupLayout.PREFERRED_SIZE)
.addContainerGap(71, Short.MAX_VALUE))
);

kann nur ein Programm automatisch erstellen, jede manuelle Modifikation wäre zum Scheitern verurteilt,
designe deine GUI komplett mit was auch immer und tausche dann evtl. panel342786 durch ein eigenes aus, so dass es an einer korrekt initalisierten Stelle der GUI sitzt

---------
1)
Danke für deine Einschätzung.

2)
Ich habe es mal anders probiert:
Mit Visual-Editor (VE) einen Panel in das JFrame reinziehen (so wie bisher auch).
Dann bekommt dieser Panel automatisch den Namen jPanel1.
Jetzt selbst ein JPanel Form erstellen, Namen vergeben wie z.B: zeichnungJPanel.
und dann im Konstruktor des JFrame anmelden mit:
jPanel1.add(zeichnungJPanel, "Center");
Dann klappt alles.
Ich hatte mich bisher immer gewundert, warum man ein Panel (zeichnungJPanel) in einem Panel (jPanel1)braucht.
Dank deiner Hilfe weiß ich es jetzt.
Wenn ich es kürzer mach (so wie in meinem Versuch), funktioniert es mit dem VE nicht mehr.

mfg
Ernst
 
Ähnliche Java Themen
  Titel Forum Antworten Datum
D PaintComponent wird nicht aufgerufen AWT, Swing, JavaFX & SWT 3
S Image wird nicht (immer) in paintComponent gezeichnet? AWT, Swing, JavaFX & SWT 6
kodela Swing paintComponent() wird nicht aufgerufen AWT, Swing, JavaFX & SWT 19
C Bei Skalierung wird paintComponent() nicht aufgerufen,warum? AWT, Swing, JavaFX & SWT 4
G paintComponent wird nicht dargestellt AWT, Swing, JavaFX & SWT 5
R paintComponent wird anscheinend nicht aufgerufen AWT, Swing, JavaFX & SWT 2
A paintComponent() wird nicht aufgerufen! AWT, Swing, JavaFX & SWT 8
P paintComponent-Methode wird dauernd neu aufgerufen AWT, Swing, JavaFX & SWT 2
B AWT paintComponent wird nur 2 mal ausgeführt?! AWT, Swing, JavaFX & SWT 5
propra Wieso wird paintComponent() beim Start 2 malausgeführt? AWT, Swing, JavaFX & SWT 4
M wann wird paintComponent() aufgerufen AWT, Swing, JavaFX & SWT 4
P Methode wird nicht überprüft AWT, Swing, JavaFX & SWT 4
G JavaFX LineChart Datenpunkte Markierung wird abgeschnitten AWT, Swing, JavaFX & SWT 1
P JTextField wird nur sehr klein angezeigt und verändert die Größe nicht AWT, Swing, JavaFX & SWT 3
Telisti Javafx Image wird nicht richtig integiert AWT, Swing, JavaFX & SWT 8
J Netbeans die JavaFX-Anwendung wird nicht ausgeführt AWT, Swing, JavaFX & SWT 16
N €-Zeichen wird nicht akzeptiert AWT, Swing, JavaFX & SWT 4
G Problem mit der Anzeige von jLabel. Unlesbar wenn der Text geändert wird. AWT, Swing, JavaFX & SWT 28
berserkerdq2 Wie füge ich ein Bild in javafx mit dem Scenebuilder ein, das automatisch mitgezogen wird, wenn das Fenster vergrößert wird oder Vollbildmodus AWT, Swing, JavaFX & SWT 6
L jComboBox Actionlistener wird beim erstmaligen Befüllen getriggert AWT, Swing, JavaFX & SWT 7
_user_q Objekt.setSelected(false), wenn es nicht mehr fokussiert wird AWT, Swing, JavaFX & SWT 2
S Javafx getResource-Pfad wird nicht erkannt AWT, Swing, JavaFX & SWT 7
U Warum wird zweimal die Affinetransformation estellt (2Dgraphics, Java)? AWT, Swing, JavaFX & SWT 31
DonBronson Gezeichnetes Objekt verschwindet nachdem erneut gezeichnet wird AWT, Swing, JavaFX & SWT 8
ProggersWorld JavaFX TextArea BackgroundImage wird nicht angezeigt AWT, Swing, JavaFX & SWT 3
M Bild wird nicht geladen obwohl sie gefunden wird AWT, Swing, JavaFX & SWT 0
M Nach Export als Runnable Jar wird css nicht merh gefunden AWT, Swing, JavaFX & SWT 22
izoards Outlook Mail erstellen - Signatur wird nicht angezeigt. AWT, Swing, JavaFX & SWT 3
J actionperformed wird nicht aufgerufen/ repaint() AWT, Swing, JavaFX & SWT 6
J Swing Komponente wird unpassend angepasst in der Größe AWT, Swing, JavaFX & SWT 35
J Java FX NullPointerException, ObservableList wird in View nicht angezeigt.. AWT, Swing, JavaFX & SWT 34
S Next_Button wird nicht ausgeführt. AWT, Swing, JavaFX & SWT 6
FrittenFritze Ein Problem mit der CSSBox, die Größe wird nicht angepasst AWT, Swing, JavaFX & SWT 5
CptK windowClosed() nur aufrufen, wenn Fenster nicht über Button geschlossen wird AWT, Swing, JavaFX & SWT 1
J Komponente wird manchmal falsch gezeichnet AWT, Swing, JavaFX & SWT 0
J Swing JList wird nicht angezeigt AWT, Swing, JavaFX & SWT 6
JMölleri Swing Image wird unscharf dargestellt AWT, Swing, JavaFX & SWT 2
JojoSand Java Programm wird nicht gestartet - keinen Fehlerhinweis AWT, Swing, JavaFX & SWT 9
R Text vom Jlabel wird nicht angezeigt AWT, Swing, JavaFX & SWT 2
D JavaFX Bearbeitetes Bild wird nicht gespeichert AWT, Swing, JavaFX & SWT 9
J setOnCloseRequest wird nicht ausgelöst AWT, Swing, JavaFX & SWT 3
P JavaFX Fenster wird nicht angezeigt (Mac) AWT, Swing, JavaFX & SWT 13
B JavaFX Bei Scenen-Wechsel im primaryStage wird aktuelle Fenstergröße nicht mit übernommen AWT, Swing, JavaFX & SWT 16
B JavaFX Warum wird hier eine NullPointer-Exception geworfen? AWT, Swing, JavaFX & SWT 7
M JavaFX javaFX Label-Text wird nicht gesetzt AWT, Swing, JavaFX & SWT 3
O Swing "Eigenes" JPanel wird dem JScrollPane nicht hinzugefügt AWT, Swing, JavaFX & SWT 5
L Swing JLabel wird beim ändern der Schriftart immer neu gezeichnet. AWT, Swing, JavaFX & SWT 2
R Layout Manager null und Component wird nicht hinzugefügt AWT, Swing, JavaFX & SWT 3
Zrebna JavaFX-Projekt mit Bildern funktioniert nicht - um Hilfe wird gebeten AWT, Swing, JavaFX & SWT 14
kodela BufferStrategy wird nicht gefunden AWT, Swing, JavaFX & SWT 5
J JPanel wird nicht angezeigt AWT, Swing, JavaFX & SWT 2
S ImageView wird dem Gridpane nicht zugefügt AWT, Swing, JavaFX & SWT 1
G Repaint wird nicht durchgeführt AWT, Swing, JavaFX & SWT 8
E Warum wird Text im JTextArea erst am Programmende angezeigt ? AWT, Swing, JavaFX & SWT 1
S Swing Panel wird nicht neu gezeichnet AWT, Swing, JavaFX & SWT 3
M Swing GUI wird nach invokeLater() langsam AWT, Swing, JavaFX & SWT 19
Bluedaishi TableView mit Combox wert wird nicht in die TableView gesetzt AWT, Swing, JavaFX & SWT 38
L JFrame wird zu klein erstellt AWT, Swing, JavaFX & SWT 7
T JavaFX Nach Zoomen wird an falscher Stelle gezeichnet AWT, Swing, JavaFX & SWT 0
kodela Swing Letzte Änderung in der Tabelle wird nicht gespeichert AWT, Swing, JavaFX & SWT 5
cool_brivk24 AWT BufferedImage wird nicht geladen AWT, Swing, JavaFX & SWT 17
S JavaFX Wird es überhaupt genutzt? AWT, Swing, JavaFX & SWT 3
FRI3ND GUI wird nicht angezeigt AWT, Swing, JavaFX & SWT 2
J Canvas wird nicht angezeigt AWT, Swing, JavaFX & SWT 10
K Swing JScrollPane wird nicht angezeigt wenn man Components darstellt. AWT, Swing, JavaFX & SWT 2
ralfb1105 Swing Wert in JTextField wird falsch ausgegeben AWT, Swing, JavaFX & SWT 2
B JavaFX Text wird nicht angezeigt, kein Fehler AWT, Swing, JavaFX & SWT 2
J Aus welchen Grund wird der Button nicht angezeigt im GridPane? AWT, Swing, JavaFX & SWT 1
J MouseListener wird nicht ausgeführt. AWT, Swing, JavaFX & SWT 4
E Swing Liste in Scrollpane wird nicht angezeigt AWT, Swing, JavaFX & SWT 2
J Controller wird zu groß, was tun ? AWT, Swing, JavaFX & SWT 5
CptK Wieso wird nur ein Teil meiner Buttons angezeigt? AWT, Swing, JavaFX & SWT 1
T Label wird nicht angezeigt AWT, Swing, JavaFX & SWT 4
M Aktion ausführen wenn ein JRadiobutton deselektiert wird. AWT, Swing, JavaFX & SWT 3
DaCrazyJavaExpert Swing JPanel "ContentPane" wird nicht gesetzt/angezeigt AWT, Swing, JavaFX & SWT 16
I JavaFX Fenster wird auf einem anderen Rechner anders dargestellt AWT, Swing, JavaFX & SWT 5
zhermann FX Label text wird nicht richtig angezeigt AWT, Swing, JavaFX & SWT 12
zhermann TableView wird nicht gefüllt AWT, Swing, JavaFX & SWT 14
it_is_all Warum wird die JTable im JDialog nicht angezeigt? AWT, Swing, JavaFX & SWT 1
zhermann JavaFX Main App wird nicht geöffnet AWT, Swing, JavaFX & SWT 6
Naxon89 JavaFX Image wird nicht korrekt geladen AWT, Swing, JavaFX & SWT 3
4 Swing JLabel wird ,,abgehackt" AWT, Swing, JavaFX & SWT 3
DaCrazyJavaExpert Swing Größe des JPanel ändern/wird nicht geändert. AWT, Swing, JavaFX & SWT 3
DaCrazyJavaExpert Swing JPanel wird in JScollPane nicht angezeigt AWT, Swing, JavaFX & SWT 2
D JFrame wird nicht richtig angezeigt AWT, Swing, JavaFX & SWT 1
P Kein Bild wird angezeigt bei ImageIcon AWT, Swing, JavaFX & SWT 16
MaxG. JavaFX Inhalt in Tableview wird nicht angezeigt AWT, Swing, JavaFX & SWT 11
T JButton wird beim vergrößern des Fensters erst sichtbar AWT, Swing, JavaFX & SWT 4
A Swing Tabelle wird bei Betätigung des Button nicht befüllt AWT, Swing, JavaFX & SWT 17
krgewb 2D-Grafik paint-Methode wird zu oft ausgeführt AWT, Swing, JavaFX & SWT 5
G Nur ein JPanel wird angezeigt AWT, Swing, JavaFX & SWT 9
M Swing Inhalt meines JTables wird falsch dargestellt AWT, Swing, JavaFX & SWT 8
T Default Table wird nicht angezeigt AWT, Swing, JavaFX & SWT 15
H Musik wird nach dem erstellen der .jar Datei nicht mehr abgespielt AWT, Swing, JavaFX & SWT 1
K JavaFX Stage wird nicht angezeigt AWT, Swing, JavaFX & SWT 9
B JTable wird nicht angezeigt AWT, Swing, JavaFX & SWT 1
A Swing Bild wird nicht mehr geladen AWT, Swing, JavaFX & SWT 4
U Swing Inhalt vom Fenster wird erst durch Hovern oder Klicken sichtbar AWT, Swing, JavaFX & SWT 3
D iText PDF wird nach Neustart nicht importiert AWT, Swing, JavaFX & SWT 0
Thallius Wer oder was bestimmt welches Frame toFront kommt wenn ein anderes geschlossen wird? AWT, Swing, JavaFX & SWT 8

Ähnliche Java Themen

Neue Themen


Oben