【问题标题】:Action is not getting triggered when using Event handlers- KeyListener使用事件处理程序 - KeyListener 时未触发操作
【发布时间】:2019-03-07 07:05:50
【问题描述】:

所以我是事件处理程序的新手,我想创建一个程序,我在框架内制作了一个紫色面板,如果用户单击面板区域中的鼠标按钮,然后用键盘键入 %,我希望面板在面板区域内绘制一条线段。这只是测试事件处理程序。现在,我正在尝试它,但它不起作用。所有帮助将不胜感激。拿到手之后,我想试试 repaint() 方法,如果有人做了和以前一样的动作,我想检查一下 Panel 的背景。如果你能帮我解决这两个问题,那就太好了,但这不是优先事项。谢谢你。

 import java.awt.Graphics;          // for classes Graphics, Color, Font, Image
import java.awt.Color;
import java.awt.Font;

import java.awt.event.KeyEvent; // for classes KeyListener, MouseListener
import java.awt.event.KeyListener;
import java.awt.event.MouseEvent;
import java.awt.event.MouseListener;

import javax.swing.JFrame;      // for classes JFrame, JPanel, JLabel
import javax.swing.JPanel;

public class GardenGrows
{
    public GardenGrows()
    {
    }

    public static void main(String[] args)
    {
        GardenGrows gg = new GardenGrows();
        gg.runIt();
    }

    // makes the frame and handles all properties of the frame 
    // also instantiates the Garden.java object 
    public void runIt()
    {
        JFrame frame = new JFrame ("Garden");

        frame.setDefaultCloseOperation( frame.EXIT_ON_CLOSE );
        frame.setLayout(null);

        frame.setBackground(Color.GRAY);
        frame.setSize( 1200,700);
        frame.setLocation( 50, 10);     
        frame.setResizable(true);
        frame.setVisible(true);

        Garden gar = new Garden();
        frame.getContentPane().add(gar);


    }

}

class Garden extends JPanel implements KeyListener, MouseListener
{
    private boolean mouseClicked;
    private boolean keyClicked;
    private int xpos;
    private int ypos; 

    public Garden()
    {
        mouseClicked = false;
        keyClicked = false;
        addKeyListener(this);
        addMouseListener(this);

        setBackground(Color.PINK);
        setLocation(50,50);
        setSize(1000,500);



    }



    public void mousePressed(MouseEvent evt)
    {
        int x = evt.getX();
        int y = evt.getY();

        if(x>=50 || x<=1050 && y<=50 || y>=550)
        {
            mouseClicked = true;
        }
    } 
    public void mouseClicked(MouseEvent evt){}
    public void mouseReleased(MouseEvent evt){}
    public void mouseEntered(MouseEvent evt){}
    public void mouseExited(MouseEvent evt){}

    public void keyReleased(KeyEvent evt){}
    public void keyPressed(KeyEvent evt){}

    public void keyTyped(KeyEvent evt)
    {
        int letter = evt.getKeyCode();
        if (letter == 13)
        {
             keyClicked =true;
        }
    }

    public void paintComponent(Graphics g)
    {
        super.paintComponent(g);

        if(keyClicked && mouseClicked)
             g.drawLine(50,0,110,120);

    }


}

【问题讨论】:

    标签: java swing keylistener repaint mouselistener


    【解决方案1】:

    在 JPanel 中制作一个关键的监听器不会那么简单,因为它是不可聚焦的。 (想想一个 JTextField,当你在上面写文本时,它是有焦点的)。所以,为了完成这项工作,你必须use KeyBindings。在实践中,从您的 JPanel 中删除 KeyListener 实现,并使用 KeyBindings。

    public class GardenGrows {
        public GardenGrows() {
        }
    
        public static void main(String[] args) {
            SwingUtilities.invokeLater(() -> {
                // All swing applications must run on EDT Thread
                GardenGrows gg = new GardenGrows();
                gg.runIt();
            });
        }
    
        // makes the frame and handles all properties of the frame
        // also instantiates the Garden.java object
        public void runIt() {
            JFrame frame = new JFrame("Garden");
    
            frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
            frame.setLayout(null);
    
            frame.setBackground(Color.GRAY);
            frame.setSize(1200, 700);
            frame.setLocation(50, 10);
            frame.setResizable(true);
            frame.setVisible(true);
    
            Garden gar = new Garden();
            frame.getContentPane().add(gar);
    
        }
    
    }
    
    class Garden extends JPanel implements MouseListener {
        private boolean mouseClicked;
        private boolean keyClicked;
        private int xpos;
        private int ypos;
    
        public Garden() {
            mouseClicked = false;
            keyClicked = false;
            addMouseListener(this);
    
            setBackground(Color.PINK);
            setLocation(50, 50);
            setSize(1000, 500);
            getInputMap(JComponent.WHEN_IN_FOCUSED_WINDOW).put(KeyStroke.getKeyStroke(KeyEvent.VK_5, KeyEvent.SHIFT_MASK),
                    "percentageClicked");
            getActionMap().put("percentageClicked", new AbstractAction() {
    
                @Override
                public void actionPerformed(ActionEvent e) {
                    keyClicked = true;
                    repaint(); // Try to draw the line
                }
            });
        }
    
        public void mousePressed(MouseEvent evt) {
            int x = evt.getX();
            int y = evt.getY();
    
            if (x >= 50 || x <= 1050 && y <= 50 || y >= 550) {
                mouseClicked = true;
                repaint(); // Try to draw the line
            }
        }
    
        public void mouseClicked(MouseEvent evt) {
        }
    
        public void mouseReleased(MouseEvent evt) {
        }
    
        public void mouseEntered(MouseEvent evt) {
        }
    
        public void mouseExited(MouseEvent evt) {
        }
    
        public void paintComponent(Graphics g) {
            super.paintComponent(g);
    
            if (keyClicked && mouseClicked)
                g.drawLine(50, 0, 110, 120);
    
        }
    
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2012-04-15
      • 2011-09-07
      • 1970-01-01
      • 2020-08-07
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多