Действие не запускается при использовании обработчиков событий - KeyListener - PullRequest
0 голосов
/ 07 марта 2019

Итак, я новичок в обработчиках событий, и я хотел создать программу, в которой я создал панель Purple внутри рамки, и если пользователь нажимает кнопку мыши в области панели, а затем вводит% с помощью клавиатуры, я хотите, чтобы панель нарисовала отрезок линии в области панели. Это просто тестирование обработчиков событий. Сейчас я пытаюсь, но это не работает. Вся помощь будет оценена. После этого я хочу попробовать метод 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);

    }


}

1 Ответ

2 голосов
/ 07 марта 2019

Заставить ключевого слушателя работать в JPanel, будет не так просто, потому что он не фокусируемый. (Подумайте о JTextField, когда вы пишете на нем текст, он сфокусирован). Таким образом, для того, чтобы сделать эту работу, вам придется использовать KeyBindings . На практике удалите реализацию KeyListener из вашей JPanel и используйте 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);

    }

}
...