JButton soll für bestimmte Zeit verschwinden

Abend zusammen 🙂
Nachdem ich nach meinem ersten Thread so eine tolle Hilfe bekommen habe, dachte ich, dass ich es nochmal versuche und nun für ein anderes Problem um Hilfe bitte.
Ich programmiere für mein Abi ein Spiel, genauer gesagt Whack-a-Mole.
Nun habe ich lauter JButtons erstellt, mit kleinen Maulwürfen darauf und ich versuche, dass die JButtons (BMole) für etwa 3 Sekunden verschwinden, nachdem ich sie betätigt habe.
Bis jetzt habe ich nur hinbekommen, dass die Buttons inaktiv werden aber nicht ganz verschwinden. Dies war aber nicht die Lösung die ich wollte.
Leider steh ich nun total auf dem Schlauch und habe auch keinen Lösungsansatz.
Kann mit da jemand helfen? Auf jeglichen Suchmaschinen habe ich leider nichts gefunden.
Anbei findet ihr mein bisher geschriebenes Spiel. (gekürtzt)
Code:
public class Startklasse implements ActionListener {
ImageIcon Digda = new ImageIcon("img/Digdaj.png");

    JButton BMole;

    JFrame f;
    JFrame gf;
    JFrame gf1;
  
    JPanel p;
    JPanel p1;
    JPanel p2;
    JPanel p3;
    JLabel b;

  
    public static void main(String[] args) {
        (new Startklasse()).go();
    }

    private void go() {
      
        f=new JFrame();
        f.setSize(850,670);
        f.setLayout(null);
        f.setTitle("Whack a Mole");
        f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
      
        p= new JPanel();
        JLabel backImagePanel = new JLabel(new ImageIcon("C:\\Users\\User1\\Pictures\\Whack a mole titelbild.jpg"));
        p.setBounds(0, 0, 850, 670);
        p.add(backImagePanel);
        f.add(p);
      
        gf=new JFrame();
        gf.setSize(850,670);
        gf.setLayout(null);
        gf.setTitle("Whack a Mole - Start Game");
        gf.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
      
        p1= new JPanel();
        backImagePanel = new JLabel(new ImageIcon("C:\\Users\\User1\\Pictures\\Spielfeld Whack a mole.jpg"));
        p1.setBounds(0, 0, 850, 670);
        p1.add(backImagePanel);
        gf.add(p1);
     
        gf1=new JFrame ();
        gf1.setSize(510,500);
        gf1.setLayout(null);
        gf1.setTitle("Whack a Mole - Highscorelist");
        gf1.dispose();
      
        p2= new JPanel();
        backImagePanel = new JLabel(new ImageIcon("C:\\Users\\User1\\Pictures\\Highscoreliste Bild Whack a Mole.jpg"));
        p2.setBounds(0, 0, 510, 500);
        p2.add(backImagePanel);
        gf1.add(p2);

        BMole= new JButton();
        BMole.setBounds(105,230,120,120);
        BMole.setIcon(Digda);
        BMole.addActionListener(this);
        BMole.setText("Bmolex");
        gf.add(BMole);
   
        f.setVisible(true);
      
      
      
    }

  
    public void actionPerformed(ActionEvent e) {
  
        String cmd4 = e.getActionCommand();
        if(cmd4 == "Bmolex"){
        BMole.setVisible(false);
        }
    }
}
 
Hey,
probier mal das hier aus 🙂
Java:
    button.addActionListener(e -> {
      long time = System.currentTimeMillis();
      button.setVisible(false);
      button.repaint();
      button.validate();

      Thread t = new Thread(new Runnable() {

        @Override
        public void run() {
          while (true) {
            if (System.currentTimeMillis() > (time + 3000)) {
              button.setVisible(true);
              button.repaint();
              button.validate();
              break;
            }
          }
        }
      });
      t.start();
    });
sieht zwar nicht schön aus, funktioniert aber 😀
Ich versuch mal das ganze zu erklähren:

1.) System.currentTimeMillis() -> liefert die aktuelle Zeit in Millisekunden.
2.) Ein Thread ist etwas, das parallel zum Rest des Programms läuft.
3.) Mit der if-abfrage im Thread prüfe ich ob die 3 Sekunden um sind.
4.) Wenn ja mach den Knopf wieder sichtbar und verlasse die Schleife (damit der Thread zuende geht), wenn nein, warte einfach weiter 😀
5.) repaint und validate sorgt dafür, dass dder Button refreshed wird.
 
Zuletzt bearbeitet:
Java:
button.addActionListener(e -> {
      button.setVisible(false);
      button.repaint();
      button.validate();

      Thread t = new Thread(new Runnable() {

        @Override
        public void run() {
          try {
            Thread.currentThread().sleep(3000);
          } catch (InterruptedException e) {
            e.printStackTrace();
          }
          button.setVisible(true);
          button.repaint();
          button.validate();
        }
      });
      t.start();
    });
Das hier dürfte auch gehen 😀 ist aber auch nicht viel anders 😀
 
Ordentlich programmiert man das mit einem ScheduledExecutorService oder im Falle Swing mit einem Timer - da er mit EDT.invokeLater arbeitet.
Java:
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.SwingUtilities;
import javax.swing.Timer;

public class Test {
  public static void main(String... args) {
    SwingUtilities.invokeLater(Test::new);
  }
  
  private Timer timer;
  
  public Test() {
    JFrame frame = new JFrame("Enabling Button");
    frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    frame.setLocationByPlatform(true);
    
    JPanel mainPanel = new JPanel();
    
    JLabel randomNumberLbl = new JLabel(Double.toString(Math.random()));
    
    JButton disablingBtn = new JButton("Disable Button");
    JButton showRandomButton = new JButton("Show random");
    showRandomButton.addActionListener(e -> randomNumberLbl.setText(Double.toString(Math.random())));
    disablingBtn.addActionListener(e -> {
      if (timer != null) {
        timer.restart();
      } else {
        showRandomButton.setEnabled(false);
        timer = new Timer(3000, te -> {
          showRandomButton.setEnabled(true);
          timer = null;
        });
        timer.setRepeats(false);
        timer.start();
      }
    });
    
    mainPanel.add(disablingBtn);
    mainPanel.add(showRandomButton);
    mainPanel.add(randomNumberLbl);
    
    frame.add(mainPanel);
    
    frame.pack();
    frame.setVisible(true);
  }
}
 

Zurück
Oben