简体   繁体   English

KeyListener被忽略了

[英]KeyListener ignored

I am trying to make simple program, exercise actually - its description is included in attached code. 我正在尝试制作简单的程序,实际上是练习 - 它的描述包含在附加代码中。 My trouble is that keyPressed() method is completely ignored. 我的麻烦是完全忽略了keyPressed()方法。 Please take a look if possible and provide me with some hints on what I am doing wrong. 请尽可能看看,并向我提供一些关于我做错的提示。

class exercise_chapter10_5

/*
 White a program that creates a window with a menu bar. The menu bar     should have
 a single menu that has 10 menu items with text: 0, 1, . . . , 9,     respectively. When a user
 selects a number from the menu bar, the corresponding number should be     displayed
 inside the panel of the window. Once finished, add a key listener. When     a user types
 a digit between 0 and 9, the digit should be displayed in the window.     Create an array
 to store the menu items.
 */
package exercise;

import java.awt.Color;
import java.awt.Font;
import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.KeyEvent;
import java.awt.event.KeyListener;
import java.awt.geom.Rectangle2D;
import java.util.ArrayList;
import javax.swing.JFrame;
import javax.swing.JMenu;
import javax.swing.JMenuBar;
import javax.swing.JMenuItem;
import javax.swing.JPanel;

public class exercise_chapter10_5 {

    public static void main(String[] args) throws Exception {

        MyFrame frame = new MyFrame();
        frame.setVisible(true);
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    }
}

class MyFrame extends JFrame {

    MyPanel p;

    public MyFrame() {
        setSize(300, 300);

        JMenuBar bar = new JMenuBar();
        setJMenuBar(bar);

        //a window with a menu bar
        JMenu numbers = new JMenu(" Numbers ");
        bar.add(numbers);

        // Create an array to store the menu items
        ArrayList<JMenuItem> menuitems = new ArrayList<JMenuItem>();
        for (int i = 0; i < 10; i++) {
            menuitems.add(new JMenuItem(i + ""));
        }

        for (int i = 0; i < menuitems.size(); i++) {
            numbers.add(menuitems.get(i));

        }

        // add action listener for every menu item
        for (int i = 0; i < menuitems.size(); i++) {
            menuitems.get(i).addActionListener(new NumberListener(i));
        }

        p = new MyPanel();
        add(p);

    }

    class NumberListener implements ActionListener {

    private int number;

    public NumberListener(int num) {
        this.number = num;
    }

    @Override
    public void actionPerformed(ActionEvent e) {
        System.out.println(e.getActionCommand());
        p.changeNumber(number);
    }
}
}

class MyPanel extends JPanel {

    private int number;

    public void changeNumber(int num) {
        this.number = num;
        repaint();
    }

    public MyPanel()  {

        this.setFocusable(true);
        this.addKeyListener(new KeyAdapter() {

        @Override
        public void keyPressed(KeyEvent e) {

            changeNumber((e.getKeyChar() - '0'));

            //System.out.println(e.getKeyChar());
            System.out.println("In Panel the number typed is: " + number);
            repaint();
        }
    });

    System.out.println("Panel was born");


     addMouseListener(new MouseAdapter() {
        public void mousePressed(MouseEvent e) {
            if (e.getButton() == 1) {
                System.out.println("current number is: " + number);
                repaint();
            }
            if (e.getButton() == 3) {// right button was pressed
                System.out.println("Right mouse button was pressed");
                repaint();
            }
        }
    });
}

    public void showMessage(String s, Graphics2D g2) {
        Font myFont = new Font(" SansSerif ", Font.BOLD + Font.ITALIC, 40);
        g2.setFont(myFont);
        g2.setColor(Color.RED);
        Rectangle2D textBox = myFont.getStringBounds(s, g2.getFontRenderContext());
        g2.drawString(s, (int) (getWidth() / 2 - textBox.getWidth() / 2), (int) (getHeight() / 2 - textBox.getHeight()));
    }

    @Override
    public void paintComponent(Graphics g) {
        super.paintComponent(g);
        Graphics2D g2 = (Graphics2D) g;
        showMessage(Integer.toString(number), g2);
    }

}

Thanks for your hints. 谢谢你的提示。 What worked for me here is that I had to call setFocusable(true) method within JPanel constructor first. 这里对我有用的是我必须首先在JPanel构造函数中调用setFocusable(true)方法。

class MyPanel extends JPanel {

private int number;

public void changeNumber(int num) {
    this.number = num;
    repaint();
}

public MyPanel()  {

    this.setFocusable(true);
    this.addKeyListener(new KeyAdapter() {

        @Override
        public void keyPressed(KeyEvent e) {

            changeNumber((e.getKeyChar() - '0'));

            //System.out.println(e.getKeyChar());
            System.out.println("In Panel the number typed is: " + number);
            repaint();
        }
    });

    System.out.println("Panel was born");


     addMouseListener(new MouseAdapter() {
        public void mousePressed(MouseEvent e) {
            if (e.getButton() == 1) {
                System.out.println("current number is: " + number);
                repaint();
            }
            if (e.getButton() == 3) {// right button was pressed
                System.out.println("Right mouse button was pressed");
                repaint();
            }
        }
    });
}

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM