[英]How to add JLabel of KeyListener object in Jframe of Main class
我對這種 Java 編碼有點陌生。 問題是我有一個不同的 KeyListener 類和一個圖像,如果用戶按下一個鍵,我想顯示一個圖像,但圖像來自 JLabel,我想將它添加到主類的 JFrame 中,但我不明白如何我會那樣做。 是的,我確實看到了另一個問題,這個問題: 如何將 JLabel 添加到另一個類的 JFrame? 但我無法在我的代碼中執行建議的方法,因為在 main 方法中調用 Key Listener 時,只會在調用時處理 KeyListening 部分,例如:jframe.add(new KeyListener()) 類似的東西,但圖像不會添加是因為它包含在 JLabel 中,而 JLabel 未添加到 JFrame。 這是我的 KeyListener 代碼:
import java.awt.event.KeyAdapter;
import java.awt.event.KeyEvent;
import javax.swing.JFrame;
import javax.swing.JTextField;
import java.awt.*;
import javax.swing.*;
class MKeyListener extends KeyAdapter
{
static int n = 0;
@Override
public void keyPressed(KeyEvent event)
{
if (event.getKeyCode() == KeyEvent.VK_ESCAPE)
{
n += 1;
if(n % 2 == 1)
{
}
else
{
System.out.println("Not Quitting now");
}
}
else if(event.getKeyCode() == KeyEvent.VK_ENTER && n % 2 == 1)
{
System.out.println("Quitting now...");
try
{
Thread.sleep(200);
}
catch(Exception e)
{
}
System.exit(0);
}
}
}
這是我的主要方法
import java.awt.event.KeyAdapter;
import java.awt.event.KeyEvent;
import javax.swing.JFrame;
import javax.swing.JTextField;
import java.awt.*;
import javax.swing.*;
import java.awt.Graphics;
import java.awt.image.BufferedImage;
import java.io.File;
import java.io.IOException;
import javax.imageio.ImageIO;
import javax.swing.JLabel;
import javax.swing.ImageIcon;
public class Main
{
public static void main(String[] args) throws Exception
{
JTextField textField = new JTextField();
textField.addKeyListener(new MKeyListener());
JFrame jframe = new JFrame();
jframe.add(textField);
jframe.setSize(1000, 1000);
jframe.setTitle("First Development In JAVA Try : Day 3");
jframe.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
jframe.setVisible(true);
}
}
有人可以建議一種在用戶按下鍵時添加該圖像的方法嗎?
您問題的“基本”答案是,您需要使用某種“觀察者模式”。
目的是,您的“鍵處理程序”將監視某種鍵盤輸入,當發生某些觸發器(按下特定鍵)時,它將通知所有感興趣的觀察者該動作。
Swing 將這些稱為“偵聽器”,因此,您已經看到了它們的運行情況。
KeyListener
添加到JTextField
,這只是一個壞主意。 如果你想監視輸入到JTextField
,使用DocumentListener
在球場上的Document
。 如果要監視“常規”鍵盤輸入,請改用鍵綁定 API 。Thread.sleep
,這只會導致無休止的問題(和憤怒的用戶)以下示例使用鍵綁定 API 來監控Q 、 W 、 E 、 S 、 D 、 Z 、 X 、 C作為 8 個方向的簡單表示。
該示例使用了一個簡單的“偵聽器”,它通知感興趣的一方已經按下了某個方向。 您不限於單個方法,例如,您可以將方法直接映射到特定操作,即keyHandlerPerformExit
,它在觸發某些“退出”鍵序列時調用。
這個例子也讓Action
直接觸發回調到KeyHanderListener
,同樣,你不需要做這個,你能有Action
回調的方法KeyHandler
,然后它可以執行一些額外的計算或操作和然后,根據你想做什么,然后通知聽眾
import java.awt.Color;
import java.awt.Dimension;
import java.awt.EventQueue;
import java.awt.GridBagConstraints;
import java.awt.GridBagLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.KeyEvent;
import java.util.HashMap;
import java.util.Map;
import javax.swing.AbstractAction;
import javax.swing.ActionMap;
import javax.swing.InputMap;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.KeyStroke;
import javax.swing.Timer;
import javax.swing.border.LineBorder;
public class Test {
public static void main(String[] args) {
new Test();
}
public Test() {
EventQueue.invokeLater(new Runnable() {
@Override
public void run() {
JFrame frame = new JFrame();
frame.add(new TestPane());
frame.pack();
frame.setLocationRelativeTo(null);
frame.setVisible(true);
}
});
}
public class TestPane extends JPanel {
private Map<KeyHandler.Direction, JPanel> mapPanels;
private KeyHandler keyHandler;
public TestPane() {
mapPanels = new HashMap<>();
setLayout(new GridBagLayout());
GridBagConstraints gbc = new GridBagConstraints();
gbc.gridx = 0;
gbc.gridy = 0;
add(createPanel(KeyHandler.Direction.LEFT_UP), gbc);
gbc.gridx++;
add(createPanel(KeyHandler.Direction.UP), gbc);
gbc.gridx++;
add(createPanel(KeyHandler.Direction.RIGHT_UP), gbc);
gbc.gridx = 0;
gbc.gridy++;
add(createPanel(KeyHandler.Direction.LEFT), gbc);
gbc.gridx++;
add(createPanel(), gbc);
gbc.gridx++;
add(createPanel(KeyHandler.Direction.RIGHT), gbc);
gbc.gridx = 0;
gbc.gridy++;
add(createPanel(KeyHandler.Direction.LEFT_DOWN), gbc);
gbc.gridx++;
add(createPanel(KeyHandler.Direction.DOWN), gbc);
gbc.gridx++;
add(createPanel(KeyHandler.Direction.RIGHT_DOWN), gbc);
keyHandler = new KeyHandler(getInputMap(WHEN_IN_FOCUSED_WINDOW), getActionMap(), new KeyHandlerListener() {
@Override
public void keyHandlerDidPress(KeyHandler.Direction direction) {
activate(direction);
}
});
}
protected JPanel createPanel() {
JPanel panel = new JPanel() {
@Override
public Dimension getPreferredSize() {
return new Dimension(50, 50);
}
};
panel.setBorder(new LineBorder(Color.DARK_GRAY));
return panel;
}
protected JPanel createPanel(KeyHandler.Direction direction) {
JPanel panel = createPanel();
mapPanels.put(direction, panel);
return panel;
}
protected void activate(KeyHandler.Direction direction) {
JPanel panel = mapPanels.get(direction);
panel.setBackground(Color.BLUE);
Timer timer = new Timer(250, new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
panel.setBackground(null);
}
});
timer.setRepeats(false);
timer.start();
}
}
public interface KeyHandlerListener {
public void keyHandlerDidPress(KeyHandler.Direction direction);
}
public class KeyHandler {
public enum Direction {
UP, DOWN, LEFT, RIGHT,
LEFT_UP, RIGHT_UP,
LEFT_DOWN, RIGHT_DOWN
}
public KeyHandler(InputMap inputMap, ActionMap actionMap, KeyHandlerListener listener) {
inputMap.put(KeyStroke.getKeyStroke(KeyEvent.VK_Q, 0), "Press.leftUp");
inputMap.put(KeyStroke.getKeyStroke(KeyEvent.VK_W, 0), "Press.up");
inputMap.put(KeyStroke.getKeyStroke(KeyEvent.VK_E, 0), "Press.rightUp");
inputMap.put(KeyStroke.getKeyStroke(KeyEvent.VK_A, 0), "Press.left");
inputMap.put(KeyStroke.getKeyStroke(KeyEvent.VK_D, 0), "Press.right");
inputMap.put(KeyStroke.getKeyStroke(KeyEvent.VK_Z, 0), "Press.leftDown");
inputMap.put(KeyStroke.getKeyStroke(KeyEvent.VK_X, 0), "Press.down");
inputMap.put(KeyStroke.getKeyStroke(KeyEvent.VK_C, 0), "Press.rightDown");
actionMap.put("Press.leftUp", new DirectionAction(Direction.LEFT_UP, listener));
actionMap.put("Press.up", new DirectionAction(Direction.UP, listener));
actionMap.put("Press.rightUp", new DirectionAction(Direction.RIGHT_UP, listener));
actionMap.put("Press.left", new DirectionAction(Direction.LEFT, listener));
actionMap.put("Press.right", new DirectionAction(Direction.RIGHT, listener));
actionMap.put("Press.leftDown", new DirectionAction(Direction.LEFT_DOWN, listener));
actionMap.put("Press.down", new DirectionAction(Direction.DOWN, listener));
actionMap.put("Press.rightDown", new DirectionAction(Direction.RIGHT_DOWN, listener));
}
protected class DirectionAction extends AbstractAction {
private Direction direction;
private KeyHandlerListener listener;
public DirectionAction(Direction direction, KeyHandlerListener listener) {
this.direction = direction;
this.listener = listener;
}
@Override
public void actionPerformed(ActionEvent e) {
listener.keyHandlerDidPress(direction);
}
}
}
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.