ActionListener und repaint()

Status
Nicht offen für weitere Antworten.
A

andyle

Gast
Hallo zusammen,

nach intensiver Recherche bin ich zu keiner Lösung gekommen und hoffe von euch auf Hilfe.

Bei dem Projekt (Visualisierung von Hashing) arbeite ich mit Eclipse und Swing.
Ich habe eine Datenstruktur (List) die bei manuellen Änderungen (setValue) einen Observer (JPanel) informiert (notify), welcher dann die Daten neu zeichnet (Java2D, repaint -> paint). Funktioniert soweit.
Nun möchte ich in einer Schleife die Daten ändern und gleichzeitig bei jeder Änderung neu zeichnen (--> Animation). Starte ich die Schleife mit Programmbeginn, funktioniert es wunderbar. Ich möchte die Schleife aber per Button (also im ActionListener) starten, was jetzt nicht mehr funktioniert, d.h. die Schleife läuft zwar durch aber die ständigen Änderungen lösen kein Neuzeichnen aus. Erst am Ende sind alle Daten gezeichnet.
Woran könnte das liegen? Ich hoffe ihr könnt mir helfen. Sonstige Verbesserungsvorschläge jederzeit gerne.

Hier die relevanten Codes:

die Datenstruktur:
Code:
public class FunHash extends Observable
{
    List[] hashTabelle = new ArrayList[15];
    int[] pool = new int[50];
    ...

    public void setValue(int hashWert, String eingabe)     // wird verwendet für manuelle Dateneingabe
    {
        hashTabelle[hashWert].add(0,eingabe);
        // hier Observer informieren
        this.setChanged();
        this.notifyObservers(this);
    }
		
    public void setValue(int hashWert, Integer pool_elem)
    {
        hashTabelle[hashWert].add(0,pool_elem.toString());
        System.out.println(hashTabelle[hashWert].get(0));
        // hier Observer informieren
        this.setChanged();
        this.notifyObservers(this);
        try{Thread.sleep(100);}catch(Exception e){e.printStackTrace();}    //für eine animierte Darstellung
    }			
    public void poolHashing()
    {
        Vector<Integer> v_pool = new Vector<Integer>();
        for (int i = 0; i < pool.length; i++) 
        {
            v_pool.addElement(new Integer(i));
        }
        for (int j = pool.length; j >= 1; j--) 
        {
            int zufall = (int) (Math.random() * j);
            Integer i = (Integer)v_pool.elementAt(zufall);
            v_pool.removeElementAt(zufall);
            int hashWert = this.hashFunktion(i);
            this.setValue(hashWert, i);	//speichern
        }
    }
}

der Listener:
Code:
public class PoolSpeichernListener implements ActionListener
{
    private FunHash fh;
    private VisPaintPanel paintPanel;

    public void actionPerformed(ActionEvent event)
    {
        JButton sender = (JButton) event.getSource();
        VisGUI top = (VisGUI) sender.getTopLevelAncestor();
        fh = top.getFunHash();				
        paintPanel = top.getVisPaintPanel();
        fh.poolHashing();
    }
}

der Observer:
Code:
public class VisPaintPanel extends JPanel implements Observer
{
    private FunHash fh;
    private Graphics2D g2d;
    private JButton poolHash;

    public VisPaintPanel(FunHash fh)
    {
        this.fh = fh;
        fh.addObserver(this);
        poolHash = new JButton("PoolHash");
        poolHash.addActionListener(new PoolSpeichernListener());
        this.add(poolHash);
    }

    public void paint(Graphics g)
    {
        super.paint(g);	        //löscht Zeichenfläche vor nächstem zeichnen
        g2d = (Graphics2D) g;
        ...                             //Daten aus FunHash zeichen
    }

    public void update(Observable o, Object arg)	//wird durch notify aufgerufen	
    {
        repaint();	//ruft paint() auf --> neuzeichnen
    }
}

Dann gibt es noch die Main-Klasse (JFrame) die VisPaintPanel und FunHash erzeugt.
 
G

Guest

Gast
Versuch mal das
Code:
public class PoolSpeichernListener implements ActionListener
{
    public void actionPerformed(ActionEvent event)
    {
        JButton sender = (JButton) event.getSource();
        VisGUI top = (VisGUI) sender.getTopLevelAncestor();

        final FunHash fh = top.getFunHash();
        SwingUtilities.invokeLater(
           new Runnable() {
              public void run() {
                 fh.poolHashing();
              }
           }
        );
    }
}
 

Quaxli

Top Contributor
Grundsätzlich solltest Du bei Swing das Neuzeichnen in einem eigenen Thread durchführen, sonst wirst Du auf keinen grünen Zweig kommen. Ich würde etwa so vorgehen:

Schon bei Programmstart startest Du einen eigenen Thread der periodisch auf Deine Oberfläche einen repaint startet.

Etwa so:

Code:
  while(running){      //running ist ein boolean

    if(GUI.button_pressed){   //noch'n boolean
       GUI.computeChanges();
    }

     GUI.repaint();
       
      try {
	Thread.sleep(10);
     } catch (InterruptedException e) {}	 

  }

In Deiner Gui setzt Du mit dem Button-Click nur einen Boolean, der dem Programm mitteilt, daß Du jetzt die Animation gestartet haben möchtest.
In dem neuen Thread fragst Du diesen Boolean ab um die Änderungen zu berechnen, die Du dann dargestellt haben möchtest.
Grundsätzlich bei jedem Schleifendurchlauf rufst Du einen repaint() auf. Anschließend legst Du den Thread für 10 ms schlafen, damit er nicht alles andere blockiert.

Wenn das nicht funzt, poste mal den Code, wo Du jetzt noch Pünktchen (...) stehen hast.

Noch ein Tipp:
Anstelle der paint-Methode würde ich im JPanel die paintComponent-Methode überschreiben. Damit schaltest Du noch ein paar mögliche Probleme auf (vgl. Beschreibung API).[/code]
 

J.C.

Mitglied
Als zusätzliche Info: Wenn sich eine Komponente verändert führt java ein repaint automatisch aus.
 
Status
Nicht offen für weitere Antworten.
Ähnliche Java Themen
  Titel Forum Antworten Datum
D Swing Actionlistener verhindert repaint?! AWT, Swing, JavaFX & SWT 2
C Button ActionListener funktioniert nicht AWT, Swing, JavaFX & SWT 1
B Actionlistener mit Java Swing AWT, Swing, JavaFX & SWT 2
L jComboBox Actionlistener wird beim erstmaligen Befüllen getriggert AWT, Swing, JavaFX & SWT 7
H Viele ActionListener (MouseListener) - Performance AWT, Swing, JavaFX & SWT 24
pkm MainFrame durch Actionlistener auffrischen, aber wie? AWT, Swing, JavaFX & SWT 2
L actionListener für Button AWT, Swing, JavaFX & SWT 97
R Actionlistener funktioniert nicht AWT, Swing, JavaFX & SWT 4
N Bilder auf Button einfügen und mehrmals ändern (ein Button, mehrere ActionListener) AWT, Swing, JavaFX & SWT 2
R ActionListener in Actionlistener AWT, Swing, JavaFX & SWT 6
S Swing Variable in Actionlistener aufrufen AWT, Swing, JavaFX & SWT 10
P Swing ActionListener überschreibt einen Wert aus der Hauptklasse nicht AWT, Swing, JavaFX & SWT 5
N Aufruf einer anderen Klasse durch Button ActionListener AWT, Swing, JavaFX & SWT 2
M AWT Kann meinen Fehler beim ActionListener nicht finden AWT, Swing, JavaFX & SWT 5
F Wie bekomme ich den Wert der ComboBox in eine Variable gespeichert welche ich für meinen ActionListener nutzen kann? AWT, Swing, JavaFX & SWT 3
L Ein Actionlistener für ein Textfeld, anstatt viele Actionlistener für ein Textfeld AWT, Swing, JavaFX & SWT 7
coolian ActionListener funktonirt nicht richtig auf JMenuItem AWT, Swing, JavaFX & SWT 4
L ActionListener zu Button in Panel hinzufügen AWT, Swing, JavaFX & SWT 10
R Kann JLabel in ActionListener nicht aufrufen AWT, Swing, JavaFX & SWT 4
Blender3D einzelner ActionListener vs anonyme ActionListener AWT, Swing, JavaFX & SWT 10
T Swing Änderung des ActionListener Events nach Klick auf JButton AWT, Swing, JavaFX & SWT 2
xYurisha ActionListener Methoden Buttons zuweisen! AWT, Swing, JavaFX & SWT 16
J ActionListener bei Buttons AWT, Swing, JavaFX & SWT 14
S Swing Problem mit Button und ActionListener AWT, Swing, JavaFX & SWT 5
it_is_all ActionListener umlenken/ updaten mit AddActionListener funktioniert nicht AWT, Swing, JavaFX & SWT 3
it_is_all Event Handling ActionListener in anderer Klasse klappt nicht AWT, Swing, JavaFX & SWT 4
F "ActionListener" funktioniert nicht AWT, Swing, JavaFX & SWT 4
Z ActionListener Variable übergeben AWT, Swing, JavaFX & SWT 12
T JProgressbar während actionListener updaten AWT, Swing, JavaFX & SWT 1
S While Schleife im Actionlistener AWT, Swing, JavaFX & SWT 1
S ActionListener für alle Buttons AWT, Swing, JavaFX & SWT 26
R Swing ActionListener bei JButton AWT, Swing, JavaFX & SWT 9
T ActionListener nimmt JTextField nicht mehr an. AWT, Swing, JavaFX & SWT 2
P ActionListener Graphics Einbauen AWT, Swing, JavaFX & SWT 0
S actionlistener mit 2 fenster integrieren AWT, Swing, JavaFX & SWT 11
Liondary GUI - ActionListener AWT, Swing, JavaFX & SWT 7
J ActionListener erkennt Variable nicht AWT, Swing, JavaFX & SWT 6
E ActionListener führt falsche Funktion aus AWT, Swing, JavaFX & SWT 6
Sin137 ActionListener in MVC AWT, Swing, JavaFX & SWT 7
M ActionListener und mathematische Methoden AWT, Swing, JavaFX & SWT 13
A Oberfläche mit zwei Klassen und actionlistener verbinden AWT, Swing, JavaFX & SWT 7
Paul15 ActionListener Variablen AWT, Swing, JavaFX & SWT 13
Y ActionListener AWT, Swing, JavaFX & SWT 2
K Ereignisbehandlung, ActionListener, ActionEvent AWT, Swing, JavaFX & SWT 3
A Gui für Vokabeltrainer (ActionListener) AWT, Swing, JavaFX & SWT 14
C Im ActionListener Buttons disablen, einen Thread starten, dann Buttons enablen AWT, Swing, JavaFX & SWT 2
M JTextArea wird nicht aktualisiert (ActionListener-Problem) AWT, Swing, JavaFX & SWT 1
J Event Handling JOptionPane ActionListener setzen. AWT, Swing, JavaFX & SWT 3
S ActionListener Klasse aufrufen AWT, Swing, JavaFX & SWT 4
R Swing Problem: IOException bei ActionListener AWT, Swing, JavaFX & SWT 1
J ActionListener soll auf paint() Methode zugreifen AWT, Swing, JavaFX & SWT 1
A JButton wird bei ActionListener nicht "angenommen" AWT, Swing, JavaFX & SWT 7
T Einfaches Problem mit ActionListener AWT, Swing, JavaFX & SWT 2
K ActionListener mit KeyListener AWT, Swing, JavaFX & SWT 7
K GUI, Button, ActionListener - ein paar Einsteigerprobleme AWT, Swing, JavaFX & SWT 1
W Verschachtelter ActionListener AWT, Swing, JavaFX & SWT 0
G gewünschte ActionListener bei RadioButton mit isSelected geht nicht AWT, Swing, JavaFX & SWT 2
C Probleme mit Buttons und einem ActionListener AWT, Swing, JavaFX & SWT 2
K Swing JMenu und ActionListener AWT, Swing, JavaFX & SWT 4
A Swing ActionListener AWT, Swing, JavaFX & SWT 8
V ActionListener Abhängigkeitenproblem AWT, Swing, JavaFX & SWT 6
M ActionListener für mehrere Klassen AWT, Swing, JavaFX & SWT 4
J ActionListener für Buttons AWT, Swing, JavaFX & SWT 3
M Event Handling ActionListener übergeben ich checks net AWT, Swing, JavaFX & SWT 4
C Swing ComboBox - ActionListener deaktivieren AWT, Swing, JavaFX & SWT 2
S Button (ActionListener) funktioniert nicht, wenn y-Koordinate verändert wird AWT, Swing, JavaFX & SWT 5
L Swing ActionListener führt seine Aufgabe nur teilweise aus. AWT, Swing, JavaFX & SWT 7
A Swing ActionListener kann nicht hinzugefügt werden AWT, Swing, JavaFX & SWT 4
P Actionlistener - 3 klassen - kompliziert - auf methoden zugreifen AWT, Swing, JavaFX & SWT 3
Q CardLayout, ausgelagerte Panels, ActionListener AWT, Swing, JavaFX & SWT 5
M ProgressBar in ActionListener AWT, Swing, JavaFX & SWT 4
D AWT eigenem Knopf ActionListener zuweisen AWT, Swing, JavaFX & SWT 24
E Wert aus ActionListener geben AWT, Swing, JavaFX & SWT 4
J ActionListener per Innere Klasse oder e.getActionCommand() if-Abfrage? AWT, Swing, JavaFX & SWT 12
L Swing ActionListener zugriff auf bestimmte Elemente AWT, Swing, JavaFX & SWT 3
P Swing Seltsames ActionListener-Verhalten AWT, Swing, JavaFX & SWT 7
Oliver530 ActionListener von eigener ButtonKlasse AWT, Swing, JavaFX & SWT 16
Kenan89 statischer ActionListener keine Wirkung? AWT, Swing, JavaFX & SWT 2
Kenan89 statischer ActionListener keine Wirkung? AWT, Swing, JavaFX & SWT 3
C In der Schleife ActionListener aktivieren AWT, Swing, JavaFX & SWT 3
B Swing Problem beim ActionListener AWT, Swing, JavaFX & SWT 5
P Swing JPanel mit ActionListener mehrfach verwenden AWT, Swing, JavaFX & SWT 8
1 ActionEvent generieren und an ActionListener weiterleiten AWT, Swing, JavaFX & SWT 12
N Swing Klasse erbt von JDialog - Problem mit innerer ActionListener-Klasse AWT, Swing, JavaFX & SWT 6
N JCombobox und Actionlistener Aktion nur ausführen, wenn Useraktion ihn auslöst AWT, Swing, JavaFX & SWT 4
N Componente und Actionlistener AWT, Swing, JavaFX & SWT 5
C ActionListener AWT, Swing, JavaFX & SWT 6
Corben ActionListener Error AWT, Swing, JavaFX & SWT 2
F Wert durch ActionListener an Klasse übergeben AWT, Swing, JavaFX & SWT 3
I Swing Problem mit InputMap bei JButton (ActionListener) AWT, Swing, JavaFX & SWT 3
S Swing JButton mit ActionListener innerhalb einer JTable AWT, Swing, JavaFX & SWT 4
P Variablen in einem ActionListener zurücksetzen AWT, Swing, JavaFX & SWT 6
M AWT Problem mit ActionListener AWT, Swing, JavaFX & SWT 2
A Swing Bug in Swing? Wenn checkbox disabled reagiert ActionListener nicht AWT, Swing, JavaFX & SWT 5
S ActionListener "nach oben weitergeben" AWT, Swing, JavaFX & SWT 10
M Anonymer ActionListener AWT, Swing, JavaFX & SWT 4
L SWT Actionlistener Combobox öffnen AWT, Swing, JavaFX & SWT 4
S MenuBar ActionListener Event ... AWT, Swing, JavaFX & SWT 6
B Swing Formular mit mehreren Elementen - wie die ActionListener-Verarbeitung lösen? AWT, Swing, JavaFX & SWT 2
M getSource() findet Button nicht - ActionListener AWT, Swing, JavaFX & SWT 4

Ähnliche Java Themen

Neue Themen


Oben