Neuzeichnen bei AbstractAction

AndiE

Top Contributor
Hallo,

ich habe da Schwierigkeiten, die Ansicht neu zeichnen zu lassen. Dies sind die Klassen:
Java:
public class Umrechner {

    /**
     *
     * Startet die Anwendung
     */
    public static void main(String[] args) {
        // TODO Auto-generated method stub
        Anzeige a= new Anzeige();
        a.start();
    }

}
Java:
import javax.swing.JFrame;

public class Anzeige {
   
    /**
     *  stellt den Frame dar
     */

    private JFrame f;
    private Zeiger z;
   
    double temperatur;
   
   
    public Anzeige(){
        temperatur=10.0;
    }
   
    public void start(){
        System.out.println("0");
        z= new Zeiger(this);
        f= new JFrame("Temperaturumrechner");
        f.setSize(320,320);
        f.pack();
        f.add(z);       
        f.setVisible(true);       
    }   
    public double holeTemp(){
        return temperatur;
    }
   
    public void erhoehen(){
        temperatur+=10.0;
    }
}
Java:
import java.awt.event.ActionEvent;

import javax.swing.AbstractAction;

public class KlickAction extends AbstractAction{
   
    /**
     * Klickaction
     */
   
    private Zeiger anz;
   
    public KlickAction(String s, Zeiger a){
        super(s);
        anz=a;
    }
   
    public void actionPerformed(ActionEvent ae){
        System.out.println("1");
        anz.erhoehen();
       
    }
   

}
Java:
import java.awt.Dimension;

import javax.swing.Action;
import javax.swing.JButton;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.JTextField;

public class Zeiger extends JPanel{
   
    /**
     * Anzeigepanel
     */

    private String anz;
    private double temperatur;
    private Anzeige a;
   
    public Zeiger(Anzeige z){
        System.out.println("4");
        a=z;
        temperatur= z.holeTemp();
       
        this.setOpaque(true);
        this.setPreferredSize(new Dimension(300,300));       
        JTextField grad= new JTextField();
        anz=Double.toString(temperatur);
        grad.setText(anz);
       
       
        JTextField fahrenheit=new JTextField();
        double fahren;
        fahren=temperatur*1.8+32;
        anz=Double.toString(fahren);
        fahrenheit.setText(anz);
       
        Action klick= new KlickAction("Erhoehen", this);
        JButton button= new JButton(klick);
        add(new JLabel("Celsius"));
        add(grad);
        add(new JLabel("Fahrenheit"));
        add(fahrenheit);
        add(button);
    }
   
    public void erhoehen(){
        a.erhoehen();
        System.out.println("2");
        this.invalidate();
    }
}
Theoretisch sollte das Panel für ungültig erklärt werden und dieses dann neugezeichnet werden. aber irgendwie macht er das nicht. Beim tabbedPane an andere Stelle hat es funktioniert. Wo ist mein Denkfehler?
 

JCODA

Top Contributor
Du musst auf dem JTextField .setText aufrufen. Nur bei du die Variable temperatur erhöhst, bekommt das TextField diese Information nicht mit.

Also Etwa so:

Java:
import java.awt.Dimension;

import javax.swing.Action;
import javax.swing.JButton;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.JTextField;

public class Zeiger extends JPanel{
 
    /**
     * Anzeigepanel
     */

    private String anz;
    private double temperatur;
    private Anzeige a;
    JTextField grad= new JTextField();
    JTextField fahrenheit=new JTextField();
    public Zeiger(Anzeige z){
        System.out.println("4");
        a=z;
        temperatur= z.holeTemp();
     
        this.setOpaque(true);
        this.setPreferredSize(new Dimension(300,300));     
      
        anz=Double.toString(temperatur);
        grad.setText(anz);
     
     
      
        double fahren;
        fahren=temperatur*1.8+32;
        anz=Double.toString(fahren);
        fahrenheit.setText(anz);
     
        Action klick= new KlickAction("Erhoehen", this);
        JButton button= new JButton(klick);
        add(new JLabel("Celsius"));
        add(grad);
        add(new JLabel("Fahrenheit"));
        add(fahrenheit);
        add(button);
    }
 
    public void erhoehen(){
        a.erhoehen();
        double temp = a.holeTemp();
        grad.setText(temp+"");
        System.out.println("2");       
    }
}
 

AndiE

Top Contributor
Danke. So ist das, wenn man mit mehreren Systemen gearbeitet hat. Ich weiß nicht mehr genau wo, aber manchmal muss man die ansicht ungültig erklären, dann wird sie neu gezeichnet. Das galt auch für Eingabeelemente, nicht nur für Zeichnungen. Könnte Perl/Tk, Qt oder C# gewesen sein.
 

JCODA

Top Contributor
Noch eine Kleinigkeit:
"Normalerweise" hätte ich einen ActionListener verwendet, mit Java 8 ungefähr so:

Java:
import java.awt.Dimension;
import java.awt.event.ActionEvent;
import javax.swing.JButton;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.JTextField;

public class Zeiger extends JPanel{

    private Anzeige a;
    JTextField grad= new JTextField();
    JTextField fahrenheit=new JTextField();
    public Zeiger(Anzeige z){
        System.out.println("4");
        a=z;
        this.setOpaque(true);
        this.setPreferredSize(new Dimension(300,300)); 
       
        double temperatur= z.holeTemp();
        double fahren=temperatur*1.8+32;     
        grad.setText(temperatur+"");              
        fahrenheit.setText(fahren+"");
              
        JButton button= new JButton("Erhoehen");
        button.addActionListener(e -> erhoehen(e));
        add(new JLabel("Celsius"));
        add(grad);
        add(new JLabel("Fahrenheit"));
        add(fahrenheit);
        add(button);
       
    }
  
    public void erhoehen(ActionEvent e){
        a.erhoehen();
        double temp = a.holeTemp();
        double fahren=temp*1.8+32;
        grad.setText(temp+"");
        fahrenheit.setText(fahren+"");
        System.out.println("2");
       
    }
}

Ggf. möchtest du ja ein Pattern umsetzen, dann ist deine Variante vielleicht die Richtige.

achja, du rufst .pack() auf dem Jframe zuerst auf, und dann fügst du mit .add() Komponentenhinzu. .pack() sollte erst aufgerufen werden, wenn bereits alle Komponenten hinzugefügt werden.
Außerdem könnte es günstig sein, auf dem JFrame f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); aufzurufen, damit sich das Programm beendet, wenn man das Fenster schließt.
 

AndiE

Top Contributor
Ich hatte gelesen, dass Swing bordeigen die AbstractAction mitbringt. Und nun wollte ich das damit mal ausprobieren.
 
Ähnliche Java Themen
  Titel Forum Antworten Datum
Thallius JScrollPane Scrollpos setzen nach Neuzeichnen AWT, Swing, JavaFX & SWT 3
A Swing JFrame neuzeichnen lassen, position neu berechnen lassen? AWT, Swing, JavaFX & SWT 9
M GUI muss updaten und neuzeichnen AWT, Swing, JavaFX & SWT 3
J JavaFX Automatisches Neuzeichnen ("Repaint") abstellen. AWT, Swing, JavaFX & SWT 10
E Swing Neuzeichnen von JPanel AWT, Swing, JavaFX & SWT 4
V automatisches neuzeichnen verhindern AWT, Swing, JavaFX & SWT 3
P problem mit neuzeichnen AWT, Swing, JavaFX & SWT 2
L Beim Neuzeichnen einer Swing GUI kurz Schwarzer Hintergrund AWT, Swing, JavaFX & SWT 8
D Jpanel neuzeichnen AWT, Swing, JavaFX & SWT 5
K AWT Neuzeichnen unterbinden AWT, Swing, JavaFX & SWT 13
N Swing MainWindow(JFrame) aktualisieren(neuzeichnen) repaint AWT, Swing, JavaFX & SWT 4
P Swing JTextArea - beim neuzeichnen bleibt manchmal weißer Kasten AWT, Swing, JavaFX & SWT 10
S Swing JFrame neuzeichnen - bleibt grau AWT, Swing, JavaFX & SWT 18
D jScrollPane - neuzeichnen AWT, Swing, JavaFX & SWT 4
S Probleme beim Neuzeichnen eines JLabels AWT, Swing, JavaFX & SWT 6
R Bestimmte Komponenten vom Neuzeichnen abhalten AWT, Swing, JavaFX & SWT 2
G SWT - Neuzeichnen AWT, Swing, JavaFX & SWT 2
P Zeichnen in Canvas und Neuzeichnen AWT, Swing, JavaFX & SWT 3
J NeuZeichnen eines JXTitledPanels? AWT, Swing, JavaFX & SWT 4
A Komponente entfernen. Kein neuzeichnen nach validate() AWT, Swing, JavaFX & SWT 2
B Swing GUI neuzeichnen AWT, Swing, JavaFX & SWT 5
N Flackern beim neuzeichnen von JPanel AWT, Swing, JavaFX & SWT 19
H neuzeichnen von graphics nach minimierung oder ähnlichem AWT, Swing, JavaFX & SWT 10
W Problem beim neuzeichnen eines Rechteckes (SWT) AWT, Swing, JavaFX & SWT 2
M drawLine() in JPanel hinzufügen ohne Neuzeichnen AWT, Swing, JavaFX & SWT 3
A Null pointer exception beim Neuzeichnen AWT, Swing, JavaFX & SWT 4
R Neuzeichnen eines JFrame mit repaint AWT, Swing, JavaFX & SWT 3
G JScrollPane scrollt nach Neuzeichnen von selber AWT, Swing, JavaFX & SWT 2
S neuzeichnen AWT, Swing, JavaFX & SWT 4
T JLabel neuzeichnen nach überdecken durch andere Fenster AWT, Swing, JavaFX & SWT 5
A Problem beim Neuzeichnen AWT, Swing, JavaFX & SWT 2
S AWT: Panel durch anderes Panel ersetzen. Neuzeichnen-Problem AWT, Swing, JavaFX & SWT 4
J Anklicken der Symbolleiste und Neuzeichnen des Buttons AWT, Swing, JavaFX & SWT 6
M Probleme mit JTable neuzeichnen! AWT, Swing, JavaFX & SWT 2
G JMenuItem & AbstractAction = Problem? AWT, Swing, JavaFX & SWT 2
G Problem mit AbstractAction und Shortcut AWT, Swing, JavaFX & SWT 14
G Verhindern, das AbstractAction Text und Icons überschreibt? AWT, Swing, JavaFX & SWT 3
G AbstractAction und Schriftfarbe AWT, Swing, JavaFX & SWT 6
M AbstractAction, wann benutzen? AWT, Swing, JavaFX & SWT 2
F JPopupMenu und AbstractAction AWT, Swing, JavaFX & SWT 2

Ähnliche Java Themen


Oben