Swing: закрасьте все остальные компоненты и сохраните события

Что я пытаюсь сделать: нарисуйте вертикальную и горизонтальную линии, которые перпендикулярны друг другу и встречаются там, где указывает мышь. Этакий курсор-трекер.

Моя структура: JFrame -> CustomPanel -> другие панели/компоненты и т.д.

CustomPanel наследуется от JPanel и устанавливается как ContentPane моего JFrame.

Я пытался использовать GlassPane, все работало отлично, но я хочу сохранить свои события, а не отключать их. Я все еще хочу иметь возможность нажимать кнопки и т.

Актуальный вопрос: Рисование поверх компонентов в Swing?. Все ведет себя так, как ожидалось, когда я перемещаю мышь там, где в моей CustomPanel есть пустые места, но все равно не закрашивает другие компоненты.

На изображении он должен был продолжить рисование над кнопкой, но он остановился, когда я вошел в него, а затем возобновился, когда я вышел.

введите здесь описание изображения

Код ниже.

public class Painter {

    /**
     * @param args the command line arguments
     */
    public static void main(String[] args) {
        // TODO code application logic here
        JFrame frame = new JFrame();

        frame.setSize(600, 600);
        frame.setPreferredSize(new Dimension(600, 600));
        frame.setContentPane(new CustomPanel());
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        frame.setVisible(true);
    }
}

class CustomPanel extends JPanel {
    int x = 0;
    int y = 0;

    public CustomPanel() {

        addMouseListener(new AdapterImplementation(this));
        addMouseMotionListener(new AdapterImplementation(this));
        add(new JButton("TESTBTN"));
        setSize(new Dimension(600, 600));
        setPreferredSize(new Dimension(600, 600));
        setVisible(true);
    }

    @Override
    public void paint(Graphics g) {
        super.paint(g);
        g.drawLine(0, y, getWidth(), y);
        g.drawLine(x, 0, x, getHeight());
    }

    public void setX(int x) {
        this.x = x;
    }

    public void setY(int y) {
        this.y = y;
    }
}

и мой адаптер:

public class AdapterImplementation extends MouseAdapter {
    CustomPanel pane;

    public AdapterImplementation(CustomPanel pane) {
        this.pane = pane;
    }

    @Override
    public void mouseDragged(MouseEvent e) {
        int x = e.getX();
        int y = e.getY();
        pane.setX(x);
        pane.setY(y);
        pane.repaint();
    }

    @Override
    public void mouseMoved(MouseEvent e) {
        System.out.println("MOUSE MOVED");
        int x = e.getX();
        int y = e.getY();
        pane.setX(x);
        pane.setY(y);
        pane.repaint();
    }
}

person async    schedule 25.01.2013    source источник
comment
просто предположение ... вам, вероятно, понадобится многослойная панель поверх панели Custom, где вы будете рисовать линии.   -  person Ankit    schedule 25.01.2013


Ответы (1)


Проблема здесь в том, что MouseListeners зарегистрированы с вашим CustomPanel, но не с JButton, поэтому последний не обрабатывает события от слушателей.

Кроме того, как вы видели, при использовании GlassPane события базовых компонентов будут заблокированы.

JLayeredPane можно использовать в качестве самого верхнего контейнера для захвата MouseEvents с помощью ваших текущих слушателей.

Примечание. Переопределите paintComponent вместо paint для пользовательского рисования в Swing и не забудьте вызвать super.paintComponent(g).

person Reimeus    schedule 25.01.2013