Ereignis nach einer gewissen Zeit

comiplo

Mitglied
Hallo

Ich weiß, diese Frage ist bekannt und auch Google spuckt ne Menge aus, aber ich weiß nicht genau wie ich es einsetzen muss.

Mein Ziel ist es, dass Java einen Anweisungsblock, nach ein paar Sekunden ausführt.

Eine Idee hatte ich schon:
Java:
package rahmen1;

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

public class Fenster1
{
  public static void main(String[] args)
  {
    JFrame Rahmen = new JFrame();
    Rahmen.setSize (400,300);
    Rahmen.setDefaultCloseOperation (JFrame.EXIT_ON_CLOSE);
    JPanel Platte = new JPanel ();
    JButton Knopf1 = new JButton ("klick");
    
    
    Knopf1.addActionListener (new ActionListener()
    {
    	public void actionPerformed (ActionEvent x)
    	{
    		
    	}
    });
    int zeitdauer = 20000;
    long maxTime = System.currentTimeMillis() + zeitdauer ;

    while ( System.currentTimeMillis() < maxTime)
    {
    }
    Platte.add (Knopf1);
    Rahmen.setContentPane (Platte);
    Rahmen.setVisible (true);
    
  }
}

Nur leider öffnet der Code den JFrame erst nach 20 Sekunden. Ich wollte aber, dass der JButton Knopf1 nach 20 Sekunden angezeigt wird ...

Ich habe über Google erfahren, dass dies mit Timer und TimerTask möglich ist. Aber wie genau wende ich diese Befehle an??

MfG,
comiplo
 
Hallo
Erstmal danke für die schnelle Antwort ...

Das war eben genau eines dieser Beispiele, wo ich nicht weiß was "timer.schedule( new Task(), 2000 );" genau bewirkt. Verzögert das nun einfach den Ablauf des Programms um 2 Sekunden, oder was?

MfG
comiplo
 
Nein, es startet einen Thread, der selbst 2 Sekunden parallel zum eigendlichen Programm wartend "abläuft" und danach die Run der Runnable des TimerTask der Task.
 
Hallo

Welchen Inhalt muss denn TimerTask haben?
Derzeitiger Code (ohne TimerTask ...)

Java:
package rahmen1;

import java.awt.event.*;
import javax.swing.*;
import java.util.Timer;
import java.util.TimerTask;

public class Fenster1
{
	class Task extends TimerTask 
	{ 
	  @Override public void run() 
	  { 
	    Platte.add (Knopf1);
	  } 
	}
	
  public static void main(String[] args)
  {
    JFrame Rahmen = new JFrame();
    Rahmen.setSize (400,300);
    Rahmen.setDefaultCloseOperation (JFrame.EXIT_ON_CLOSE);
    JPanel Platte = new JPanel ();
    JButton Knopf1 = new JButton ("klick");
    Rahmen.setContentPane (Platte);
    Rahmen.setVisible (true);
    
    Timer timer = new Timer(); 
    
    // Start in 2 seconds 
    timer.schedule( new Task(), 2000 ); 
    
    Knopf1.addActionListener (new ActionListener()
    {
    	public void actionPerformed (ActionEvent x)
    	{
    		
    	}
    });
    
    
    
    
  }
}
Fehlermeldung:

Exception in thread "main" java.lang.Error: Unresolved compilation problem:
No enclosing instance of type Fenster1 is accessible. Must qualify the allocation with an enclosing instance of type Fenster1 (e.g. x.new A() where x is an instance of Fenster1).

at rahmen1.Fenster1.main(Fenster1.java:31)


MfG,
comiplo
 
Mhm wenn ich das richtig sehe, möchtest du nach der Wartezeit nur Änderungen an deiner GUI vornehmen (Komponenten hinzufügen, irgendwas sichtbar machen etc.), das sollte allerdings vom EDT ausgeführt werden, daher wäre mein Vorschlag direkt den Swing-Timer zu benutzen. Ich würde evlt. den Button auch schon direkt vorher hinzufügen aber nicht sichtbar machen, nach Ablauf dann einfach nur setVisible aufrufen.

Irgendwie so vllt.:
Java:
package rahmen1;

import java.awt.event.*;

import javax.swing.*;

public class Fenster1 {
	public static void main(String[] args) {
		SwingUtilities.invokeLater(new Runnable() {
			public void run() {
				JFrame rahmen = new JFrame();
				rahmen.setSize(400, 300);
				rahmen.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
				JPanel platte = new JPanel();
				final JButton knopf1 = new JButton("klick");
				knopf1.addActionListener(new ActionListener() {
					public void actionPerformed(ActionEvent x) {

					}
				});
				knopf1.setVisible(false);
				platte.add(knopf1);
				rahmen.setContentPane(platte);
				rahmen.setVisible(true);
				Timer t = new Timer(0, new ActionListener() {
					@Override
					public void actionPerformed(ActionEvent e) {
						knopf1.setVisible(true);
					}
				});
				t.setRepeats(false);
				t.setInitialDelay(20000);
				t.start();
			}
		});
	}
}
 
Hallo eRaaaa,

Danke, das war genau was ich gesucht habe. Auf setVisible() bin ich irgendwie nicht gekommen ^^

Anbei noch eine Frage:
Wenn ich nun will, dass der JButton erst erscheint und dann wieder verschwindet, was muss ich an diesem Code ändern??

Java:
package rahmen1;
 
import java.awt.event.*;
 
import javax.swing.*;
 
public class Fenster1 {
    public static void main(String[] args) {
        SwingUtilities.invokeLater(new Runnable() {
            public void run() {
                JFrame rahmen = new JFrame();
                rahmen.setSize(400, 300);
                rahmen.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
                JPanel platte = new JPanel();
                final JButton knopf1 = new JButton("klick");
                knopf1.addActionListener(new ActionListener() {
                    public void actionPerformed(ActionEvent x) {
 
                    }
                });
                knopf1.setVisible(false);
                platte.add(knopf1);
                rahmen.setContentPane(platte);
                rahmen.setVisible(true);
                Timer t = new Timer(0, new ActionListener() {
                    @Override
                    public void actionPerformed(ActionEvent e) {
                        knopf1.setVisible(true);
                    }
                });
                t.setRepeats(false);
                t.setInitialDelay(8000);
                t.start();
                
                Timer tt = new Timer(0, new ActionListener() {
                    @Override
                    public void actionPerformed(ActionEvent x) {
                        knopf1.setVisible(false);
                    }
                });
                tt.setRepeats(false);
                tt.setInitialDelay(8000);
                tt.start();
                
            }
        });
    }
}

MfG,
comiplo
 

Zurück
Oben