Verständnisfragen im Umgang mit update() und JFrames

achim721

Mitglied
Hallo zusammen. Ich habe zwei Fragen. Zunächst die Verständnisfrage:
In nachfolgendem Programm erstelle ich zwei JFrames, einer ist als Auswahlmenü gedacht, der andere als Zeichentafel.
Verwende ich im MouseListener der Klasse Tafel bzw. des darauf liegenden JPanels, update(), funktioniert alles normal. Verwende ich dagegen repaint(), erscheint der Button der Klasse Auswahl zusätzlich im JFrame der Tafel. Spätestens dann wenn ich auf den Button "Pinsel" in der Auswahl klicke und dann wieder auf der Tafel male.
Ich verstehe nicht warum. Repaint() ruft doch auch nur update auf. Kann mir jemand erläutern was genau da abläuft?

Die andere Frage wäre: Ist es überhaupt eine gute Vorgehensweise mit zwei JFrames zu arbeiten? Oder ist davon prinzipiell abzuraten?

Eine JToolbar habe ich übrigens deswegen nicht genommen, weil ich die Toolbar von Anfang an separat haben will. Und nicht erst abkoppeln muss.

Freundliche Grüße,
Achim

Datei Start.java
Java:
package miniMalen1;

import java.awt.Color;
import javax.swing.*;

public class Start extends JFrame {

    public static void main(String[] a) {
        new Start();
    }

    public Start() {
        init();
    }

    private void init() {
        Tafel tafel = new Tafel();
        Auswahl auswahl = new Auswahl();
    }

}


Datei Auswahl.java
Java:
package miniMalen1;

import java.awt.Color;
import java.awt.FlowLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;

import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.JToggleButton;

public class Auswahl extends JFrame implements ActionListener {

    public Auswahl() {
        initialisiereObjekte();
    }

    private void initialisiereObjekte() {
        this.setDefaultCloseOperation(EXIT_ON_CLOSE);
        this.setLocationRelativeTo(null);
        this.setAlwaysOnTop(true);
        this.setLayout(new FlowLayout());
        this.getContentPane().setBackground(Color.WHITE);
        this.setBounds(100, 100, 250, 250);
        this.setTitle("Auswahl");
        this.setBackground(Color.WHITE);

        JPanel p = new JPanel();
        p.setBounds(0, 0, 400, 400);
        p.setBackground(Color.white);
        p.setLayout(new FlowLayout());

        JToggleButton pinselBtn = new JToggleButton("Pinsel");
        pinselBtn.setBounds(0, 0, 100, 30);
        p.add(pinselBtn);

        this.add(p);

        sichtbar();

    }

    private void sichtbar() {
        this.setVisible(true);
    }

    @Override
    public void actionPerformed(ActionEvent arg0) {

    }

}


Datei Tafel.java
Java:
package miniMalen1;

import java.awt.Color;
import java.awt.Graphics;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;

import javax.swing.JFrame;
import javax.swing.JPanel;

public class Tafel extends JFrame {

    private JPanel panel;
    private int x = -10;
    private int y = -10;

    int pinseldicke = 1;

    public Tafel() {
        initialisiereTafel();
    }

    private void initialisiereTafel() {
        this.setDefaultCloseOperation(EXIT_ON_CLOSE);
        this.setBounds(0, 0, 500, 500);
        this.setLocationRelativeTo(null);
        this.setAlwaysOnTop(true);
        this.setBackground(Color.white);
        this.setTitle("Tafel");
        this.setLayout(null);

        sichtbar();

        panel = new JPanel() {

            public void paintComponent(Graphics g) {

                g.fillOval(x, y, 10, 10);

            }

        };

        panel.setBackground(Color.CYAN);

        panel.setBounds(0, 0, 500, 500);
        this.add(panel);

        panel.addMouseMotionListener(new MouseAdapter() {
            public void mouseDragged(MouseEvent arg0) {
                System.out.println("Dragged");
                x = arg0.getX();
                y = arg0.getY();
                Graphics gr = panel.getGraphics();
                panel.update(gr);
                // panel.repaint();
            }
        });
       
        panel.addMouseListener(new MouseAdapter() {
            public void mousePressed(MouseEvent arg0) {
                System.out.println("Test");
                x = arg0.getX();
                y = arg0.getY();
                Graphics gr = panel.getGraphics();
                panel.update(gr);
                // panel.repaint();
            }
        });
       
    }

    private void sichtbar() {
        this.setVisible(true);

    }

}
 

achim721

Mitglied
Stimmt, danke für den Hinweis, auf das extends JFrame in Start kann ich natürlich verzichten.
Problem ist nur, das der Fehler sowohl mit JDialog also auch mit JWindow auftritt.
Wie gesagt, der Fehler tritt nur auf, wenn ich repaint() statt update() verwende..
 

achim721

Mitglied
Unten nochmals der Code etwas übersichtlicher. Auch verwende ich jetzt im zweiten Fenster JDialog. Der Fehler müsste sofort nach dem Malen auftreten. Kann jemand den Fehler reproduzieren?
Habe mit Java 1.8.0_191 getestet.

Java:
package miniMalen1;

import java.awt.Color;
import java.awt.Graphics;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;

import javax.swing.JButton;
import javax.swing.JDialog;
import javax.swing.JFrame;
import javax.swing.JPanel;

public class MainWindow extends JFrame {
 
    private int x = -10;
    private int y = -10;

    public static void main(String[] args) {
        MainWindow window1 = new MainWindow();
        SecondWindow window2 = new SecondWindow();
        window2.setLocationRelativeTo(window1);
        window2.setBounds(100, 100, 200, 200);
    }
 
    public MainWindow() {
        init();
    }

    private void init() {
        this.setDefaultCloseOperation(EXIT_ON_CLOSE);
        this.setBounds(0, 0, 500, 500);
        this.setLocationRelativeTo(null);
        this.setAlwaysOnTop(true);
        this.setBackground(Color.white);
        this.setLayout(null);
        this.setVisible(true);
     
        JPanel panel = new JPanel() {
            public void paintComponent(Graphics g) {
                g.fillOval(x, y, 10, 10);
            }
        };

        panel.setBackground(Color.WHITE);
        panel.setBounds(0, 0, 500, 500);
        this.add(panel);

        panel.addMouseMotionListener(new MouseAdapter() {
            public void mouseDragged(MouseEvent arg0) {
                x = arg0.getX();
                y = arg0.getY();
//                Graphics g = panel.getGraphics();
//                panel.update(g); // mit update() tretet der Fehler nicht auf
                panel.repaint(); // hier tretet der Fehler auf.
            }
        });
     
        panel.addMouseListener(new MouseAdapter() {
            public void mousePressed(MouseEvent arg0) {
                x = arg0.getX();
                y = arg0.getY();
//                Graphics g = panel.getGraphics();
//                panel.update(g); // Mit update() tretet der Fehler nicht auf.
                panel.repaint(); // hier tretet der Fehler auf.
            }
        });
    }
}

class SecondWindow extends JDialog {
 
    public SecondWindow() {
        this.setDefaultCloseOperation(HIDE_ON_CLOSE);
        this.setAlwaysOnTop(true);
        this.setBackground(Color.white);
        this.setLayout(null);
     
        init();
    }

    private void init() {
        JButton button = new JButton("Button");
        button.setBounds(0, 0, 100, 30);
        this.add(button);     
     
        this.setVisible(true);
    }
 
}
 
Ähnliche Java Themen
  Titel Forum Antworten Datum
M Verständnisfragen LayoutManagers AWT, Swing, JavaFX & SWT 11
U Weitere Verständnisfragen zu MVC AWT, Swing, JavaFX & SWT 7
E JavaFX Umgang mit SVG-Dateien AWT, Swing, JavaFX & SWT 0
I Umgang mit vielen Objekten AWT, Swing, JavaFX & SWT 3
perlenfischer1984 Umgang mit IDs bei dynamischen Tab AWT, Swing, JavaFX & SWT 1
Meeresgott Swing Umgang mit JPanel AWT, Swing, JavaFX & SWT 4
A Swing JTable Umgang mit Zellen AWT, Swing, JavaFX & SWT 2
E Umgang mit der Update Methode AWT, Swing, JavaFX & SWT 38
G Prinzipelles zum Umgang von Klassen untereinander AWT, Swing, JavaFX & SWT 4
A Richtiger Umgang mit jProgressBar AWT, Swing, JavaFX & SWT 2
T ProgressBox - Update AWT, Swing, JavaFX & SWT 9
Ernesto95 JavaFX JavaFX GUI mit sehr vielen Update requests AWT, Swing, JavaFX & SWT 4
G update, paintComponent AWT, Swing, JavaFX & SWT 1
T GUI Update /EDT AWT, Swing, JavaFX & SWT 7
izoards JavaFX Concurrency Update UI AWT, Swing, JavaFX & SWT 35
ms_cikar Update swingUtilities Repaint in der Schleife AWT, Swing, JavaFX & SWT 3
J TableView Update/Refresh CPU AWT, Swing, JavaFX & SWT 2
ralfb1105 Swing JComboBox update der Daten AWT, Swing, JavaFX & SWT 8
blazingblade JavaFX Tableview Clock Column update AWT, Swing, JavaFX & SWT 5
R Update eines Labels bei Methodenaufruf einer anderen Klasse AWT, Swing, JavaFX & SWT 9
B Swing Update Swing Komponente bevor Methode startet. AWT, Swing, JavaFX & SWT 4
M JavaFX ComboBox: Update zur Laufzeit AWT, Swing, JavaFX & SWT 16
W Swing ProgressBar update AWT, Swing, JavaFX & SWT 4
B IconImage update im Tabbedpane AWT, Swing, JavaFX & SWT 3
M Update überschreiben klappt nicht AWT, Swing, JavaFX & SWT 4
Q JList Update Problem AWT, Swing, JavaFX & SWT 1
N Observer: update ruft nicht repaint auf AWT, Swing, JavaFX & SWT 0
M "Update" der JTable funktioniert nicht AWT, Swing, JavaFX & SWT 2
S Swing Update eine JTabelle nach einer Drag&Drop Operation AWT, Swing, JavaFX & SWT 0
C Swing Update von swing-TableModels per Thread. Eins geht, das andere nicht, warum? AWT, Swing, JavaFX & SWT 12
V Swing Update Textarea AWT, Swing, JavaFX & SWT 2
T Event Handling JFreeChart Update AWT, Swing, JavaFX & SWT 2
Farbtopf Live update JFreeChart AWT, Swing, JavaFX & SWT 3
F Swing GUI-Thread für automatisches Update nutzen AWT, Swing, JavaFX & SWT 10
El_Lobo Swing bei Update von Graphik Koordinatensystem nicht jedesmal neu zeichnen AWT, Swing, JavaFX & SWT 2
M Update JPanel AWT, Swing, JavaFX & SWT 12
N update model nach dem filtern AWT, Swing, JavaFX & SWT 2
E Swing Update JTable AWT, Swing, JavaFX & SWT 6
L Update JTree Verzeichnisse AWT, Swing, JavaFX & SWT 9
G Swing Update-Funktion für Swing-Anwendung AWT, Swing, JavaFX & SWT 5
E Swing JTextField Listener nach Update?! AWT, Swing, JavaFX & SWT 2
D Swing JTable Problem bei automatischem update von Zellen AWT, Swing, JavaFX & SWT 3
P 2D-Grafik PaintComponent() übernimmt keine Werte aus update() AWT, Swing, JavaFX & SWT 8
D Swing update eines Labels nicht sichtbar AWT, Swing, JavaFX & SWT 9
N Tablle nach SQL-Update neu Laden AWT, Swing, JavaFX & SWT 4
M SWT grabExcessHorizontalSpace update ? refresh ? AWT, Swing, JavaFX & SWT 6
P Observer und GUI Update AWT, Swing, JavaFX & SWT 2
w0ddes Swing Update: Laufendes GUI updaten AWT, Swing, JavaFX & SWT 8
D JTable während edit kein update machen lassen AWT, Swing, JavaFX & SWT 2
M Swing Kein update bei simulierten HTML-Link AWT, Swing, JavaFX & SWT 4
C SWT Shell update probleme - Mausbewegung nötig AWT, Swing, JavaFX & SWT 2
hdi Swing GUI update vs. Process Speed AWT, Swing, JavaFX & SWT 31
hdi Swing Gui Update Problem (EDT) AWT, Swing, JavaFX & SWT 6
C JList update über tabbedPane? AWT, Swing, JavaFX & SWT 18
M Update einer JTEextArea AWT, Swing, JavaFX & SWT 2
H JTable mySQL Update AWT, Swing, JavaFX & SWT 8
S Update des fensters beim Ersetzen von JPanels AWT, Swing, JavaFX & SWT 9
G Features nach Update löschen AWT, Swing, JavaFX & SWT 2
J Fragen zur Vererbung und Update AWT, Swing, JavaFX & SWT 12
B Update von JLabels AWT, Swing, JavaFX & SWT 2
C Habe Probleme beim Bild laden! *Update 30.11.2006* AWT, Swing, JavaFX & SWT 28
C JTreeTable update Problem AWT, Swing, JavaFX & SWT 4
S Probleme mit dem Update einer JList AWT, Swing, JavaFX & SWT 7
B View zeichnet Daten aus dem Model ohne Update AWT, Swing, JavaFX & SWT 4
A Update von Frameinhalt und Scrollbar AWT, Swing, JavaFX & SWT 11
F MVC: Update von View und Controller AWT, Swing, JavaFX & SWT 5
C JTable update: Selektion beibehalten AWT, Swing, JavaFX & SWT 12
P paintComponent /paint/ update/ offscreenImage / Graphics2D / AWT, Swing, JavaFX & SWT 4
S JMenuBar + update AWT, Swing, JavaFX & SWT 3
G JTree - ungültiger selection update AWT, Swing, JavaFX & SWT 2
G Problem mit JLabel Update AWT, Swing, JavaFX & SWT 3
C [JTable] Update der Datenbank AWT, Swing, JavaFX & SWT 6
N update()-Methode für Canvas AWT, Swing, JavaFX & SWT 9
A problem mit update nach event, JSplitpane spinnt AWT, Swing, JavaFX & SWT 2
S Update von Grafik auf JPanel AWT, Swing, JavaFX & SWT 2
M GUI Update während der Verarbeitung einer Methode AWT, Swing, JavaFX & SWT 3
M update JTable AWT, Swing, JavaFX & SWT 3
T Problem bei Update von JTables in JTabbedPane AWT, Swing, JavaFX & SWT 2
D Problem beim Update von unsichtbaren JComponents mit Timern AWT, Swing, JavaFX & SWT 5
D Swing: GUI-Update-Problem AWT, Swing, JavaFX & SWT 3
J Warum funktioniert das Update des UI nicht? AWT, Swing, JavaFX & SWT 8
I GUI-Update-Probleme AWT, Swing, JavaFX & SWT 2
G Update von JPanel nach Buttonbetätigung AWT, Swing, JavaFX & SWT 1

Ähnliche Java Themen

Neue Themen


Oben