2014-02-04 6 views
0

Я делаю простой апплет Java, который отображает светофор. Если клавиши не нажаты, фон будет белым. Если вы нажмете клавиши «1», «2» или «3» на цифровой клавиатуре, тогда светофор должен с уважением относиться к цветам: красный, зеленый и желтый. Он не работает, потому что, когда я нажимаю клавиши, ничего не происходит. все isX-булевы инициализируются значением false, за исключением isReleased.Покраска изображения при нажатии клавиши

@Override 
public void keyPressed(KeyEvent e) { 
isReleased = false; 
switch(e.getKeyCode()){ 
    case KeyEvent.VK_NUMPAD1: 
     isRed=true; 
     break; 
    case KeyEvent.VK_NUMPAD2: 
     isGreen=true; 
     break; 
    } 

} 

@Override 
public void keyReleased(KeyEvent e) { 
isReleased = true; 
} 

@Override 
public void keyTyped(KeyEvent e) { 
} 

@Override 
public void paint(Graphics g) { 
    g.setColor(Color.WHITE); 
    g.fillRect(0, 0, getWidth(), getHeight()); 
    g.drawImage(trafficLight, 0, 0, null); 

    if(isReleased==true){ 
     g.drawImage(blank, 0, 0, this); 
    }else{ 
     if(isRed==true){ 
     g.drawImage(red, 0, 0, this); 
    } 
    if(isGreen==true){ 
     g.drawImage(green, 0, 0, this); 
     } 
    } 
} 

ПРИМЕЧАНИЕ
(обновлено) Мой полный код можно увидеть здесь: http://pastebin.com/8ZNQUWJy

ответ

2

Давайте игнорировать тот факт, что вы код является неполным, так что невозможно знать, что вы расширяете от или если вы действительно добавили KeyListener.

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

Лучшим решением было бы использовать Key Bindings API, что обеспечивает лучший контроль над уровнем фокусировки, вызовет ключевые события.

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

Вы также должны избегать переопределения paint, но особенно контейнеров верхнего уровня, таких как окна, поскольку они не имеют двойной буферизации. Вместо этого рекомендуется, чтобы вы простирались от чего-то JPanel или JComponent и вместо этого применяли метод paintComponent.

Посмотрите на Performing Custom Painting для получения более подробной информации.

обновляется на основе видя себя полный исходный

  • компоненты, основанные Избегайте AWT (например, Applet) АНИ устарело и не многие люди используют его больше, вместо этого вы должны рассмотреть возможность использования JApplet вместо этого. Но лично я бы избегал апплетов, пока не понял лучшее API.
  • Не называйте setSize внутри апплета, размер определяется HTML тег, который описывает апплет в браузере
  • Ваш метод run бессмысленно, поскольку он не делает ничего полезного и фактически может быть причиной вашего приложение для «зависания»
  • Ваш метод update только рисует trafficLightBufferedImage, но поскольку вы не можете позвонить super.update, ничего больше не будет нарисовано. Было бы лучше избавиться от него и сделать свою картину в методе paint, но убедитесь, что вы звоните super.paint. Но, как я уже сказал, вам лучше использовать что-то вроде JPanel и переопределить его метод paintComponent.

Взгляните на Creating a GUI with Swing для более подробной информации

Вы также можете найти Why CS teachers should stop teaching Java applets некоторой ценности ...

+0

Heres полный код: http://pastebin.com/8ZNQUWJy – MrAwesome8

+0

Спасибо за всю эту полезную информацию. – MrAwesome8

Смежные вопросы