2014-12-11 6 views
0

Я делаю игру с реакцией времени, когда кнопка станет зеленой, и вы должны ударить ее как можно быстрее, но кнопка не изменит цвета. Может кто-нибудь сказать мне, почему это происходит? Кроме того, как я могу заставить свою программу ждать до случайного времени (метод ниже), а затем изменить цвет? Я попытался использовать Thread.sleep, но не смог заставить его функционировать должным образом.Цвет JButton не изменится

mport java.awt.Color; 
import java.util.Random; 
import java.awt.Dimension; 
import java.awt.FlowLayout; 
import java.awt.Font; 
import java.awt.event.ActionEvent; 
import java.awt.event.ActionListener; 
import java.text.DecimalFormat; 

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

public class Game extends JFrame implements ActionListener { 

    double start = System.nanoTime(); 
    double end; 
    String startTime = String.valueOf(start); 
    String endTime = String.valueOf(end); 

    private JTextField displayTime = new JTextField(15); 
    private JButton stopButton = new JButton("STOP"); 
    DecimalFormat deci = new DecimalFormat(); 
    Font f = new Font("ARIAL", Font.BOLD, 25); 

    public Game() { 
     setDefaultCloseOperation(EXIT_ON_CLOSE); 
     setLayout(new FlowLayout()); 

     deci.setMaximumFractionDigits(4); 
     deci.setMinimumFractionDigits(1); 


     stopButton.addActionListener(this); 
     stopButton.setPreferredSize(new Dimension(250, 250)); 
     stopButton.setFont(f); 
     stopButton.setBackground(Color.red); 

     add(displayTime); 
     add(stopButton); 

     pack(); 
     setVisible(true); 

     waitRandom(); 
    } 

    public void actionPerformed(ActionEvent e) { 
     if (e.getSource() == stopButton) { 
      end = System.nanoTime(); 
      double time = end - start; 
      double seconds = time/Math.pow(10, 9); 
      String finalTime = String.valueOf(deci.format(seconds)); 
      displayTime.setFont(f); 
      displayTime.setAlignmentX(LEFT_ALIGNMENT); 
      displayTime.setText(finalTime + " sec."); 

     } 
    } 

    public void waitRandom() { 

     Random random = new Random(); 
     int randomNumber = random.nextInt(10); 
     int randomTime = randomNumber * 100; 

     stopButton.setBackground(Color.green); 
     stopButton.setOpaque(true); 
     System.out.println(randomTime); 

    } 

} 
+0

Работает ли 'Println()' заявление? – APerson

+0

Я не вижу здесь никакого ожидающего кода. – immibis

+0

@APerson Да, это так, я просто должен был подтвердить, что номер действительно случайный. Я использовал это в методе Thread.sleep(), чтобы сделать время, когда вам нужно щелкнуть кнопку случайным образом. –

ответ

-1

Я думаю, проблема в этом: e.getSource() == stopButton. Вы должны использовать .equals()

+1

. Вопрос о том, почему кнопка не изменит цвет; хотя у вас возникла ошибка в обработчике событий для кнопки, она (скорее всего) не связана с ошибкой в ​​вопросе. – APerson

0

Выполнение всех настроек пользовательского интерфейса в конструкторе является изворотливым и подверженным ошибкам, но я собираюсь предположить, что реальная проблема заключается в том, что вы не позволяете пользовательскому интерфейсу настраивать, отображать и отображать в потоке отправки событий, затем ожидание в другом потоке, а затем изменение цвета в потоке отправки событий. Вы не даете нам main(), и вы не говорите нам, что на самом деле происходит, поэтому трудно сказать.

+0

Где я должен настраивать свой интерфейс? Я хочу исправить любые плохие методы программирования, которые я делаю сейчас, прежде чем я привык к этому. Кроме того, основным методом является просто вызов 'new Game()' –

+0

. Любые изменения пользовательского интерфейса должны быть сделаны в потоке отправки событий (EDT); методы SwingUtilities.invokeNow() и.invokeLater() полезны. Вы можете попробовать вызвать новую Game() в invokeNow(), затем ждать случайного времени, а затем с помощью invokeNow изменить цвет кнопки. Ваш метод main() НЕ находится на EDT, а invokeNow() будет принимать код и выполнять его на EDT для вас. – arcy

+0

Я до сих пор ничего не узнал о потоках, где я могу прочитать их, чтобы ваш ответ имел больше смысла для меня? –

1

Проблема в том, что «выглядит» как фон кнопок, нет. Это кнопки «содержание», если добавить

stopButton.setContentAreaFilled(false); 

к вашему методу waitRandom, вы увидите ...

enter image description here

+0

Я пробовал его код в покое, и это зеленый вопрос, в чем вопрос, пожалуйста, объясните. Я добавил серийный номер, который он есть, и он отлично работает –

+0

@SolomonPByer В зависимости от вида и ощущения, которое вы используете, Swing может игнорировать свойство цвета «background» кнопки и «скин», это содержимое, которое оно считает нужным, что означает, что кнопка не изменит цвет. Попробуйте использовать внешний вид системы (например, Windows) – MadProgrammer

0

Решение Вашего непосредственного вопроса, чтобы добавить несколько строк кода до конца вашего if блока тела в actionPerformed():

  stopButton.setBackground(Color.red); 
      paint(getGraphics()); 
      try { 
       Thread.sleep(new Random().nextInt(10) * 100); 
      } catch (InterruptedException x) { 
       x.printStackTrace(); 
      } 
      stopButton.setBackground(Color.green); 

Теперь вы можете удалить свой метод waitRandom() и его вызов от конструктора. Наконец, измените исходный цвет, как установлено в конструкторе, на зеленый, а не красный.

Примечание вызов Thread.sleep() здесь нет-нет; вместо этого вы захотите использовать javax.swing.Timer. Это просто, чтобы вы пошли в правильном направлении.

Вам еще предстоит выяснить, как это сделать, но, надеюсь, вас это устроит.

-1

Попробуйте это братан :)

buttonName.setUI((ButtonUI) BasicButtonUI.createUI(buttonName)); 
buttonName.setBackground(Color.CYAN); 
Смежные вопросы