簡體   English   中英

如何在Main類的Jframe中添加KeyListener對象的JLabel

[英]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 將這些稱為“偵聽器”,因此,您已經看到了它們的運行情況。

  1. 不要將KeyListener添加到JTextField ,這只是一個壞主意。 如果你想監視輸入到JTextField ,使用DocumentListener在球場上的Document 如果要監視“常規”鍵盤輸入,請改用鍵綁定 API
  2. 不要在事件調度線程中調用Thread.sleep ,這只會導致無休止的問題(和憤怒的用戶)

以下示例使用鍵綁定 API 來監控QWESDZXC作為 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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM