Изображение и курсор не совпадают в mouseEntered - PullRequest
0 голосов
/ 04 июня 2018

Я сейчас разрабатываю игровой графический интерфейс.

Но у меня небольшая проблема во время программирования.

Я делаю кнопку для запуска и центрирую кнопку.

ИЯ переопределяю mouseEntered и mouseExited.

Когда я запускаю программу, изображение располагается в центре, но курсор реагирует с расстояния.

Я не знаю, почему изображение и курсор не совпадают ...

Это мой основной код.

    package PoET;

    public class Main {

        public static final int SCREEN_WIDTH=600;
        public static final int SCREEN_HEIGHT=800;

        public static void main(String[] args) {
            // TODO Auto-generated method stub
            new Display();
        }

    }

А это мой код дисплея.

package PoET;

import java.awt.Color;
import java.awt.Cursor;
import java.awt.Graphics;
import java.awt.Image;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;
import java.awt.event.MouseMotionAdapter;

import javax.swing.ImageIcon;
import javax.swing.JButton;
import javax.swing.JFrame; 
import javax.swing.JLabel;

public class Display extends JFrame {

private Image screenImage;
private Graphics screenGraphic;

private Image explainImage = new ImageIcon(Main.class.getResource("../images/explainSample.jpg")).getImage();
private Image introBackground = new ImageIcon(Main.class.getResource("../images/background.jpg")).getImage();
private JLabel menuBar = new JLabel(new ImageIcon(Main.class.getResource("../images/menuBar.png")));

private ImageIcon quitButtonBasicImage = new ImageIcon(Main.class.getResource("../images/quitButtonBasic.png"));
private ImageIcon quitButtonEnteredImage = new ImageIcon(Main.class.getResource("../images/quitButtonPressed.png"));

private ImageIcon startButtonBasicImage = new ImageIcon(Main.class.getResource("../images/startButtonBasic.png"));
private ImageIcon startButtonEnteredImage = new ImageIcon(Main.class.getResource("../images/startButtonEntered.png"));
private ImageIcon developerButtonBasicImage = new ImageIcon(Main.class.getResource("../images/developerButtonBasic.png"));
private ImageIcon developerButtonEnteredImage = new ImageIcon(Main.class.getResource("../images/developerButtonEntered.png"));

private ImageIcon goButtonBasicImage = new ImageIcon(Main.class.getResource("../images/startButtonBasic.png"));
private ImageIcon goButtonEnteredImage = new ImageIcon(Main.class.getResource("../images/startButtonEntered.png"));

private JButton quitButton = new JButton(
        quitButtonBasicImage);
private JButton startButton = new JButton(
        startButtonBasicImage);
private JButton developerButton = new JButton(
        developerButtonBasicImage);
private JButton goButton = new JButton(
        new ImageIcon(Main.class.getResource("../images/startButtonEntered.png")));


private int mouseX, mouseY;
private boolean isExplainScreen=false;

    public Display() {
    setUndecorated(true);
    setTitle("RogueLike PoET");
    setSize(Main.SCREEN_WIDTH, Main.SCREEN_HEIGHT);
    setResizable(false); 
    setLocationRelativeTo(null); 
    setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    setVisible(true);
    setBackground(new Color(0, 0, 0, 0));
    setLayout(null);

    //quitButton.setBounds(560, 30, 30, 30);
    quitButton.setBounds(400, 200, 30, 30);
    quitButton.setBorderPainted(false);
    quitButton.setContentAreaFilled(false);
    quitButton.setFocusPainted(false);
    quitButton.addMouseListener(new MouseAdapter() {
        @Override
        public void mouseEntered(MouseEvent e) {
            quitButton.setIcon(quitButtonEnteredImage);
            quitButton.setCursor(new Cursor(Cursor.HAND_CURSOR));
        }

        @Override
        public void mouseExited(MouseEvent e) {
            quitButton.setIcon(quitButtonBasicImage);
            quitButton.setCursor(new Cursor(Cursor.HAND_CURSOR));

        }
        @Override
        public void mousePressed(MouseEvent e) {
            System.exit(0);
        }
    });
    add(quitButton);

    menuBar.setBounds(0, 0, 600, 30);
    menuBar.addMouseListener(new MouseAdapter() {
        @Override
        public void mousePressed(MouseEvent e) {
            mouseX=e.getX();
            mouseY=e.getY();
        }
    });
    menuBar.addMouseMotionListener(new MouseMotionAdapter() {
        @Override
        public void mouseDragged(MouseEvent e) {
            int x=e.getXOnScreen();
            int y=e.getYOnScreen();
            setLocation(x-mouseX,y-mouseY);
        }
    });
    add(menuBar);


    startButton.setBounds(150, 540, 300, 60);
    startButton.setBorderPainted(false);
    startButton.setContentAreaFilled(false);
    startButton.setFocusPainted(false);
    startButton.addMouseListener(new MouseAdapter() {
        @Override
        public void mouseEntered(MouseEvent e) {
            startButton.setIcon(startButtonEnteredImage);
            startButton.setCursor(new Cursor(Cursor.HAND_CURSOR));
        }

        @Override
        public void mouseExited(MouseEvent e) {
            startButton.setIcon(startButtonBasicImage);
            startButton.setCursor(new Cursor(Cursor.DEFAULT_CURSOR));

        }

        @Override
        public void mousePressed(MouseEvent e) {
            startButton.setVisible(false);
            goButton.setVisible(true);
            introBackground=new ImageIcon(Main.class.getResource("../images/background2.jpg")).getImage();
            isExplainScreen=true;
        }
    });
    add(startButton);

    developerButton.setBounds(150, 610, 300, 60);
    developerButton.setBorderPainted(false);
    developerButton.setContentAreaFilled(false);
    developerButton.setFocusPainted(false);
    developerButton.addMouseListener(new MouseAdapter() {
        @Override
        public void mouseEntered(MouseEvent e) {
            developerButton.setIcon(developerButtonEnteredImage);
            developerButton.setCursor(new Cursor(Cursor.HAND_CURSOR));
        }

        @Override
        public void mouseExited(MouseEvent e) {
            developerButton.setIcon(developerButtonBasicImage);
            developerButton.setCursor(new Cursor(Cursor.DEFAULT_CURSOR));

        }

        @Override
        public void mousePressed(MouseEvent e) {
            developerButton.setVisible(false);
            goButton.setVisible(true);
            introBackground=new ImageIcon(Main.class.getResource("../images/background2.jpg")).getImage();
            isExplainScreen=false;
        }
    });
    add(developerButton);

    goButton.setVisible(false);
    goButton.setBounds(150, 720, 300, 60);
    goButton.setBorderPainted(false);
    goButton.setContentAreaFilled(false);
    goButton.setFocusPainted(false);
    goButton.addMouseListener(new MouseAdapter() {
        @Override
        public void mouseEntered(MouseEvent e) {
            goButton.setIcon(goButtonEnteredImage);
            goButton.setCursor(new Cursor(Cursor.HAND_CURSOR));
        }

        @Override
        public void mouseExited(MouseEvent e) {
            goButton.setIcon(goButtonBasicImage);
            goButton.setCursor(new Cursor(Cursor.DEFAULT_CURSOR));

        }

        @Override
        public void mousePressed(MouseEvent e) {
            goButton.setVisible(false);
            introBackground=new ImageIcon(Main.class.getResource("../images/background2.jpg")).getImage();
            isExplainScreen=true;
        }
    });
    add(goButton);

    Music introMusic = new Music("introMusic.mp3", true);
    introMusic.start();
}

public void paint(Graphics g) {
    screenImage = createImage(Main.SCREEN_WIDTH, Main.SCREEN_HEIGHT);
    screenGraphic = screenImage.getGraphics();
    screenDraw(screenGraphic);
    g.drawImage(screenImage, 0, 0, null);
}

public void screenDraw(Graphics g) {
    g.drawImage(introBackground, 0, 0, null);
    paintComponents(g);
    if(isExplainScreen) {
        g.drawImage(explainImage, 50, 50,null);
    }
    this.repaint();
}

}

1 Ответ

0 голосов
/ 04 июня 2018

Итак, я сократил ваш пример, удалил MouseListener s и просто установил курсор кнопок, и он работает нормально - я сбросил кнопки, чтобы нарисовать их границу и содержимое, чтобы я мог видеть их экстент, и курсор меняетсякогда мышь входит / существует в область, которую она охватывает, без проблем

import java.awt.Cursor;
import java.awt.Graphics;
import java.awt.Image;
import javax.swing.ImageIcon;
import javax.swing.JButton;
import javax.swing.JFrame;

public class Display extends JFrame {

    public static final int SCREEN_WIDTH = 600;
    public static final int SCREEN_HEIGHT = 800;

    public static void main(String[] args) {
        // TODO Auto-generated method stub
        new Display();
    }
    private Image screenImage;
    private Graphics screenGraphic;

//  private Image explainImage = new ImageIcon(Main.class.getResource("../images/explainSample.jpg")).getImage();
//  private Image introBackground = new ImageIcon(Main.class.getResource("../images/background.jpg")).getImage();
//  private JLabel menuBar = new JLabel(new ImageIcon(Main.class.getResource("../images/menuBar.png")));
//
//  private ImageIcon quitButtonBasicImage = new ImageIcon(Main.class.getResource("../images/quitButtonBasic.png"));
//  private ImageIcon quitButtonEnteredImage = new ImageIcon(Main.class.getResource("../images/quitButtonPressed.png"));
//
//  private ImageIcon startButtonBasicImage = new ImageIcon(Main.class.getResource("../images/startButtonBasic.png"));
//  private ImageIcon startButtonEnteredImage = new ImageIcon(Main.class.getResource("../images/startButtonEntered.png"));
//  private ImageIcon developerButtonBasicImage = new ImageIcon(Main.class.getResource("../images/developerButtonBasic.png"));
//  private ImageIcon developerButtonEnteredImage = new ImageIcon(Main.class.getResource("../images/developerButtonEntered.png"));
//
//  private ImageIcon goButtonBasicImage = new ImageIcon(Main.class.getResource("../images/startButtonBasic.png"));
//  private ImageIcon goButtonEnteredImage = new ImageIcon(Main.class.getResource("../images/startButtonEntered.png"));
    private JButton quitButton = new JButton(
                    "Quote");
    private JButton startButton = new JButton(
                    "Start");
    private JButton developerButton = new JButton(
                    "Developer");
    private JButton goButton = new JButton(
                    new ImageIcon("Go"));

    private int mouseX, mouseY;
    private boolean isExplainScreen = false;

    public Display() {
        setUndecorated(true);
        setTitle("RogueLike PoET");
        setSize(SCREEN_WIDTH, SCREEN_HEIGHT);
        setResizable(false);
        setLocationRelativeTo(null);
        setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        setVisible(true);
//      setBackground(new Color(0, 0, 0, 0));
        setLayout(null);

        //quitButton.setBounds(560, 30, 30, 30);
        quitButton.setBounds(400, 200, 30, 30);
//      quitButton.setBorderPainted(false);
//      quitButton.setContentAreaFilled(false);
        quitButton.setFocusPainted(false);
        quitButton.setCursor(new Cursor(Cursor.HAND_CURSOR));
        add(quitButton);

        startButton.setBounds(150, 540, 300, 60);
//      startButton.setBorderPainted(false);
//      startButton.setContentAreaFilled(false);
        startButton.setFocusPainted(false);
        startButton.setCursor(new Cursor(Cursor.HAND_CURSOR));
        add(startButton);

        developerButton.setBounds(150, 610, 300, 60);
//      developerButton.setBorderPainted(
//                      false);
//      developerButton.setContentAreaFilled(
//                      false);
        developerButton.setFocusPainted(
                        false);
        developerButton.setCursor(new Cursor(Cursor.HAND_CURSOR));
        add(developerButton);

        goButton.setVisible(
                        false);
        goButton.setBounds(
                        150, 720, 300, 60);
//      goButton.setBorderPainted(
//                      false);
//      goButton.setContentAreaFilled(
//                      false);
        goButton.setFocusPainted(
                        false);
        goButton.setCursor(new Cursor(Cursor.HAND_CURSOR));
        add(goButton);
    }

    public void paint(Graphics g) {
        screenImage = createImage(SCREEN_WIDTH, SCREEN_HEIGHT);
        screenGraphic = screenImage.getGraphics();
        screenDraw(screenGraphic);
        g.drawImage(screenImage, 0, 0, null);
    }

    public void screenDraw(Graphics g) {
//      g.drawImage(introBackground, 0, 0, null);
        paintComponents(g);
        if (isExplainScreen) {
//          g.drawImage(explainImage, 50, 50, null);
        }
        this.repaint();
    }
}

Наблюдения

  • Не переопределяйте paint контейнера верхнего уровня, например JFrame.JFrame является составным компонентом (он имеет ряд дочерних компонентов, составляющих его базовую функциональность), переопределение paint может отрицательно повлиять на то, как эти компоненты окрашиваются.В отличие от контейнеров верхнего уровня, компоненты Swing по умолчанию имеют двойную буферизацию.
  • Кроме того, область «видимого просмотра» и область «окна» - это два разных понятия.Для получения дополнительной информации см. Как получить ТОЧНУЮ середину экрана, даже если изменить размер
  • Кроме того, вы можете рисовать под декорациями окон (я знаю, это неокрашенное окно,но это все еще плохая привычка)
  • Не пытайтесь поместить ВСЕ свою логику в один метод класса / рисования.Вместо этого разбивайте свои экраны на отдельные компоненты и используйте что-то вроде CardLayout для переключения между ними

Это ...

setSize(Main.SCREEN_WIDTH, Main.SCREEN_HEIGHT);

, как правило, плохая идея.Лучше позволить дочерним компонентам диктовать свои предпочтительные размеры и просто pack окно вокруг них

Не вызывать setVisible(true); до того, как вы установили базовый пользовательский интерфейс, в противном случае некоторые компоненты могут не бытьнарисовано

Я не уверен, что вам подойдет от setBackground(new Color(0, 0, 0, 0));, но, исходя из вашего нынешнего дизайна, это выглядит как пустая трата

Не звоните this.repaint();или выполните любую другую операцию внутри цепочки краски, которая может вызвать repaint.Это приведет вас к бесконечному циклу, который в конечном итоге будет потреблять все ваши циклы ЦП

setLayout(null); не рекомендуется - многое зависит от того, как выстраиваются компоненты, вам предстоит много работывоспроизвести его

Вместо этого это может выглядеть примерно так (как отправная точка) ...

import java.awt.Cursor;
import java.awt.Dimension;
import java.awt.EventQueue;
import java.awt.Graphics;
import javax.swing.ImageIcon;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.UIManager;
import javax.swing.UnsupportedLookAndFeelException;

public class Test {

    public static void main(String[] args) {
        new Test();
    }

    public Test() {
        EventQueue.invokeLater(new Runnable() {
            @Override
            public void run() {
                try {
                    UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName());
                } catch (ClassNotFoundException | InstantiationException | IllegalAccessException | UnsupportedLookAndFeelException ex) {
                    ex.printStackTrace();
                }

                JFrame frame = new JFrame("Testing");
                frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
                frame.add(new Display());
                frame.pack();
                frame.setLocationRelativeTo(null);
                frame.setVisible(true);
            }
        });
    }

    public class Display extends JPanel {

        //  private Image explainImage = new ImageIcon(Main.class.getResource("../images/explainSample.jpg")).getImage();
        //  private Image introBackground = new ImageIcon(Main.class.getResource("../images/background.jpg")).getImage();
        //  private JLabel menuBar = new JLabel(new ImageIcon(Main.class.getResource("../images/menuBar.png")));
        //
        //  private ImageIcon quitButtonBasicImage = new ImageIcon(Main.class.getResource("../images/quitButtonBasic.png"));
        //  private ImageIcon quitButtonEnteredImage = new ImageIcon(Main.class.getResource("../images/quitButtonPressed.png"));
        //
        //  private ImageIcon startButtonBasicImage = new ImageIcon(Main.class.getResource("../images/startButtonBasic.png"));
        //  private ImageIcon startButtonEnteredImage = new ImageIcon(Main.class.getResource("../images/startButtonEntered.png"));
        //  private ImageIcon developerButtonBasicImage = new ImageIcon(Main.class.getResource("../images/developerButtonBasic.png"));
        //  private ImageIcon developerButtonEnteredImage = new ImageIcon(Main.class.getResource("../images/developerButtonEntered.png"));
        //
        //  private ImageIcon goButtonBasicImage = new ImageIcon(Main.class.getResource("../images/startButtonBasic.png"));
        //  private ImageIcon goButtonEnteredImage = new ImageIcon(Main.class.getResource("../images/startButtonEntered.png"));
        private JButton quitButton = new JButton(
                        "Quote");
        private JButton startButton = new JButton(
                        "Start");
        private JButton developerButton = new JButton(
                        "Developer");
        private JButton goButton = new JButton(
                        new ImageIcon("Go"));

        private int mouseX, mouseY;
        private boolean isExplainScreen = false;

        public Display() {
            setLayout(null);

            //quitButton.setBounds(560, 30, 30, 30);
            quitButton.setBounds(400, 200, 30, 30);
            //      quitButton.setBorderPainted(false);
            //      quitButton.setContentAreaFilled(false);
            quitButton.setFocusPainted(false);
            quitButton.setCursor(new Cursor(Cursor.HAND_CURSOR));
            add(quitButton);

            startButton.setBounds(150, 540, 300, 60);
            //      startButton.setBorderPainted(false);
            //      startButton.setContentAreaFilled(false);
            startButton.setFocusPainted(false);
            startButton.setCursor(new Cursor(Cursor.HAND_CURSOR));
            add(startButton);

            developerButton.setBounds(150, 610, 300, 60);
            //      developerButton.setBorderPainted(
            //                      false);
            //      developerButton.setContentAreaFilled(
            //                      false);
            developerButton.setFocusPainted(
                            false);
            developerButton.setCursor(new Cursor(Cursor.HAND_CURSOR));
            add(developerButton);

            goButton.setVisible(
                            false);
            goButton.setBounds(
                            150, 720, 300, 60);
            //      goButton.setBorderPainted(
            //                      false);
            //      goButton.setContentAreaFilled(
            //                      false);
            goButton.setFocusPainted(
                            false);
            goButton.setCursor(new Cursor(Cursor.HAND_CURSOR));
            add(goButton);
        }

        @Override
        public Dimension getPreferredSize() {
            return new Dimension(600, 800);
        }

        @Override
        protected void paintComponent(Graphics g) {
            super.paintComponent(g);
            g.drawImage(introBackground, 0, 0, null);

            // This should be done else where
//              if (isExplainScreen) {
//                  //          g.drawImage(explainImage, 50, 50, null);
//              }
            //this.repaint();
        }
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...