Граница JPanel с обработкой mouseEvent - PullRequest
2 голосов
/ 11 января 2012

Как создать рамку JPanel, которая сможет обрабатывать MouseEvents?

Я пытался сделать что-то подобное:

abstract public class MyBorder extends LineBorder implements MouseListener

Но после реализации виртуальных методов я не могу назначить mouseListener своему классу. Я предполагаю, что я должен назначить его в некоторый JComponent.

Итак, как я могу создать какую-то границу с помощью mouseListener?

Ответы [ 2 ]

3 голосов
/ 11 января 2012

MouseListener должен быть добавлен к компоненту, а не к границе. Таким образом, чтобы использовать ваш класс, код должен выглядеть примерно так:

Border border = new MyBorder();
panel.setBorder( border );
panel.addMouseListener( border );
2 голосов
/ 11 января 2012

Вот SSCCE, который поддерживает, что границы получают события мыши на компоненте, к которому они применяются.

import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
import javax.swing.border.LineBorder;

class BorderListener {

    private void initGui() {
        final JPanel gui = new JPanel();
        gui.setBackground(Color.green);
        gui.setPreferredSize(new Dimension(300,50));
        gui.setBorder(new LineBorder(Color.blue, 10));
        gui.addMouseListener( new MouseAdapter() {
            @Override
            public void mouseClicked(MouseEvent me) {
                System.out.println(me.getPoint());
            }
        });
        JOptionPane.showMessageDialog(null, gui);
    }

    public static void main(String[] args) {
        SwingUtilities.invokeLater(new Runnable() {
            public void run() {
                BorderListener bl = new BorderListener();
                bl.initGui();
            }
        });
    }
}

Типичный вывод

При нажатии на широкой границе, назначенной этой панели, вы можете увидеть выходные данные вдоль этих линий.

java.awt.Point[x=8,y=3]
java.awt.Point[x=3,y=26]
java.awt.Point[x=1,y=43]
java.awt.Point[x=15,y=6]
java.awt.Point[x=101,y=5]
java.awt.Point[x=220,y=4]
java.awt.Point[x=287,y=5]
java.awt.Point[x=295,y=3]
Press any key to continue . . .

Граница имеет ширину 10 пикселей, поэтому если (x || y <10), она находится внутри границы строки. </p>


Обновление

(Комментарий к camickr, который также применяется к моему ответу)

Да, но тогда этот mouseListener будет добавлен для всей JPanel.Не только для моей границы.Я ошибся?

Просто игнорируйте событие, если оно происходит в не границ области панели.

import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
import javax.swing.border.LineBorder;

class BorderListener {

    private void initGui() {
        final JPanel gui = new JPanel();
        gui.setBackground(Color.yellow);
        gui.setPreferredSize(new Dimension(300,50));
        gui.setBorder(new LineBorder(Color.orange, 15));
        gui.addMouseListener( new MouseAdapter() {
            @Override
            public void mouseClicked(MouseEvent me) {
                int w = gui.getWidth();
                int h = gui.getHeight();
                int x = me.getPoint().x;
                int y = me.getPoint().y;
                Insets ins = gui.getInsets();
                boolean inBorder =
                    ( x<ins.left ||
                    x>w-ins.right ||
                    y<ins.top ||
                    y>h-ins.bottom);
                if (inBorder) {
                    System.out.println(me.getPoint());
                } else {
                    System.out.println("Ignore!");
                }
            }
        });
        JOptionPane.showMessageDialog(null, gui);
    }

    public static void main(String[] args) {
        SwingUtilities.invokeLater(new Runnable() {
            public void run() {
                BorderListener bl = new BorderListener();
                bl.initGui();
            }
        });
    }
}

Выход

java.awt.Point[x=168,y=7]
Ignore!
java.awt.Point[x=164,y=41]
java.awt.Point[x=297,y=39]
java.awt.Point[x=297,y=21]
Ignore!
Ignore!
java.awt.Point[x=2,y=21]
Press any key to continue . . .
...