2012-06-24 23 views
7

का उपयोग करके कीबोर्ड इनपुट नहीं मिलेगा मुझे अपनी पूर्ण स्क्रीन Window के साथ काम करने के लिए KeyBoardFocusManger प्राप्त करने में समस्याएं आ रही हैं। कोई फर्क नहीं पड़ता कि, यह सिर्फ कीबोर्ड इनपुट प्राप्त नहीं होगा। मैंने System.exit(0) और println() का उपयोग किया था ताकि कुंजीपटल/रिलीज़/टाइप की गई विधि को किसी भी कॉल की तलाश हो, लेकिन कोई त्रुटि नहीं फेंक दी गई है। मैंने KeyListeners की कोशिश की है; लेकिन जब मैंने this पढ़ा, तो मैं KeyboardFocusManager में बदल गया, और वही बात अभी भी होती है। मैं वास्तव में हताश हो रहा हूँ; मैं क्या निर्णय ले सकता हूं, Window कीबोर्ड का फोकस नहीं कर रहा है?पूर्ण स्क्रीन विंडो को KeyListener या KeyBoardFocusManager

यहाँ है अपने मुख्य:

public static void main(String[] args) { 
    EventQueue.invokeLater(new Runnable() { 

     @Override 
     public void run() { 
      // Determine if full-screen mode is supported directly 
      GraphicsEnvironment ge = GraphicsEnvironment.getLocalGraphicsEnvironment(); 
      GraphicsDevice gs = ge.getDefaultScreenDevice(); 
      if (gs.isFullScreenSupported()) { 
       Frame frame = new Frame(gs.getDefaultConfiguration()); 
       SpaceInvaderUI spaceInvaderUI = new SpaceInvaderUI(frame); 
       // Enter full-screen mode 
       gs.setFullScreenWindow(spaceInvaderUI); 
      } else { 
       JOptionPane.showMessageDialog(null, "Does not support full screen!", "Error 0x01", JOptionPane.ERROR_MESSAGE); 
       System.exit(1); 
      } 
     } 
    }); 
} 

और यहाँ यूआई जो KeyBoardFocusManger शामिल है, और addListeners() विधि में जोड़ा जाता है:

class SpaceInvaderUI extends Window { 

    private JPanel drawingPanel; 
    private Image background; 
    private JButton btnExit; 

    public SpaceInvaderUI(Frame frame) { 
     super(frame); 
     try { 
      background = ImageIO.read(getClass().getResourceAsStream("background.png")); 
     } catch (Exception ex) { 
      JOptionPane.showMessageDialog(null, "Could not extract resource: " + ex.getMessage(), "Error 0x02", JOptionPane.ERROR_MESSAGE); 
      System.exit(2); 
     } 
     createWindow(); 
    } 

    private void createComponents() throws HeadlessException { 
     drawingPanel = new DrawingPanel(background, this); 
     btnExit = new JButton("Exit"); 
    } 

    private void createWindow() { 
     createComponents(); 
     addListeners(); 
     addComponentsToWindow(); 
    } 

    private void addComponentsToWindow() { 
     add(drawingPanel, BorderLayout.CENTER); 
     add(btnExit, BorderLayout.SOUTH); 
    } 

    private void addListeners() { 
     KeyboardFocusManager manager = KeyboardFocusManager.getCurrentKeyboardFocusManager(); 
     manager.addKeyEventDispatcher(new MyDispatcher()); 
     btnExit.addActionListener(new ActionListener() { 

      @Override 
      public void actionPerformed(ActionEvent ae) { 
       System.exit(0); 
      } 
     }); 
    } 

    private class MyDispatcher implements KeyEventDispatcher { 

     @Override 
     public boolean dispatchKeyEvent(KeyEvent e) { 
      if (e.getID() == KeyEvent.KEY_PRESSED) { 
       System.out.println("pressed"); 
       System.exit(0); 
      } else if (e.getID() == KeyEvent.KEY_RELEASED) { 
       System.out.println("released"); 
       System.exit(0); 
      } else if (e.getID() == KeyEvent.KEY_TYPED) { 
       System.out.println("Typed"); 
       System.exit(0); 
      } 
      return false; 
     } 
    } 
} 

बाहर निकलें बटन सिर्फ इसलिए कि मैं थक मिल गया है taskmanager के माध्यम से मेरे ऐप की हत्या। आखिरकार मेरा पैनल है जिस पर गेम होगा और मेरी पृष्ठभूमि को चित्रित किया गया है:

public class DrawingPanel extends JPanel { 

    private final Image background; 
    private final SpaceInvaderUI invaderUI; 

    DrawingPanel(Image background, SpaceInvaderUI invaderUI) { 
     this.background = background; 
     this.invaderUI = invaderUI; 
    } 

    @Override 
    protected void paintComponent(Graphics grphcs) { 
     super.paintComponent(grphcs); 
     grphcs.drawImage(background.getScaledInstance((int) invaderUI.getWidth(), (int) invaderUI.getHeight(), Image.SCALE_SMOOTH), 0, 0, this); 
    } 
} 

अग्रिम धन्यवाद।

संपादित करें: अब मैं अपने drawingPanel पर एक कुंजी बाइंडिंग का उपयोग कर की कोशिश की है, लेकिन अभी भी कुछ नहीं होता है जब मैं f2 प्रेस: ​​अपनी स्विंग जीयूआई में

class SpaceInvaderUI extends Window { 

    private JPanel drawingPanel; 
    private Image background; 
    private JButton btnExit; 

    public SpaceInvaderUI(Frame frame) { 
     super(frame); 
     try { 
      background = ImageIO.read(getClass().getResourceAsStream("background.png")); 
     } catch (Exception ex) { 
      JOptionPane.showMessageDialog(null, "Could not extract resource: " + ex.getMessage(), "Error 0x02", JOptionPane.ERROR_MESSAGE); 
      System.exit(2); 
     } 
     createWindow(); 
    } 

    private void createComponents() throws HeadlessException { 
     drawingPanel = new DrawingPanel(background, this); 
     btnExit = new JButton("Exit"); 
    } 

    private void createWindow() { 
     createComponents(); 
     addListeners(); 
     addComponentsToWindow(); 
    } 

    private void addComponentsToWindow() { 
     add(drawingPanel, BorderLayout.CENTER); 
     add(btnExit, BorderLayout.SOUTH); 
    } 

    private void addListeners() { 
     Action exit = new AbstractAction() { 

      public void actionPerformed(ActionEvent e) { 
       System.exit(0); 
      } 
     }; 
     drawingPanel.getInputMap().put(KeyStroke.getKeyStroke("F2"), 
       exit); 
     btnExit.addActionListener(new ActionListener() { 

      @Override 
      public void actionPerformed(ActionEvent ae) { 
       System.exit(0); 
      } 
     }); 
    } 
} 
+0

यह फ़्रेम नहीं बल्कि एक विंडो है, और मैं इसे बंद करने के लिए एक बटन का उपयोग कर सकता हूं, लेकिन मैं चाहता हूं कि गेम बाहर निकलने के लिए 'Esc' कुंजी का उपयोग करें और मेनू आदि लाएं –

+0

तो मुझे लगता है कि कीबाइंडिंग बिल्कुल ठीक है आप। –

उत्तर

5

आप AWT घटकों क्यों प्रयोग कर रहे हैं? मुझे डर है (लेकिन निश्चित रूप से नहीं पता) कि ऐसा करके, आप कुछ स्विंग कार्यक्षमता खो सकते हैं।

यदि आप केवल चयन कुंजी को कैप्चर कर रहे हैं तो गेम को नियंत्रित करने के लिए कुंजी स्ट्रोक का चयन करें, Key Bindings का उपयोग करने पर विचार करें।

संपादित:
नहीं है, AWT घटकों की गलती नहीं कर रहे हैं, लेकिन अभी भी शायद नहीं किया जाना चाहिए।

संपादित करें 2:
आपकी शीर्ष स्तर विंडो किसी कारण से केंद्रित नहीं है। कोड का परीक्षण करने को जारी रखते हुए ...

संपादित 3:
एक JFrame का उपयोग करना मेरे लिए काम किया:

import java.awt.*; 
import java.awt.event.*; 
import javax.swing.*; 

public class Test3 { 
    public static void main(String[] args) { 
     EventQueue.invokeLater(new Runnable() { 

     @Override 
     public void run() { 
      GraphicsEnvironment ge = GraphicsEnvironment 
        .getLocalGraphicsEnvironment(); 
      GraphicsDevice gs = ge.getDefaultScreenDevice(); 
      if (gs.isFullScreenSupported()) { 
       SpaceInvaderUI spaceInvaderUI = new SpaceInvaderUI(gs.getDefaultConfiguration()); 
       gs.setFullScreenWindow(spaceInvaderUI); 
      } else { 
       JOptionPane.showMessageDialog(null, 
        "Does not support full screen!", "Error 0x01", 
        JOptionPane.ERROR_MESSAGE); 
       System.exit(1); 
      } 
     } 
     }); 
    } 
} 

// class SpaceInvaderUI extends JWindow { 
class SpaceInvaderUI extends JFrame { 

    private JPanel drawingPanel; 
    private Image background; 
    private JButton btnExit; 

    public SpaceInvaderUI(GraphicsConfiguration gc) { 
     super(gc); 
     createWindow(); 
     addKeyBindings(); 
     setUndecorated(true); 
    } 

    private void addKeyBindings() { 
     int condition = JPanel.WHEN_IN_FOCUSED_WINDOW; 
     InputMap inputMap = drawingPanel.getInputMap(condition); 
     ActionMap actionMap = drawingPanel.getActionMap(); 

     boolean released = false; 
     KeyStroke upArrowKeyStrokePressed = KeyStroke.getKeyStroke(KeyEvent.VK_UP, 0, released); 
     String upArrowPressed = "up arrow pressed"; 
     inputMap.put(upArrowKeyStrokePressed , upArrowPressed); 
     actionMap.put(upArrowPressed, new AbstractAction() { 

     @Override 
     public void actionPerformed(ActionEvent arg0) { 
      System.out.println("up arrow pressed"); 
     } 
     }); 

     released = true; 
     String upArrowReleased = "up arrow released"; 
     KeyStroke upArrowKeyStrokeReleased = KeyStroke.getKeyStroke(KeyEvent.VK_UP, 0, released); 
     inputMap.put(upArrowKeyStrokeReleased , upArrowReleased); 
     actionMap.put(upArrowReleased , new AbstractAction() { 

     @Override 
     public void actionPerformed(ActionEvent arg0) { 
      System.out.println("up arrow released"); 
     } 
     }); 

    } 

    private void createComponents() throws HeadlessException { 
     drawingPanel = new DrawingPanel(background, this); 
     btnExit = new JButton("Exit"); 
    } 

    private void createWindow() { 
     createComponents(); 
     addListeners(); 
     addComponentsToWindow(); 
    } 

    private void addComponentsToWindow() { 
     add(drawingPanel, BorderLayout.CENTER); 
     add(btnExit, BorderLayout.SOUTH); 
    } 

    private void addListeners() { 
//  KeyboardFocusManager manager = KeyboardFocusManager 
//   .getCurrentKeyboardFocusManager(); 
//  manager.addKeyEventDispatcher(new MyDispatcher()); 
     btnExit.addActionListener(new ActionListener() { 

     @Override 
     public void actionPerformed(ActionEvent ae) { 
      System.exit(0); 
     } 
     }); 
    } 
// 
// private class MyDispatcher implements KeyEventDispatcher { 
// 
//  @Override 
//  public boolean dispatchKeyEvent(KeyEvent e) { 
//   System.out.println("in dispatch. KeyEvent := " + e); 
//   if (e.getID() == KeyEvent.KEY_PRESSED) { 
//   System.out.println("pressed"); 
//   System.exit(0); 
//   } else if (e.getID() == KeyEvent.KEY_RELEASED) { 
//   System.out.println("released"); 
//   System.exit(0); 
//   } else if (e.getID() == KeyEvent.KEY_TYPED) { 
//   System.out.println("Typed"); 
//   System.exit(0); 
//   } 
//   return false; 
//  } 
// } 
} 

class DrawingPanel extends JPanel { 

    private final Image background; 
    private final SpaceInvaderUI invaderUI; 

    DrawingPanel(Image background, SpaceInvaderUI invaderUI) { 
     this.background = background; 
     this.invaderUI = invaderUI; 
     setBackground(Color.pink); 
    } 

    @Override 
    protected void paintComponent(Graphics grphcs) { 
     super.paintComponent(grphcs); 
    } 
} 
+0

aaaahhh मेरा कितना बेवकूफ है, मैं 'विंडो' पर कीबाइंडिंग जोड़ने पर केंद्रित था, जो स्पष्ट रूप से असंभव है, इसे कभी भी मेरे पैनल में जोड़ने के बारे में सोचा नहीं। बहुत बहुत धन्यवाद :) –

+0

मैंने कोशिश की लेकिन यह काम नहीं करता है, कुछ नहीं होता है? –

+0

@ डेविड क्राउकंपैम्प: संपादित करें 3. –

4

के रूप में यह संबंधित FullScreenTest में दिखाया गया है, आप बटन के लिए एक ही Action उदाहरण उपयोग कर सकते हैं और कुंजी बाध्यकारी।

परिशिष्ट: @nIcE गाय, पूछता हमInputMapऔरActionMap, उपयोग करके एक हीJComponentपर एक से अधिक कुंजी जोड़ सकते हैं और एक हीAbstractActionवर्ग का उपयोग कर सकते हैं?

हां, एकाधिक कुंजी बाइंडिंग संभव हैं; here दिखाए गए अनुसार, ऑडियो-विज़ुअल फीडबैक प्राप्त करने के लिए मैं कभी-कभी doClick() का आह्वान करता हूं।

+0

क्या मैं कीबाइंडिंग पर एक प्रश्न पूछ सकता हूं? क्या हम 'इनपुटमैप' और 'एक्शनमैप' का उपयोग करके उसी 'JComponent' पर एक से अधिक कुंजी जोड़ सकते हैं, और उसी' सार तत्व 'वर्ग का उपयोग कर सकते हैं? –

+0

धन्यवाद, यह मेरा एकमात्र विकल्प जैसा लगता है यदि मैं अपना संस्करण काम नहीं कर पा रहा हूं –

 संबंधित मुद्दे

  • कोई संबंधित समस्या नहीं^_^