2013-08-09 6 views
5

का पता नहीं लगा रहा है, मैं इस प्रोग्राम को संशोधित करने की कोशिश कर रहा हूं ताकि यह एक महल की छवि खींच सके और मैं ऊपर और नीचे तीर कुंजियों का उपयोग करके इस छवि को स्केल करने में सक्षम हूं। मैं कुंजीलिस्टर को काम करने के लिए प्रबंधित नहीं कर सकता, प्रोग्राम चलता है लेकिन यह मुख्य प्रेस का जवाब नहीं दे रहा है। किसी भी मदद की सराहना की जाएगी, धन्यवाद।जावा की लिस्टनर कीबोर्ड इनपुट

import java.awt.*; 
import java.awt.geom.*; 
import java.util.*; 
import javax.swing.*; 
import java.net.*; 
import java.awt.event.*; 

public class DrawImage extends JFrame implements KeyListener { 
int scale = 1; 
    private Image image; 
    enter code here 
    public static void main(String[] args) { 
     new DrawImage(); 
    } 

    public DrawImage() { 
     super("DrawImage"); 
     setSize(600,600); 
     setVisible(true); 
     setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
     Toolkit tk = Toolkit.getDefaultToolkit(); 
     image = tk.getImage(getURL("castle.png")); 
     addKeyListener(this); 
    } 

    private URL getURL(String filename) { 
     URL url = null; 
     try { 
      url = this.getClass().getResource(filename); 
     } 
     catch (Exception e) { } 
     return url; 
    } 

    public void paint(Graphics g) { 
     Graphics2D g2d = (Graphics2D) g; 
     AffineTransform trans = new AffineTransform(); 
     trans.scale(scale, scale); 
     System.out.println("scale: " + scale); 
     g2d.setColor(Color.BLACK); 
     g2d.fillRect(0, 0, getSize().width, getSize().height); 
     g2d.setTransform(trans); 
     g2d.drawImage(image, 0, 40, this); 
     addKeyListener(this); 
    } 

    public void keyReleased(KeyEvent e) { } 
    public void keyTyped(KeyEvent e) { } 
    public void keyPressed(KeyEvent e) { 
     int key = e.getKeyCode(); 
     if (key == KeyEvent.VK_UP) { 
      scale++; 
     } 
     if (key == KeyEvent.VK_DOWN) { 
      scale--; 
     } 
    } 
} 
+0

कृपया देखें संपादन, 1, 2, 3, और 4 जवाब देने के लिए। अगर कुछ अस्पष्ट है तो कृपया टिप्पणी करें। –

उत्तर

8

मैं प्रबंधन नहीं कर सकते काम करने के लिए keylistener, कार्यक्रम रन प्राप्त करने के लिए, लेकिन यह कुंजी दबाव का जवाब नहीं है।

आपकी एक बहुत ही आम समस्या है जिसे अक्सर यहां पूछा जाता है, और लगभग हमेशा समस्या फोकस की कमी के कारण होती है - जो घटक सुनता है, उसका वर्तमान फोकस नहीं होता है, और फोकस आवश्यक है काम करने के लिए KeyListener।

संक्षिप्त उत्तर उस घटक को देना है जिसे ध्यान में रखा जा रहा है।

अब तक का बेहतर जवाब है कि KeyListeners का उपयोग न करें और इसके बजाय ऐसी परियोजना के लिए कुंजी बाइंडिंग का उपयोग करें।


संपादित
अन्य समस्याओं:

  • ऊपर अपने कोड में, आप एक JFrame को KeyListener जोड़ रहे हैं, और यह नहीं किया जाना चाहिए, भले ही आप उचित कारण रहा KeyListeners का उपयोग करने के लिए।
  • आप सीधे जेएफआरएएम में भी चित्रित कर रहे हैं, जो मेरी राय में एक बड़ी समस्या है, क्योंकि आप अवांछित दुष्प्रभावों को जोखिम देते हैं।
  • आप पेंट विधि के अंदर एक श्रोता जोड़ रहे हैं, एक बड़ी समस्या भी। पेंट विधि को ओवरराइड नहीं किया जाना चाहिए (सामान्य रूप से), और यदि आपको इसे ओवरराइड करना पड़ता है, तो कभी भी प्रोग्राम तर्क के लिए, श्रोताओं को जोड़ने या हटाने के लिए या किसी भी गैर-चित्रकारी गतिविधियों के लिए उपयोग नहीं किया जाना चाहिए। यह केवल पेंटिंग और पेंटिंग के लिए होना चाहिए।
  • इसके बजाय आपको सीधे जेपीनल या जेकंपोनेंट में आकर्षित करना चाहिए।
  • इसके बजाय आपको अपने चित्रकला जेपीनेल या जेकंपोनेंट में paintComponent(Graphics g) ओवरराइड में ड्राइंग करना चाहिए।
  • जैसा ऊपर बताया गया है, यह विधि केवल पेंटिंग और पेंटिंग के लिए होनी चाहिए और जितनी जल्दी हो सके उतनी जल्दी होनी चाहिए।
  • आपको अपने paintComponent(Graphics g) ओवरराइड के अंदर super.paintComponent(g) पर कॉल करना चाहिए।
  • फिर ड्राइंग घटक कुंजी बाइंडिंग (ट्यूटोरियल here) का उपयोग करके प्रमुख स्ट्रोक के लिए सुनना चाहिए। ट्यूटोरियल समझाएगा कि यह भेद क्यों (KeyListener बनाम कुंजी बाइंडिंग) महत्वपूर्ण है।

संपादित 2
तुम कभी के रूप में अपने कोड यहाँ से पता चलता अपवादों को अनदेखा करने के बाद से इस ड्राइविंग के प्रोग्रामिंग बराबर अंधा होता है चाहता हूँ:

try { 
    url = this.getClass().getResource(filename); 
    } catch (Exception e) { 
    } 

उम्मीद है कि यह नहीं है कि कैसे अपने उत्पादन कोड ऐसा लगता है कि आपने ब्रेवटी के लिए अपने पोस्ट कोड में अपवादों को केवल अनदेखा किया है, लेकिन हम में से कई लोगों को यह समझना है कि यह चाक-बोर्ड पर नाखूनों की तरह है।


संपादित बनाम कुंजी बाइंडिंग KeyListeners पर 3
अधिक: यह मानते हुए कि आप एक KeyListener साथ काम करने के लिए, तो मान लेते हैं कि आप अपने जीयूआई के लिए किसी अन्य फ़ोकस करने योग्य घटक जोड़ा है और वे किसी भी तरह मिल गया अपने कोड मिला उपयोगकर्ता इंटरैक्शन के माध्यम से ध्यान केंद्रित करें, तो आपकी कीबाइंडिंग अब काम नहीं करेगी। यदि आपने कुंजी बाइंडिंग के साथ यह सही ढंग से किया है, तो यह कोई मुद्दा नहीं होगा।


संपादित 4
आप वास्तव में अपने पैमाने क्षेत्र एक डबल, एक पूर्णांक नहीं होना चाहता हूँ। और आप वास्तव में इसे बढ़ाना और घटाना नहीं चाहते हैं, बल्कि आप इसे गुणा करना चाहते हैं और इसे कुछ गुणक स्थिरांक से विभाजित करना चाहते हैं, उदाहरण के तौर पर 1.2 कहें। जब भी आप अपना स्केल बदलते हैं तो आप repaint() पर भी कॉल करना चाहेंगे।


संपादित 5
, दो नमूना कार्यक्रम, पहले DrawImagePanelKeyListener.java कहा जाता है, एक KeyListener का उपयोग करता है की जाँच करें, जबकि दूसरा, DrawImagePanelKeyBindings कहा जाता है, कुंजी बाइंडिंग का उपयोग करता है। दोनों को संकलित, चलाने और अपेक्षित कार्य करना चाहिए: जब आप ऊपर या नीचे तीर कुंजी दबाते हैं, तो प्रदर्शित छवि घट जाती है और बढ़ती है। उनके व्यवहार में अंतर हालांकि देखा जा सकता है जब जेबटन दोनों दबाए जाते हैं। बटन दबाएं और देखें कि आपकी मुख्य प्रतिक्रिया के साथ क्या होता है। जब एक KeyListener का घटक फोकस खो देता है, तो इसकी KeyListener काम करना बंद कर देगा, लेकिन यह कुंजी बाइंडिंग का उपयोग करने वाले घटक के लिए भी सही नहीं है।

इस समस्या के आसपास एक क्लज जो अन्य सभी घटकों को ध्यान केंद्रित करने से रोक सकता है, लेकिन यह अधिकांश जीयूआई के साथ व्यावहारिक या वांछित नहीं है।

DrawImagePanelKeyListener.java

import java.awt.*; 
import javax.imageio.ImageIO; 
import javax.swing.*; 
import java.io.IOException; 
import java.net.*; 
import java.awt.event.*; 

@SuppressWarnings("serial") 
public class DrawImagePanelKeyListener extends JPanel implements KeyListener { 
    public static final String IMAGE_PATH = "https://duke.kenai.com/" 
     + "nyanya/.Midsize/NyaNya.jpg.png"; 
    private static final double MULTIPLIER = 1.2; 
    double scale = 1.0; 
    private Image image; 
    private Dimension initialSize = new Dimension(0, 0); 

    public static void main(String[] args) { 
     SwingUtilities.invokeLater(new Runnable() { 
     public void run() { 
      DrawImagePanelKeyListener drawImage = new DrawImagePanelKeyListener(); 
      drawImage.add(new JButton("Foo")); 
      JFrame frame = new JFrame("Draw Image"); 
      frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
      frame.add(drawImage); 
      frame.pack(); 
      frame.setLocationRelativeTo(null); 
      frame.setVisible(true); 
     } 
     }); 
    } 

    public DrawImagePanelKeyListener() { 
     setFocusable(true); 
     requestFocusInWindow(); 
     URL imgURL; 
     try { 
     imgURL = new URL(IMAGE_PATH); 
     image = ImageIO.read(imgURL); 
     initialSize = new Dimension(image.getWidth(this), 
       image.getHeight(this)); 
     addKeyListener(this); 
     setVisible(true); 
     } catch (MalformedURLException e) { 
     e.printStackTrace(); 
     } catch (IOException e) { 
     e.printStackTrace(); 
     } 
    } 

    @Override 
    public Dimension getPreferredSize() { 
     return initialSize; 
    } 

    @Override 
    protected void paintComponent(Graphics g) { 
     super.paintComponent(g); 
     g.setColor(Color.BLACK); 
     g.fillRect(0, 0, getSize().width, getSize().height); 
     Graphics2D g2d = (Graphics2D) g.create(); 
     g2d.scale(scale, scale); 
     g2d.drawImage(image, 0, 0, this); 
    } 

    public void keyReleased(KeyEvent e) { 
    } 

    public void keyTyped(KeyEvent e) { 
    } 

    public void keyPressed(KeyEvent e) { 
     int key = e.getKeyCode(); 
     if (key == KeyEvent.VK_UP) { 
     scale *= MULTIPLIER; 
     } 
     if (key == KeyEvent.VK_DOWN) { 
     scale /= MULTIPLIER; 
     } 
     repaint(); 
    } 
} 

DrawImagePanelKeyBindings.java

import java.awt.*; 
import javax.imageio.ImageIO; 
import javax.swing.*; 
import java.io.IOException; 
import java.net.*; 
import java.awt.event.*; 

@SuppressWarnings("serial") 
public class DrawImagePanelKeyBindings extends JPanel { 
    public static final String IMAGE_PATH = "https://duke.kenai.com/" 
     + "nyanya/.Midsize/NyaNya.jpg.png"; 
    private static final double MULTIPLIER = 1.2; 
    double scale = 1.0; 
    private Image image; 
    private Dimension initialSize = new Dimension(0, 0); 

    public static void main(String[] args) { 
     SwingUtilities.invokeLater(new Runnable() { 
     public void run() { 
      DrawImagePanelKeyBindings drawImage = new DrawImagePanelKeyBindings(); 
      drawImage.add(new JButton("Foo")); 
      JFrame frame = new JFrame("Draw Image"); 
      frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
      frame.add(drawImage); 
      frame.pack(); 
      frame.setLocationRelativeTo(null); 
      frame.setVisible(true); 
     } 
     }); 
    } 

    public DrawImagePanelKeyBindings() { 
     setBindings(); 
     URL imgURL; 
     try { 
     imgURL = new URL(IMAGE_PATH); 
     image = ImageIO.read(imgURL); 
     initialSize = new Dimension(image.getWidth(this), 
       image.getHeight(this)); 
     setVisible(true); 
     } catch (MalformedURLException e) { 
     e.printStackTrace(); 
     } catch (IOException e) { 
     e.printStackTrace(); 
     } 
    } 

    private void setBindings() { 
     int condition = WHEN_IN_FOCUSED_WINDOW; 
     InputMap inputMap = getInputMap(condition); 
     ActionMap actionMap = getActionMap(); 

     final KeyStroke[] keyStrokes = { 
      KeyStroke.getKeyStroke(KeyEvent.VK_UP, 0), 
      KeyStroke.getKeyStroke(KeyEvent.VK_DOWN, 0) 
     }; 
     for (final KeyStroke keyStroke : keyStrokes) { 
     inputMap.put(keyStroke, keyStroke.toString()); 
     actionMap.put(keyStroke.toString(), new AbstractAction() { 
      @Override 
      public void actionPerformed(ActionEvent evt) { 
       myKeyPressed(keyStroke.getKeyCode()); 
      } 
     }); 
     } 
    } 

    @Override 
    public Dimension getPreferredSize() { 
     return initialSize; 
    } 

    @Override 
    protected void paintComponent(Graphics g) { 
     super.paintComponent(g); 
     g.setColor(Color.BLACK); 
     g.fillRect(0, 0, getSize().width, getSize().height); 
     Graphics2D g2d = (Graphics2D) g.create(); 
     g2d.scale(scale, scale); 
     g2d.drawImage(image, 0, 0, this); 
    } 

    public void myKeyPressed(int key) { 
     if (key == KeyEvent.VK_UP) { 
     scale *= MULTIPLIER; 
     } 
     if (key == KeyEvent.VK_DOWN) { 
     scale /= MULTIPLIER; 
     } 
     repaint(); 
    } 
} 
संबंधित मुद्दे