आपकी एक बहुत ही आम समस्या है जिसे अक्सर यहां पूछा जाता है, और लगभग हमेशा समस्या फोकस की कमी के कारण होती है - जो घटक सुनता है, उसका वर्तमान फोकस नहीं होता है, और फोकस आवश्यक है काम करने के लिए KeyListener।
अब तक का बेहतर जवाब है कि KeyListeners का उपयोग न करें और इसके बजाय ऐसी परियोजना के लिए कुंजी बाइंडिंग का उपयोग करें।
संपादित 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();
}
}
कृपया देखें संपादन, 1, 2, 3, और 4 जवाब देने के लिए। अगर कुछ अस्पष्ट है तो कृपया टिप्पणी करें। –