Пользовательская кнопка Java, расширенный Jcomponent - mouseListener не отвечает - PullRequest
0 голосов
/ 29 августа 2018

Я работаю над платформерной игрой для моего последнего года в HS. Недавно я решил внедрить HUD, где я могу приостановить, сохранить или выйти из игры. Я успешно позаботился о классах, объектах и ​​рисунках, за исключением обнаружения событий мыши.

Класс Button является классом private sub-class из Hud, он расширяет JComponent и реализует MouseListener. Все (обязательные) методы MouseListener также были реализованы, но они, кажется, не срабатывают, когда должно быть четное, например, когда мышь вводит границы Button object.

Когда гуглил по этой проблеме, в некоторых ответах говорилось, что addMouseListener(this) отсутствует в классе, но у меня уже есть.

Как заставить класс Button обнаруживать события мыши? (т. е. зависать или щелкать)

Вот как это выглядит, когда я запускаю программу: enter image description here

Hud.java

import java.awt.Color;
import java.awt.Font;
import java.awt.Graphics2D;
import java.awt.event.MouseEvent;
import java.awt.event.MouseListener;

import java.util.ArrayList;

import javax.swing.JComponent;

public class Hud {

    private ArrayList<Button> Buttons;

    public Hud() {
        System.out.println("Hud created");
        init();
    }

    private void init() {
        Buttons = new ArrayList<Button>();
        Buttons.add(new Button(10,  10, 100, 40, "Save",    10, new Color(255,126,126), new Color(255,78,78),Color.WHITE));
        Buttons.add(new Button(115, 10, 100, 40, "Pause",   10, new Color(255,126,126), new Color(255,78,78),Color.WHITE));
        Buttons.add(new Button(220, 10, 100, 40, "Quit",    10, new Color(255,126,126), new Color(255,78,78),Color.WHITE));
        Buttons.add(new Button(Config.WINDOW_WH[0]-110, 10, 100, 40, "Settings", 10, new Color(255,126,126), new Color(255,78,78),Color.WHITE));
    }

    public void update() {
        for(Button b: Buttons)
            b.update();

    }

    public void render(Graphics2D g) {
        for(Button b: Buttons) {
            b.render(g);
        }


    }


    /**
        Custom Buttons
     **/
    private class Button extends JComponent implements MouseListener {

        /**
         * 
         */
        private static final long serialVersionUID = 1L;
        private int width, height, x, y, border_radius;
        private String btnText;
        private Font font;
        private Color fontColor;
        /*
         *  Blue    = (126,172,255)
         *  Red     = (255,126,126)
         *  Green   = (179,255,126)
         *  Purple  = (243,126,255) 
         */
        private Color btnColor;
        private Color hoverColor;
        private boolean mouseEntered, mouseClicked, mouseReleased;


        public Button(int x, int y, int width, int height, String btnText, int borderRadius, Color defaultColor, Color hoverColor, Color fontColor) {
            this.width = width;
            this.height = height;
            this.x = x;
            this.y = y;
            this.btnText = btnText;
            this.border_radius = borderRadius;
            this.btnColor = defaultColor;
            this.font = new Font("Monospaced", Font.BOLD, 15);
            this.fontColor = fontColor;

            addMouseListener(this);

            mouseEntered = mouseClicked = mouseReleased = false;

        }

        public void update() {
            /*if((Game.lastMouse_clickX > this.x && Game.lastMouse_clickX < this.x + this.width)
            && (Game.lastMouse_clickY > this.y && Game.lastMouse_clickY < this.y + this.height)) {
                System.out.println("Clicked on button");
            }*/

        }


        public void render(Graphics2D g) {
            printBtnText(g);
        }

        public void printBtnText(Graphics2D g) {
            g.setColor(this.btnColor);
            g.fillRoundRect(this.x, this.y, this.width, this.height, this.border_radius, this.border_radius);
            g.setColor(this.fontColor);
            g.setFont(this.font);
            g.drawString(this.btnText, this.x+(this.width/this.btnText.length()), this.y+25);
        }

        @Override
        public void mouseClicked(MouseEvent e) { this.mouseClicked = true; System.out.println("Clicked");}

        @Override
        public void mousePressed(MouseEvent e) { this.mouseReleased = false; System.out.println("Pressed");}

        @Override
        public void mouseReleased(MouseEvent e) { this.mouseReleased = true; System.out.println("Released");}

        @Override
        public void mouseEntered(MouseEvent e) { this.mouseEntered = true; System.out.println("Mouse entered"); }

        @Override
        public void mouseExited(MouseEvent e) { this.mouseEntered = false; System.out.println("exited");}


    }


}

1 Ответ

0 голосов
/ 29 августа 2018

Пользовательская кнопка Java, расширенный Jcomponent

Может расширять JComponent, но не является компонентом.

Чтобы использовать компонент, вам нужно создать экземпляр компонента и добавить его в JPanel.

Вместо этого вы просто визуализируете некоторую графику на панель.

Чтобы создать реальный компонент:

  1. произвольная покраска выполняется в методе paintComponent ()
  2. рисование выполняется относительно (0, 0) компонента
  3. вам нужно переопределить метод getPreferredSize ()

Прочтите раздел из учебника Swing по Custom Painting , чтобы ознакомиться с рабочими примерами.

...