2013-03-11 25 views
1

編輯:現在它工作正常,但是當我切換到「遊戲」的JPanel,該KeyListener的不工作:(任何方式來解決這個中的ActionListener不能重繪

我只是編程? java遊戲和repaint()方法有問題: 我想從菜單到遊戲,所以我刪除菜單面板並添加遊戲面板(「Zeichnen」擴展JPanel)但每次我嘗試重新繪製,日食給我下面的錯誤:「該方法重繪()是未定義的類型新的ActionListener(){}」誰能幫我:(

代碼:

import java.awt.event.ActionEvent; 
import java.awt.event.ActionListener; 
import javax.swing.JButton; 
import javax.swing.JFrame; 
import javax.swing.JPanel; 


public class Frame { 

JFrame frame; 
JPanel menu; 
JButton start; 
Zeichnen game; 

public Frame() { 

    start = new JButton("Start Game"); 
    menu = new JPanel(); 
    game = new Zeichnen(); 
    frame = new JFrame("Epic Game"); 

    start.addActionListener(new ActionListener() { 
     public void actionPerformed(ActionEvent e) { 

      frame.remove(menu); 
      frame.add(game); 
      repaint(); 

    }}); 

    frame.setVisible(true); 
    frame.setSize(640,480); 
    game.addKeyListener(new Listener(game)); 
    menu.add(start); 
    frame.add(menu); 
    frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
    frame.setLocationRelativeTo(null); 

} 
} 
+0

見回答:你應該使用的,而不是一個關鍵監聽鍵綁定。 – 2013-03-11 22:01:46

回答

2

Suggestsions:

  • 您應該使用CardLayout有一個容器交換組件,你正在做的,因爲這是改變觀點的最簡單,最可靠的方式。在這個網站的先前的問題中有很多這樣的例子。
  • 不要使用KeyListener,而要使用Key Bindings,因爲它們在組件焦點方面更加寬容。
  • 將您的「Frame」類重命名爲與核心Java類不匹配的類。這是一個非常令人困惑的名字。

例如:

import java.awt.event.*; 
import java.awt.*; 

import javax.swing.*; 

public class ContentPane extends JPanel { 

    public static final String MENU = "menu"; 
    public static final String GAME = "game"; 
    private static final int PREF_W = 640; 
    private static final int PREF_H = 480; 

    private CardLayout cardlayout = new CardLayout(); 
    private JPanel menu = new JPanel(); 
    private JButton start; 
    private Zeichnen game; 

    public ContentPane() { 
     setLayout(cardlayout); 
     start = new JButton("Start Game"); 
     game = new Zeichnen(); 

     add(menu, MENU); 
     add(game, GAME); 

     start.addActionListener(new ActionListener() { 
     public void actionPerformed(ActionEvent e) { 
      cardlayout.next(ContentPane.this); 
     } 
     }); 

     menu.add(start); 
    } 

    @Override 
    public Dimension getPreferredSize() { 
     return new Dimension(PREF_W, PREF_H); 
    } 

    private static void createAndShowGui() { 
     JFrame frame = new JFrame("Epic Game"); 
     frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
     frame.getContentPane().add(new ContentPane()); 
     frame.pack(); 
     frame.setLocationRelativeTo(null); 
     frame.setVisible(true); 
    } 

    public static void main(String[] args) { 
     SwingUtilities.invokeLater(new Runnable() { 
     public void run() { 
      createAndShowGui(); 
     } 
     }); 
    } 
} 

和密鑰綁定:

@SuppressWarnings("serial") 
class Zeichnen extends JPanel { 
    private static final String DOWN = "down"; 

    public Zeichnen() { 
     int condition = WHEN_IN_FOCUSED_WINDOW; 
     InputMap inputMap = getInputMap(condition); 
     ActionMap actionMap = getActionMap(); 

     inputMap.put(KeyStroke.getKeyStroke(KeyEvent.VK_DOWN, 0), DOWN); 
     actionMap.put(DOWN, new AbstractAction(DOWN) { 
     { 
      putValue(ACTION_COMMAND_KEY, DOWN); 
     } 

     @Override 
     public void actionPerformed(ActionEvent evt) { 
      System.out.println(evt.getActionCommand()); 
     } 
     }); 
    } 
} 
1

你需要調用game.repaint(),因爲它創建匿名類有沒有方法稱爲重繪()

+0

感謝它的工作,但我不得不使用重新驗證:) – 2013-03-11 21:29:52

1

這是因爲有一個在任何類(沒有方法在結構即Frame →匿名ActionListener),其延伸Component並具有repaint方法。

您可以讓您的主Frame類延伸JFrame,或致電game.repaint()。你可能想要做前者。

+0

感謝上帝你救了我的一天,我差點扔我的筆記本在我的牆上,因爲我無法找出問題... – 2014-05-29 18:07:52