2015-11-05 5 views
1

Я пытаюсь изменить фон моей маленькой программы, как только кто-то попадает в пространство (32). Это просто не сработает, и я пробую разные вещи и все, что я могу найти в Интернете, например, положить g.setColor(Color.BLUE); в начале блока public void paintComponent(Graphics g).JAVA setColor in paintComponent остается пустым

Здесь я получил следующий код. Моего Screen.java

import java.awt.Color; 
import java.awt.Graphics; 
import javax.swing.JPanel; 

public class Screen extends JPanel implements Runnable{ 

Thread thread = new Thread(this); 
Frame frame; 

private int fps = 0; 
public int scene = 0; 
public boolean running = false; 

public Screen(Frame frame){ 
    this.frame = frame; 
    this.frame.addKeyListener(new KeyHandler(this)); 
    thread.start(); 
} 

public void paintComponent(Graphics g){ 
    super.paintComponent(g); 
    super.paint(g); 
    g.clearRect(0, 0, this.frame.getWidth(),this.frame.getHeight()); 
    g.drawString(fps + "", 10, 10); 

    if (scene == 0) { 
     g.setColor(Color.BLUE); 
    } else if (scene == 1) { 
     g.setColor(Color.GREEN); 
    } else { 
     g.setColor(Color.white); 
    } 
    g.fillRect(0, 0, getWidth(), getHeight()); 
} 


public void run() { 
    System.out.println("[Success] Frame Created!"); 

    long lastFrame = System.currentTimeMillis(); 
    int frames = 0; 

    running = true; 
    scene = 0; 

    while(running){ 
     repaint(); 
     frames++; 

     if(System.currentTimeMillis() - 1000 >= lastFrame){ 
      fps = frames; 
      frames = 0; 
      lastFrame = System.currentTimeMillis(); 
     } 

     try { 
      Thread.sleep(2); 
     } catch (InterruptedException ex) { 
      ex.printStackTrace(); 
     } 
    } 
    System.exit(0); 
    } 

    public class KeyTyped{ 
    public void keySPACE() { 
     scene = 1; 
    } 
    public void keyESC(){ 
     running = false; 
    } 


    } 
    } 

    KeyHandler.java 

import java.awt.event.KeyEvent; 
import java.awt.event.KeyListener; 

public class KeyHandler implements KeyListener { 

public Screen screen; 
public Screen.KeyTyped keyTyped; 

public KeyHandler(Screen screen){ 
    this.screen = screen; 
    this.keyTyped = this.screen.new KeyTyped(); 

    } 

public void keyPressed(KeyEvent e) { 
    int keyCode = e.getKeyCode(); 

    System.out.println(keyCode); 

    if(keyCode == 27){ 
     this.keyTyped.keyESC(); 
    }   
    if(keyCode == 32){ 
     this.keyTyped.keySPACE(); 
    } 
} 

public void keyReleased(KeyEvent e) { 

} 

public void keyTyped(KeyEvent e) { 

    }  
} 

Я не знаю, почему код не в одном блоке. Похоже, я делаю с этим что-то не так?

+0

Что вы подразумеваете под словом "it does not work"? что происходит вместо этого? есть ли какие-либо сообщения или трассировки стека на консоли? Как вы пытались диагностировать проблему (добавление случайного кода из Интернета в вашу программу, как правило, не будет работать)? –

+0

О, черт возьми, я читал этот список о том, что хороший пост в stackoverflow перед тем, как я опубликовал это, и теперь я замечаю, что забыл описать половину проблемы. Фон просто остается пустым, как обычный начальный фон (Im более или менее colorblind и вижу только небольшие изменения, поэтому я не могу сказать вам, какой цвет фон точно получил, но его не синий или зеленый) Я попытался изменить код, поместите его в другое место, где я читал разные способы работы в Интернете. Добавлено super.paintComponent и т. Д. Нет сообщений, к сожалению. – luke

+0

не беспокоится, и рад, что вы нашли время, чтобы прочитать список! вы отправитесь на лучший старт, чем многие люди. Я бы обратил особое внимание на те части, которые упоминают [SSCCEs] (http://sscce.org/) - часто раз, во время процесса создания одного из них в вашем вопросе, вы сами понимаете, в чем проблема твой собственный. –

ответ

1
  1. Вы должны использовать InputMap/ActionMap вместо KeyListener
  2. Вы должны убедиться, что JComponent установлен в isFocusable (истина), и вы component.requestFocus(), когда первый показанный, чтобы убедиться, что ваш действие будет срабатывать.
+0

Вам не нужен шаг 2, если вы используете шаг 1, то есть преимущество использования 'Key Bindings'. Компонент не должен иметь фокуса. Я бы начал с чтения учебника Swing [Как использовать привязки клавиш] (http://docs.oracle.com/javase/tutorial/uiswing/misc/keybinding.html). – camickr

0

пожалуйста исправления:
1. Использование JFrame вместо Frame
2. implemement paintComponent так:

g.clearRect(0, 0, this.frame.getWidth(),this.frame.getHeight()); 
    if (scene == 0) { 
     g.setColor(Color.BLUE); 
    } else if (scene == 1) { 
     g.setColor(Color.GREEN); 
    } else { 
     g.setColor(Color.white); 
    } 
    g.fillRect(0, 0, getWidth(), getHeight()); 

    g.setColor(Color.WHITE); 
    g.drawString(fps + "", 10, 10); 

3. убедитесь, что Screen добавляется JFrame 4. убедитесь, выдать setVisible(true) по телефону JFrame

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