Timer welches JPanel aktualisiert

FGB

Mitglied
Hallo zusammen.

Ich habe ein, wie ich denke, Verständnisproblem bzgl. JPanels/2D-Graphiken und Timern.

Szenario:

Ich habe ein JPanel, welcher dupliziert werden kann. Ich erstelle einfach mehrere Instanzen von dem Panel und adde jene zum JFrame. Damit das ganze nett aussieht, hat der Panel einen FadeIn-Effekt.
Realisiert ist dies durch eine paint()-Methode, die eine 2D-Graphik malt, also mein JPanel. Beim Erzeugen der JPanel-Instanz, starte ich in der JPanel-Klasse einen Timer, der alle 50 Millisekunden den Transparenzwert um 0.1 erhöht, bis er auf 1 ist.

Problem:
Ich möchte n-JPanels im JFrame erstellen können. Erzeugt werden jene später durch Events. Zum Testen habe ich das mit einem Button realisiert. Leider ist es jetzt so, dass sobald ich den Button klicke, der vorher erstellte JPanel verschwindet. Nehme ich die paint-Methode und den Timer aus der JPanel Klasse heraus, funktioniert es.

Jemand eine Idee?

Java:
public class IncomingCallPanel extends javax.swing.JPanel implements ActionListener  {

    private BufferedImage image = null;
    private Graphics2D g2;
    private float f = 0.1f;

    private Timer timer;
    
    @Override
    public void paint(Graphics g) {
        if (this.image == null || this.image.getWidth() != getWidth() || this.image.getHeight() != getHeight()) {
            this.image = (BufferedImage) createImage(getWidth(), getHeight());
        }

        this.g2 = image.createGraphics();
        this.g2.setClip(g.getClip());
        super.paint(this.g2);
        this.g2.dispose();

        this.g2 = (Graphics2D) g.create();
        this.g2.setComposite(AlphaComposite.SrcOver.derive(0.0f));
        this.g2.drawImage(this.image, 0, 0, null);
    }

    /** Creates new form IncomingCallPanel */
    public IncomingCallPanel() {
        initComponents();
        this.timer = new Timer(50, this);
        this.timer.setInitialDelay(100);
        this.timer.start();
    }

    public String getCaller_id() {
        return this.caller_id.getText();
    }

    public String getCaller_nr() {
        return this.caller_nr.getText();
    }

    public void setCaller_id(String id) {
        this.caller_id.setText(id);
    }

    public void setCaller_nr(String nr) {
        this.caller_nr.setText(nr);
    }

    /** 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() {

        caller_id = new javax.swing.JLabel();
        caller_nr = new javax.swing.JLabel();
        call_action1 = new javax.swing.JButton();
        call_action2 = new javax.swing.JButton();

        org.jdesktop.application.ResourceMap resourceMap = org.jdesktop.application.Application.getInstance(asteriskcallmonitor.AsteriskCallMonitorApp.class).getContext().getResourceMap(IncomingCallPanel.class);
        setBackground(resourceMap.getColor("Form.background")); // NOI18N
        setBorder(new javax.swing.border.LineBorder(new java.awt.Color(0, 0, 0), 1, true));
        setName("Form"); // NOI18N
        setPreferredSize(new java.awt.Dimension(255, 75));

        caller_id.setFont(resourceMap.getFont("caller_id.font")); // NOI18N
        caller_id.setText(resourceMap.getString("caller_id.text")); // NOI18N
        caller_id.setName("caller_id"); // NOI18N

        caller_nr.setText(resourceMap.getString("caller_nr.text")); // NOI18N
        caller_nr.setName("caller_nr"); // NOI18N

        call_action1.setText(resourceMap.getString("call_action1.text")); // NOI18N
        call_action1.setName("call_action1"); // NOI18N

        call_action2.setText(resourceMap.getString("call_action2.text")); // NOI18N
        call_action2.setName("call_action2"); // NOI18N

        javax.swing.GroupLayout layout = new javax.swing.GroupLayout(this);
        this.setLayout(layout);
        layout.setHorizontalGroup(
            layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
            .addGroup(javax.swing.GroupLayout.Alignment.TRAILING, layout.createSequentialGroup()
                .addGap(34, 34, 34)
                .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.TRAILING)
                    .addGroup(layout.createSequentialGroup()
                        .addComponent(caller_nr)
                        .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED, 89, Short.MAX_VALUE)
                        .addComponent(call_action2, javax.swing.GroupLayout.PREFERRED_SIZE, 27, javax.swing.GroupLayout.PREFERRED_SIZE))
                    .addGroup(layout.createSequentialGroup()
                        .addComponent(caller_id)
                        .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED, 42, Short.MAX_VALUE)
                        .addComponent(call_action1, javax.swing.GroupLayout.PREFERRED_SIZE, 27, javax.swing.GroupLayout.PREFERRED_SIZE)))
                .addContainerGap())
        );
        layout.setVerticalGroup(
            layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
            .addGroup(layout.createSequentialGroup()
                .addContainerGap()
                .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE)
                    .addComponent(call_action1)
                    .addComponent(caller_id))
                .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
                .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
                    .addComponent(call_action2)
                    .addComponent(caller_nr))
                .addContainerGap(javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE))
        );
    }// </editor-fold>
    // Variables declaration - do not modify
    private javax.swing.JButton call_action1;
    private javax.swing.JButton call_action2;
    private javax.swing.JLabel caller_id;
    private javax.swing.JLabel caller_nr;
    // End of variables declaration

    public void actionPerformed(ActionEvent e) {
        
        this.f += 0.1f;

        if (this.f >= 1.0f)
            this.f = 1.0f;

        // draw next alpha step
        this.g2.setComposite(AlphaComposite.SrcOver.derive(f));
        this.g2.drawImage(this.image, 0, 0, null);
        repaint();
        
        // if Alpha >= 1, stop and free timer
        if (this.f >= 1.0f) {
            this.timer.stop();
            this.timer = null;
        }
            
        
    }
}
[/JAvA]

Dank euch :)

Felix
 
S

SlaterB

Gast
Zeile 4 solltest du streichen, kein Graphics-Objekt längerfristig speichern, der Timer ruft doch eh repaint() auf,
in der paint-Methode sollte alles ausreichend gemalt werden

ansonsten darf man nicht unbedingt erwarten, dass du ein vollständigeres Programm postest, ohne das eklige GroupLayout,
welches unter Java 1.6 nicht funktioniert, und mit allem inklusive main-Methode die automatisch mehrere Panel setzt usw?
Sahnehäubchen wäre noch das Bild dazu als Anhang oder auf Bild verzichten und nur ein Dreieck malen, falls das auch geht
 
Zuletzt bearbeitet von einem Moderator:

FGB

Mitglied
Schon einmal vielen Dank!

Zu "Zeile 4 weglassen".
Ich dachte ich muss "setComposite(AlphaComposite.SrcOver.derive(f));" auf meiner Graphik ausführen. Deswegen hatte ich die Graphik als Instanz-Objekt realisiert.

Ein Beispiel gibt es heute Abend. Habe gerade keinen Zugriff auf mein Projekt.

Danke und Grüße
Felix
 
S

SlaterB

Gast
zeile 4 solltest du streichen, kein graphics-objekt längerfristig speichern, der timer ruft doch eh repaint() auf,
in der paint-methode sollte alles ausreichend gemalt werden
->
zu "zeile 4 weglassen".
Ich dachte ich muss "setcomposite(alphacomposite.srcover.derive(f));" auf meiner graphik ausführen. Deswegen hatte ich die graphik als instanz-objekt realisiert.
->
zeile 4 solltest du streichen, kein graphics-objekt längerfristig speichern, der timer ruft doch eh repaint() auf,
in der paint-methode sollte alles ausreichend gemalt werden
?!
 

FGB

Mitglied
So, habe es probiert. Funktioniert jetzt. Ich musste es nur minimal anders machen, als du es mir gesagt hattest.

Der Timer ruft irgendwie unregelmäßig die repaint() Methode auf. Deswegen steht jetzt in m einer actionPerformed Methode:

Java:
    public void actionPerformed(ActionEvent e) {

        repaint();     
        
    }

Sobald ich Alpha == 1.0f erreicht habe, stoppt der Timer.

Ist noch ein Screenshot + ausführbares Javaprogramm erwünscht?
 
S

SlaterB

Gast
wenns funktioniert, dann bloß nicht ;)

nur repaint() im Timer ist allerdings bedenklich, wird dann in der paint-Methode das f berechnet?
bedenke dass beliebig auf neu gezeichnet werden kann, etwa bei Größenänderungen,
diese zeitabhängige Logik sollte in den Timer, die paint-Methode zeichnet einfach nur den aktuellen Stand, ganz egal wie oft und von wem aufgerufen
 
Ähnliche Java Themen
  Titel Forum Antworten Datum
E JDialog mit count down timer AWT, Swing, JavaFX & SWT 1
M 2D-Grafik timer bei Analoguhr AWT, Swing, JavaFX & SWT 2
A Timer AWT, Swing, JavaFX & SWT 1
H Timer ohne alles lahmzulegen? AWT, Swing, JavaFX & SWT 2
O Timer in JOptionPane anzeigen AWT, Swing, JavaFX & SWT 2
ralfb1105 Swing Timer in SwingWorker stoppen AWT, Swing, JavaFX & SWT 4
T Timer und GIF Animationen pausieren während Maus sich bewegt AWT, Swing, JavaFX & SWT 4
W Swing JLabel jede Sekunde aktualisieren, ohne Timer zu benutzen AWT, Swing, JavaFX & SWT 4
D Timer für Bildfolge in einem jLabel AWT, Swing, JavaFX & SWT 5
M Event Handling MousePressed vs. Timer! AWT, Swing, JavaFX & SWT 5
F Java Timer Bug? AWT, Swing, JavaFX & SWT 6
B Timer, TimerTask und Warten AWT, Swing, JavaFX & SWT 4
R Performance Drag and Drop & Timer AWT, Swing, JavaFX & SWT 3
E Problem mit Timer und Swing AWT, Swing, JavaFX & SWT 8
N AWT Timer überschreiben? AWT, Swing, JavaFX & SWT 8
P Label rotieren mit Timer AWT, Swing, JavaFX & SWT 5
F Swing GUI und Model mit Timer AWT, Swing, JavaFX & SWT 13
K Threads - Timer - run() mehrfach parallel? AWT, Swing, JavaFX & SWT 2
J Nach Timer ausführen AWT, Swing, JavaFX & SWT 6
S Timer oder Thread.sleep AWT, Swing, JavaFX & SWT 3
D Timer JFrame AWT, Swing, JavaFX & SWT 7
F Swing timer nimmt delay nicht an AWT, Swing, JavaFX & SWT 2
S Swing Timer, Countdown AWT, Swing, JavaFX & SWT 2
H Timer/Stoppuhr in MenuBar anzeigen AWT, Swing, JavaFX & SWT 4
D Applet Methode in Timer einbinden AWT, Swing, JavaFX & SWT 6
F Applet Applet starten...(+Timer?) AWT, Swing, JavaFX & SWT 12
R Probleme mit Swing Timer AWT, Swing, JavaFX & SWT 6
C Timer Problem AWT, Swing, JavaFX & SWT 5
VfL_Freak Swing kann ich einen laufenden Timer mitten in der Ausführung abbrechen? AWT, Swing, JavaFX & SWT 6
H Swing Timer Probleme AWT, Swing, JavaFX & SWT 5
Burny91 Swing Mit Timer JLabel updaten AWT, Swing, JavaFX & SWT 2
P Game of Life - PaintComponent-Problem / Timer? AWT, Swing, JavaFX & SWT 8
B JLabel mittels Timer und setLocation verschieben AWT, Swing, JavaFX & SWT 3
O Swing es können keine neuen Labels hinzufügt werden während der Timer läuft AWT, Swing, JavaFX & SWT 14
C Timer erstellen? AWT, Swing, JavaFX & SWT 2
E AWT Problem mit Repaint (in Loop oder Timer) AWT, Swing, JavaFX & SWT 3
K Timer und Threads ruckeln für Fotoschwenk AWT, Swing, JavaFX & SWT 3
L Timer Swing GUI AWT, Swing, JavaFX & SWT 2
G Swing Timer stoppen AWT, Swing, JavaFX & SWT 4
B Swing-Timer AWT, Swing, JavaFX & SWT 4
D javax.swing.Timer bringt NullPointerException AWT, Swing, JavaFX & SWT 4
J Swing timer? AWT, Swing, JavaFX & SWT 2
C Timer, Darstellung einer Uhr AWT, Swing, JavaFX & SWT 4
Z javax.swing.Timer: wie stoppen??? AWT, Swing, JavaFX & SWT 9
berserkerdq2 Wie greife ich auf ein Element zu, welches ich beim Scenebuilder erstellt habe AWT, Swing, JavaFX & SWT 10
S Welches Java Layout sollte ich verwenden? AWT, Swing, JavaFX & SWT 3
P Bewegung eines Balkens in eineum JPanel welches als Spielfeld fungiert AWT, Swing, JavaFX & SWT 2
K Fenster welches den Sieger anzeigt AWT, Swing, JavaFX & SWT 5
ImperatorMing JavaFX Übersicht - Welches Element kann welches Erreignis AWT, Swing, JavaFX & SWT 3
Thallius Wer oder was bestimmt welches Frame toFront kommt wenn ein anderes geschlossen wird? AWT, Swing, JavaFX & SWT 8
Soloeco LayoutManager Wie und welches Layout nutze ich am Besten? AWT, Swing, JavaFX & SWT 13
M Java FX Welches Accordion Tilded Pane geöffnet? AWT, Swing, JavaFX & SWT 4
B Hilfe welches Layout brauch ich AWT, Swing, JavaFX & SWT 4
M Welches Pattern bei GUI Anwendungen? AWT, Swing, JavaFX & SWT 2
S Größe von Panel verändern welches auf anderem Panel sitzt AWT, Swing, JavaFX & SWT 10
F Welches GUI Plugin bzw. IDE für schnelle und gute Lösungen AWT, Swing, JavaFX & SWT 7
K 2D-Grafik BufferedImage eingelesen, welches Modell?! AWT, Swing, JavaFX & SWT 2
C [GUI] Welches GUI? AWT, Swing, JavaFX & SWT 28
G LayoutManager Layout welches von Links nach rechts anordnet mit TOP Alignment! AWT, Swing, JavaFX & SWT 5
C GUI Entwicklung - welches Pattern? AWT, Swing, JavaFX & SWT 16
E Layout, aber welches? AWT, Swing, JavaFX & SWT 8
N Bilder aus Infos generieren lassen. Welches Framework? AWT, Swing, JavaFX & SWT 8
L Welches Layout? AWT, Swing, JavaFX & SWT 6
S Welches Event beim ändern einer Zelle in einer JTable AWT, Swing, JavaFX & SWT 4
S Welches Event beim auswählen einer Zelle? [JTable] AWT, Swing, JavaFX & SWT 3
GilbertGrape Wie Panel anordnen? Welches Layout? AWT, Swing, JavaFX & SWT 7
J welches Layout? AWT, Swing, JavaFX & SWT 8
A welches programm? AWT, Swing, JavaFX & SWT 17
D Welches Layout für prozentuale Aufteilung: 20% - 60 % - 20% AWT, Swing, JavaFX & SWT 3
G welches Layout sollte ich benutzen? AWT, Swing, JavaFX & SWT 2
D Wie viele Pixel welches Icon? AWT, Swing, JavaFX & SWT 4
D Welches Layout? AWT, Swing, JavaFX & SWT 2
K welches package muss ich angeben um GUIs zu erstellen? AWT, Swing, JavaFX & SWT 5
D JPanel, welches sich per Button vergrößert(in GridBagLayout) AWT, Swing, JavaFX & SWT 2
A Herausfinden welches Document gesetzt ist AWT, Swing, JavaFX & SWT 4
G Welches L&F gesetzt? AWT, Swing, JavaFX & SWT 12
T mousemoved abfrage - aber welches event wenn maus weg? AWT, Swing, JavaFX & SWT 2
lin Welches Objekt für einen About-Dialog verwenden? AWT, Swing, JavaFX & SWT 2
V Welches Event wird von einer JTabbedPane gefeuert? AWT, Swing, JavaFX & SWT 2
B 3 Zeilen die unterschiedlich gross sind -->Welches Layout AWT, Swing, JavaFX & SWT 3
R Welches Layout? AWT, Swing, JavaFX & SWT 4
W welches Layout? AWT, Swing, JavaFX & SWT 3
C Welches Toolkit für GUI AWT, Swing, JavaFX & SWT 2
O Welches Layout ? AWT, Swing, JavaFX & SWT 5
P Zwei JPanel übereianderlegen AWT, Swing, JavaFX & SWT 14
XWing Basic JPanel mit 2 Buttons beutzen. AWT, Swing, JavaFX & SWT 10
G JPanel per Drag and Drop JButtons und Bilder ablegen AWT, Swing, JavaFX & SWT 1
G JPanel mit JButtons und Bilder AWT, Swing, JavaFX & SWT 5
N AWT JPanel zu Jframe hinzufügen AWT, Swing, JavaFX & SWT 2
M clear JPanel before repainting AWT, Swing, JavaFX & SWT 1
B ImageIcon auf JPanel austauschen AWT, Swing, JavaFX & SWT 3
T Swing Reload JPanel + darin liegende ProgressBar AWT, Swing, JavaFX & SWT 9
P Swing Mehrere JLabels mit ImageIcon in JPanel lesen AWT, Swing, JavaFX & SWT 1
E JScrollPane mit JPanel verbinden AWT, Swing, JavaFX & SWT 1
F JPanel Celleditor AWT, Swing, JavaFX & SWT 8
B JPanel-Inhalte inkl. JTextarea zoomen? AWT, Swing, JavaFX & SWT 3
B Mit ContentPane werden Komponenten angezeigt, mit SplitPane, JPanel nicht? AWT, Swing, JavaFX & SWT 6
CptK Funktionsgraphen effizient zeichnen und nur Teile von JPanel erneuern AWT, Swing, JavaFX & SWT 2
P Button simpler random auf einem JPanel verteilen? AWT, Swing, JavaFX & SWT 3
O Swing "Eigenes" JPanel wird dem JScrollPane nicht hinzugefügt AWT, Swing, JavaFX & SWT 5

Ähnliche Java Themen


Oben