Перевести координаты мыши на дочернюю панель - PullRequest
0 голосов
/ 01 ноября 2019

Я создаю простую Java-игру, которая будет иметь отдельные JPanels для каждого игрового состояния. В приведенном ниже коде они скрываются под AbstractPanel. Но у меня есть слушатели клавиш / мыши на верхней панели (Game).

К сожалению, когда я пытаюсь использовать координаты мыши из Game на currentPanel подпанели, компоненты на подпанели тоже выделяютсярано, например, JButton, расположенный на 100,100, выделяется, когда курсор мыши находится на 90,90. Есть ли способ перевести координаты из родительской панели в дочернюю?

public class Game extends JPanel implements KeyListener, MouseListener, MouseMotionListener {

    private static final int WIDTH = 1024;
    private static final int HEIGHT = 768;

    private AbstractPanel currentPanel = null;

    public Game() {

        Dimension gameSize = new Dimension( WIDTH, HEIGHT );
        menuPanel.setSize( gameSize );
        menuPanel.setPreferredSize( gameSize );
    }

    public static void main( String[] args ) {

        Game game = new Game();
        game.setLayout( new BorderLayout() );
        Dimension gameSize = new Dimension( WIDTH, HEIGHT );

        JFrame frame = new JFrame();
        frame.setDefaultCloseOperation( WindowConstants.EXIT_ON_CLOSE );
        frame.getContentPane().setLayout( new BorderLayout() );
        frame.getContentPane().add( game, BorderLayout.CENTER );
        frame.setSize( gameSize );
        frame.setPreferredSize( gameSize );
        frame.setLocationRelativeTo( null );
        frame.addKeyListener( game );
        frame.addMouseListener( game );
        frame.addMouseMotionListener( game );
        frame.setVisible( true );
    }

    public void mouseClicked( MouseEvent e ) {

        currentPanel.mousePressed( e );
        repaint();
    }

1 Ответ

0 голосов
/ 01 ноября 2019

В случае, если кому-то еще нужен ответ, вот мое обновление: методы мыши в основном классе передают родительский JFrame следующим образом:

    public void mouseClicked( MouseEvent e ) {

        currentPanel.mousePressed( frame, e );
        repaint();
    }

, а в подпанелях эти слушатели начинают с преобразования:

    @Override
    public void mousePressed( Container source, MouseEvent e ) {

        String newItem = null;
        Point clickPoint = SwingUtilities.convertPoint( source, e.getX(), e.getY(), this );
        // some code here
        if( bounds.contains( clickPoint ) ) {
        // some more code here

Благодарю Карлоса Хойбергера в комментарии выше.

...