Что такое Java-эквивалент для getElementAt (double x, double y) из библиотеки acm java (GraphicsProgram); - PullRequest
1 голос
/ 13 февраля 2012

в Java, я пытался использовать метод getComponentAt (x, y) из класса контейнера.но для данных (x, y) координат он всегда возвращает мне объект класса javax.swing.JRootPane, даже если (x, y) содержит некоторое изображение / JLabel / JButton.Пример кода, который я использовал для тестирования .. всякий раз, когда я нажимаю на кнопку, я получаю следующий вывод:

class javax.swing.JRootPane 
false

Ответы [ 3 ]

5 голосов
/ 13 февраля 2012

вам нужно искать SwingUtilities # getDeepestComponentAt , пример

import java.awt.Component;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;
import javax.swing.*;

public class TestMouseListener {

    public static void main(String[] args) {
        final JComboBox combo = new JComboBox();
        combo.setEditable(true);
        for (int i = 0; i < 10; i++) {
            combo.addItem(i);
        }
        final JLabel tip = new JLabel();
        tip.setText("Outside combobox");
        JPanel panel = new JPanel();
        panel.add(combo);
        panel.add(tip);
        panel.addMouseListener(new MouseAdapter() {

            @Override
            public void mouseEntered(MouseEvent e) {
                tip.setText("Outside combobox");
            }

            @Override
            public void mouseExited(MouseEvent e) {
                Component c = SwingUtilities.getDeepestComponentAt(
                        e.getComponent(), e.getX(), e.getY());
                tip.setText(c != null && SwingUtilities.isDescendingFrom(
                        c, combo) ? "Inside combo box" : "Outside combobox");
            }
        });
        JFrame frame = new JFrame();
        frame.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);
        frame.add(panel);
        frame.pack();
        frame.setVisible(true);

    }

    private TestMouseListener() {
    }
}
0 голосов
/ 13 февраля 2012

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

Component c = ((Component)e.getSource()).getComponentAt(e.getX(), e.getY());
// Do some stuff about c.

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

0 голосов
/ 13 февраля 2012

Зависит от того, как вы создали свой пользовательский интерфейс, но попробуйте Container#findCompoinentAt(int x, int y) - он возвращает наиболее видимого дочернего элемента.

...