2015-01-09 2 views
5

Ich habe gerade angefangen, Java Swing zu lernen, und ich habe versucht, ein einfaches Spiel zu erstellen. Das Spiel ist Minesweeper ähnlich. Ein Fenster mit einer Matrix von Bottons mit nur 1 Mine. Wenn du auf eine Schaltfläche klickst, wenn es keine Mine ist, deaktiviere ich die Schaltfläche und zeige grüne Farbe an, und wenn es eine Mine ist, deaktiviere ich die Schaltfläche und zeige rote Farbe an. Ich habe die Farbe angezeigt, indem ich den Hintergrund der Schaltfläche auf die gewünschte Farbe eingestellt habe. Ich habe die Implementierung bisher gut gemacht. Als nächstes habe ich eine Reset-Taste hinzugefügt, auf die ich alle Tasten mit dem folgenden Befehl renable: setEnabled (true).Nicht möglich, eine Schaltfläche zu aktivieren, nachdem es in Java Swing deaktiviert ist

Aus irgendeinem Grund wird die Schaltfläche nicht aktiviert. Ich habe bestätigt, dass der Programmfluss den Code zum Aktivieren der Schaltfläche erreicht, aber ich kann den Grund nicht finden, warum es nicht funktioniert.

Hier ist ein Testprogramm, das ich mit einer Reset-Taste und 1 Taste geschrieben habe. Gleicher Fehler. Kann jemand darauf hinweisen, was ich vielleicht falsch mache?

import java.awt.BorderLayout; 
import java.awt.Color; 
import java.awt.Container; 
import java.awt.event.ActionEvent; 
import java.awt.event.ActionListener; 

import javax.swing.JButton; 
import javax.swing.JFrame; 


public class Test implements ActionListener{ 

    JFrame frame = new JFrame("Mine"); 
    JButton buttons = new JButton(); 
    JButton reset = new JButton("Reset"); 
    Container grid = new Container(); 

    public Test(){ 

     frame.setSize(400, 400); 
     frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
     frame.setVisible(true); 

     frame.setLayout(new BorderLayout()); 
     frame.add(reset, BorderLayout.NORTH); 
     reset.addActionListener(this); 

     buttons = new JButton(); 
     buttons.addActionListener(this);  

     frame.add(buttons, BorderLayout.CENTER); 
    } 

    public static void main(String[] args){ 

     new Test(); 
    } 

    @Override 
    public void actionPerformed(ActionEvent event) { 

     if(event.getSource().equals(reset)) 
      buttons.setEnabled(true); 

     else{ 
      if(event.getSource()==buttons){ 
       buttons.setBackground(Color.RED); 
       buttons.setEnabled(false); 
      } 

     } 

    } 
} 
+1

Nur ein Rat: Sie sollten Ihren Rahmen sichtbar machen * nach * Hinzufügen alle Komponenten zu sein Inhaltsbereich. Anstatt die Framegröße explizit festzulegen, rufen Sie die Methode 'pack()' auf, bevor Sie sie sichtbar machen. – dic19

+3

Es wird aktiviert. Sie setzen die Hintergrundfarbe nie zurück. – kiheru

Antwort

8

Eigentlich ist es aktiviert wurden, wenn Sie zurücksetzen klicken, wird alles, was Sie zu tun vergessen, war die Farbe zurück:

@Override 
public void actionPerformed(ActionEvent event) { 

    if(event.getSource().equals(reset)){ 
     buttons.setEnabled(true); 
     buttons.setBackground(null); 
    }else{ 
     if(event.getSource()==buttons){ 
      System.out.println("xxx"); 
      buttons.setBackground(Color.RED); 
      buttons.setEnabled(false); 
     } 

    } 

} 
+0

Ja, das war genau mein Problem. Danke vielmals. Es funktioniert jetzt gut. –

+0

Bitte überprüfen Sie die Antwort als akzeptiert. –

Verwandte Themen