actionPerformed() zur richtigen Zeit

f10

Aktives Mitglied
Hallo zusammen,

ich hänge gerade fest. Entweder hab ich einen gewaltigen Denkfehler oder ich sehe den Wald vor lauter Bäumen nicht.

Ich habe mir eine Klasse geschrieben, die ein JPanel erstellt und darauf ein BufferedImage zeichnet. Nun wollte ich das auf einem JFrame ausgeben. Funktioniert. Gut, jetzt will ich das Ganze aber dynamisch machen und von Textfeldern Werte einlesen, die dann anhand der Konstruktoraufrufe ein neues Bild zeichnen und dieses möchte ich dann als JPanel auf das JFrame setzen.

Java:
/* Hier steht unbedeutender Code */


pnlCenter = new JPanel();
frame.add(pnlCenter, BorderLayout.CENTER);

JButton btn = new JButton("Fire");
btn.addActionListener(ae -> chartify());
btn.setPreferredSize(new Dimension(0,25));
frame.add(btn, BorderLayout.SOUTH);

/* hier endet die Methode (eine Art initComponents()) */

private void chartify(){

  chart = OwnChart(300, 200, 20, 70, 10, "Ananas", "Birne", "Apfel");
  pnlCenter = chart.getPanel();
  frame.repaint();

}

OwnChart ist meine Klasse, die das Bild auf das JPanel malt.

Kann mir jemand erklären, warum nichts passiert, wenn ich den Button druecke?

Theoretisch muesste doch pnlCenter das JPanel von chart referenzieren und mit der repaint()-Methode vom frame muesste doch dann auch das JPanel neu gezeichnet werden und ich muesste das Bild sehen, oder nicht?

LG
f10
 

X5-599

Top Contributor
Nicht ganz. Java hat in dem Sinne kein Call by Reference. Hier belegst du zwar die variable pnlCenter neu, das JFrame bekommt davon aber nichts mit.
Um das ganze ans Laufen zu bringen müsstest du sowas in der Art machen:

Code:
frame.remove(pnlCenter); //ich glaube das könnte man sich sparen. das erneute frame.add() müsste das alte Panel sowieso ersetzen...
pnlCenter = chart.getPanel();
frame.add(pnlCenter, BorderLayout.CENTER);
frame.repaint();
 

f10

Aktives Mitglied
Nicht ganz. Java hat in dem Sinne kein Call by Reference. Hier belegst du zwar die variable pnlCenter neu, das JFrame bekommt davon aber nichts mit.
Um das ganze ans Laufen zu bringen müsstest du sowas in der Art machen:

Code:
frame.remove(pnlCenter); //ich glaube das könnte man sich sparen. das erneute frame.add() müsste das alte Panel sowieso ersetzen...
pnlCenter = chart.getPanel();
frame.add(pnlCenter, BorderLayout.CENTER);
frame.repaint();

Ohne das remove() hatte ich es so auch schon versucht, aber selbst mit remove() ändert sich an der Situation nichts. Druecke ich den Knopf, passiert nichts.

Ich hab das schnell runtergebrochen aufs Wesentliche:

Chart.java

Java:
package mychart;

import java.awt.BorderLayout;
import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.image.BufferedImage;
import java.io.IOException;
import java.net.MalformedURLException;
import java.net.URL;

import javax.imageio.ImageIO;
import javax.swing.JPanel;

public class Chart {

    JPanel pnl;
    int chartWidth, chartHeight, val1, val2, val3;
    String text1, text2, text3;
    MyPanel panel;

    public Chart(int chartWidth, int chartHeight, int val1, int val2, int val3, String text1, String text2,
            String text3) {
        this.chartWidth = chartWidth;
        this.chartHeight = chartHeight;
        this.val1 = val1;
        this.val2 = val2;
        this.val3 = val3;
        this.text1 = text1;
        this.text2 = text2;
        this.text3 = text3;
        initComponents();
    }

    private void initComponents() {
        pnl = new JPanel();
        pnl.setLayout(new BorderLayout());

        URL location = null;
        try {
            location = new URL("https://chart.apis.google.com/chart?cht=p&chs=" + this.chartWidth + "x"
                    + this.chartHeight + "&chd=t:" + this.val1 + "," + this.val2 + "," + this.val3 + "&chl="
                    + this.text1 + "|" + this.text2 + "|" + this.text3);
        } catch (MalformedURLException e) {
            System.out.println(e.getMessage());
        }
        BufferedImage img = null;
        try {
            img = ImageIO.read(location);
        } catch (IOException e) {
            System.out.println(e.getMessage());
        }

        this.panel = new MyPanel(img);
        pnl.add(panel, BorderLayout.CENTER);

    }

    public MyPanel getPanel() {
        return panel;
    }

    public JPanel getPnl() {
        return pnl;
    }

    public class MyPanel extends JPanel {
        BufferedImage img;

        public MyPanel(BufferedImage img) {
            this.img = img;
        }

        @Override
        public void paint(Graphics g) {
            Graphics2D g2d = (Graphics2D) g;
            super.paint(g2d);

            g2d.drawImage(img, null, 0, 0);

        }

    }
}

und die App.java:

Java:
import java.awt.BorderLayout;
import java.awt.Dimension;

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

public class App extends JFrame {
    JFrame frame;
    JPanel pnlCenter;
    JButton btn;
    private Chart gooc;

    public static void main(String[] args) {
        new App();

    }

    public App() {
        initComponents();
        this.setVisible(true);
    }

    private void initComponents() {

        this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        this.setLayout(new BorderLayout());
        this.setSize(new Dimension(317, 335));
        this.setLocationRelativeTo(null);

        pnlCenter = new JPanel();
        this.add(pnlCenter, BorderLayout.CENTER);

        btn = new JButton("Fire");
        btn.addActionListener(ae -> chartify());
        btn.setPreferredSize(new Dimension(0, 25));
        this.add(btn, BorderLayout.SOUTH);
    }

    private void chartify() {
        this.remove(pnlCenter);
        gooc = new Chart(300, 200, 20, 70, 10, "Ananas", "Banane", "Ananas");
        pnlCenter = gooc.getPnl();
        this.add(pnlCenter, BorderLayout.CENTER);
        this.repaint();
    }
}


Wenn ich allerdings die Zeilen

Java:
gooc = new Chart(300, 200, 20, 70, 10, "Ananas", "Banane", "Ananas");
        pnlCenter = gooc.getPnl();

in der initComponents() statt dem new JPanel() aufrufe, funktioniert es. Es wird allerdings nicht neu gezeichnet, wenn ich die actionPerformed() auslöse. Woran kann das liegen?

Edit: Ich weiß, dass man nicht von JFrame erben sollte, wenn man es nicht erweitert, ich hab es nur der Schnelle halber mal kurzfristig so implementiert.
 

X5-599

Top Contributor
Ich hab mal dein Beispiel probiert und die beiden JPanel einfach durch zwei JPanels ersetzt die eine unterschiedliche Farbe haben.
Zuerst wird ein oranges angezeigt. (das setze ich in initComponents())
Beim Klick wird dann ein grünes gesetzt (in charify()).

Das erscheint aber nicht; Hintergrund wird grau...
Was hilft ist in chartify vor dem repaint() ein revalidate() auszuführen. Swing ist da manchmal etwas eigenartig.
 

X5-599

Top Contributor
Leider nicht. Manchmal reicht ein repaint manchmal auch nicht. Vielleicht weiß ja jemand hier im Form warum das so ist.
 

Flown

Administrator
Mitarbeiter
Lesen kannst du das mal HIER, wie Swing und AWT zeichnet.

Repaint zeichnet die aktuelle Komponente neu.
Revalidate muss aufgerufen werden, falls sich Strukturen ändern (sprich du tauschst das JPanel aus).
 
Ähnliche Java Themen
  Titel Forum Antworten Datum
R actionPerformed wird nicht ausgeführt Java Basics - Anfänger-Themen 5
D JLabel ändern in actionperformed Java Basics - Anfänger-Themen 2
D KeyListener nicht mehr aktiv nach ActionPerformed Java Basics - Anfänger-Themen 2
S Wie werte vergleichen, die in actionPerformed-Methode hängen ? Java Basics - Anfänger-Themen 4
M Threads Thread.Sleep Problem im Zusammenhang mit GUI/ActionPerformed-Methode Java Basics - Anfänger-Themen 4
J In actionPerformed Zugriff auf öffentlich Methoden der Klasse Java Basics - Anfänger-Themen 4
Z Kann actionPerformed(ActionEvent) nicht überschreiben Java Basics - Anfänger-Themen 8
J Werte an Methode übergeben und gleichzeitig ActionPerformed einbeziehen. Java Basics - Anfänger-Themen 14
M OOP ActionPerformed Methode aus anderer AP aufrufen? Java Basics - Anfänger-Themen 5
M Variablen via actionPerformed mit Buttons ändern Java Basics - Anfänger-Themen 7
R Wie es anstellen das ActionPerformed einen Wert zurückgibt? Java Basics - Anfänger-Themen 8
S Objekt an actionPerformed Methode übergeben Java Basics - Anfänger-Themen 7
A lokale Variable innerhalb "actionPerformed()" Java Basics - Anfänger-Themen 10
S actionPerformed(ActionEvent ev) Java Basics - Anfänger-Themen 4
Houly while Schleife im ActionPerformed Event Java Basics - Anfänger-Themen 8
R ActionPerformed: Methode ausführen Java Basics - Anfänger-Themen 3
0 Fehlermeldung: SteuerungsPanel$ButtonHandler.actionPerformed(Steu erungsPanel.java: Java Basics - Anfänger-Themen 2
R Thread in ActionPerformed-Methode unbekannt? Java Basics - Anfänger-Themen 4
R Wie getText mit actionPerformed verwenden? Java Basics - Anfänger-Themen 3
C actionPerformed(null) Java Basics - Anfänger-Themen 6
D Auf Buttondruck (actionperformed) painten Java Basics - Anfänger-Themen 5
H Frage zur Methode: actionPerformed Java Basics - Anfänger-Themen 2
A ActionPerformed Methode ohne Rückgabewert Java Basics - Anfänger-Themen 12
I actionPerformed funktioniert nicht Java Basics - Anfänger-Themen 13
DeeDee0815 JRadioButton, actionPerformed und Textfelder Java Basics - Anfänger-Themen 2
B Exception Handling in der ActionPerformed-Methode Java Basics - Anfänger-Themen 7
S Java GUI: Probleme mit EventListener und actionPerformed Java Basics - Anfänger-Themen 3
B actionPerformed und ComboBoxen Java Basics - Anfänger-Themen 7
J JMenu + ActionPerformed + ConntentPane Java Basics - Anfänger-Themen 4
D Fehlersuche actionPerformed Java Basics - Anfänger-Themen 6
S actionPerformed und JCheckBox Java Basics - Anfänger-Themen 4
N ActionListener - ActionPerformed - if soure= .... Java Basics - Anfänger-Themen 6
M Übergeben einer Variable an actionPerformed(ActionEvent e)? Java Basics - Anfänger-Themen 5
U actionPerformed - Source verständlich Java Basics - Anfänger-Themen 8
C Problem mit actionPerformed Java Basics - Anfänger-Themen 4
M Von Eclipse zum richtigen Programm Java Basics - Anfänger-Themen 1
E fehlermeldung bei richtigen login daten Java Basics - Anfänger-Themen 7
HeiTim Problem mit der Kommasetzung an der richtigen stelle Java Basics - Anfänger-Themen 59
CptK Richtigen Pfad beim einlesen von Datei finden Java Basics - Anfänger-Themen 2
MiMa Die richtigen Java Projektvorlagen wählen? Java Basics - Anfänger-Themen 3
Ponychan95 Kommazahl als richtigen Währungsbetrag ausgeben Java Basics - Anfänger-Themen 1
K Methoden Lotto mit sechs richtigen Java Basics - Anfänger-Themen 10
T Richtigen Wert erkennen Java Basics - Anfänger-Themen 9
S Suche richtigen Typ für Variabel mit den Werten (neu, gebraucht, beschädigt) Java Basics - Anfänger-Themen 7
G Collections Wahl der richtigen Collection Java Basics - Anfänger-Themen 11
D Erste Schritte Auswahl der richtigen tools Java Basics - Anfänger-Themen 7
D Muss ich eigentlich immer auf die Verwendung des richtigen Datentyps achten? Java Basics - Anfänger-Themen 7
A Framegröße nur in richtigen Proportionen ändern Java Basics - Anfänger-Themen 2
Z Frage des richtigen Werkzeugs für ein Schachspiel? Java Basics - Anfänger-Themen 32
T ArrayList mit Dateien in die richtigen Ordner eines JTree Java Basics - Anfänger-Themen 16
J Richtigen Parser wählen Java Basics - Anfänger-Themen 2
D Wie kann ich den richtigen Parameter übergeben Java Basics - Anfänger-Themen 5
N Ich kriege ganze zeit die Fehlermeldung "Inhalt der Zwischenablage kann nicht in die ausgewählten Elemente eingefügt werden" hat jemand eine Lösung? Java Basics - Anfänger-Themen 6
S Wie Rechne ich die Zeit in ...L um? Java Basics - Anfänger-Themen 15
I Zahl aufrunden (Zeit) Java Basics - Anfänger-Themen 43
H Primzahlen finden - Zeit optimieren Java Basics - Anfänger-Themen 34
B Prüfen, ob Zeit Überschreitung Java Basics - Anfänger-Themen 2
I Nächstmögliche Zeit erhalten Java Basics - Anfänger-Themen 11
hello_autumn Zeit messen von ausgeführten Tools. Java Basics - Anfänger-Themen 1
B Nächster möglicher Tag bekommen / Nächste mögliche Zeit bekommen Java Basics - Anfänger-Themen 24
Y Warum aktualisiert die Zeit nicht? Java Basics - Anfänger-Themen 4
J Aktuelle Zeit in einer JavaFX Anwendung aktualisieren lassen Java Basics - Anfänger-Themen 4
S JButton soll für bestimmte Zeit verschwinden Java Basics - Anfänger-Themen 5
T Erste Schritte Schreiben Sie eine Klasse Zeit, die eine Zeitdauer in Minuten beschreibt. Die Anzahl Minuten verwalt Java Basics - Anfänger-Themen 3
F Zeit in Milli bis Mitternacht Java Basics - Anfänger-Themen 20
M Messandwendung nach Zeit und eigener Eingabe Java Basics - Anfänger-Themen 4
J Java Datum- Zeit Differenz bilden! Java Basics - Anfänger-Themen 4
N Server Zeit zur lokalen Zeit setzen. Java Basics - Anfänger-Themen 0
K Eine bestimmte Zeit, eine Schleife laufen lassen. Java Basics - Anfänger-Themen 4
N Zeit berechnen, die für eine Strecke benötigt wird Java Basics - Anfänger-Themen 3
S Threads Zu bestimmer Zeit Screenshot erstellen. Java Basics - Anfänger-Themen 2
M Zahlen verändern nach Zeit Java Basics - Anfänger-Themen 6
E Zeit zum bestimmten Datum in millisekunden berechnen Java Basics - Anfänger-Themen 5
H Methoden Stopwatch misst Zeit einer Methode nicht Java Basics - Anfänger-Themen 8
K Zeit auslesen von Timeserver einen Tag daneben Java Basics - Anfänger-Themen 11
S Zeit messe? Java Basics - Anfänger-Themen 8
L Zeit sekündlich aktualisieren Java Basics - Anfänger-Themen 7
S Zeit bestimmen Java Basics - Anfänger-Themen 4
E Algorithmen und Programmierung - Datum und Zeit ausgeben? Java Basics - Anfänger-Themen 8
J Aufgabe: Zeit in Sekunden Java Basics - Anfänger-Themen 9
F Einfache Klassen für Datum und Zeit Java Basics - Anfänger-Themen 3
K Zeit ablaufen lassen und nach Ablauf beenden Java Basics - Anfänger-Themen 5
M Zeit von microsekunden auf Format mm:ss Java Basics - Anfänger-Themen 13
G Methoden Zeit Umrechnungsfaktor Java Basics - Anfänger-Themen 2
M Reaktion auf bestimmte Zeit Java Basics - Anfänger-Themen 2
S Animation nach bestimmter Zeit ausführen Java Basics - Anfänger-Themen 3
F hat jmd Zeit mir bisschen zu helfen msn/skype Java Basics - Anfänger-Themen 10
R Kalender speichert keine Zeit Java Basics - Anfänger-Themen 2
F Zeit per Array "zurückdrehen" Java Basics - Anfänger-Themen 5
R Zeit kommt mir zu lange vor... Java Basics - Anfänger-Themen 7
C Ereignis nach einer gewissen Zeit Java Basics - Anfänger-Themen 10
C Falsche Zeit Java Basics - Anfänger-Themen 2
A Unix-Zeit verkürzen Java Basics - Anfänger-Themen 2
Z JScrollPane zeigt Zeit als Datum Java Basics - Anfänger-Themen 5
H Programm zu bestimmten Zeit ausführen Java Basics - Anfänger-Themen 3
R Stoppuhr: Zeit ermitteln und übergeben - Variable static?? Java Basics - Anfänger-Themen 6
G Umrechnung Zeit/Temperatur Java Basics - Anfänger-Themen 6
Luk10 Zeit-Aspekt in Java Java Basics - Anfänger-Themen 3
N zeit ausgeben Java Basics - Anfänger-Themen 5
C countdown/timer/Zeit warten lassen Java Basics - Anfänger-Themen 14

Ähnliche Java Themen

Neue Themen


Oben