Как мне превратить JLabel в кнопку? - PullRequest
0 голосов
/ 12 апреля 2020

Итак, я попытался превратить мой JLabel с изображением в нажимаемую кнопку. Но я столкнулся с некоторыми проблемами.

Вот что я использовал:

Icon image = new ImageIcon("Image Path");
JLabel button = new JLabel(image);
button.setBounds(250, 100, 128, 64); //used a 500x200 window
frame.add(button);

button.addMouseListener(new MouseAdapter() {
      @Override
      public void mouseClicked(MouseEvent e) {
        System.out.print("Hello");
      }
    });

Поэтому, когда я запускаю код, я могу щелкнуть где угодно и всегда получаю сообщение Hello. Но я хочу, чтобы сообщение печаталось только тогда, когда я нажимаю на изображение, а не где-либо еще.

Как я могу это сделать?

Спасибо!

** Редактировать : Вот что я на самом деле имею в виду:

enter image description here

Как видите, там должно быть синее поле с надписью Hello. и когда я щелкаю по нему, я получаю сообщение Hello, но когда я щелкаю за пределами синей рамки (белые пятна), я все равно получаю сообщение. Есть ли способ, которым я могу отключить это? Так что, когда я только нажимаю синее пятно, я получаю сообщение? **

Ответы [ 2 ]

1 голос
/ 12 апреля 2020

Вы можете просто определить Rectangle, в пределах которого щелчок по JLabel должен напечатать ваш текст. Вы можете получить координаты вашего клика относительно JLabel с getX и getY. Чтобы проверить, находится ли щелчок внутри прямоугольника, вы можете использовать метод contains. См. JLabel и Прямоугольник . Рабочий пример:

package labelbutton;

import java.awt.*;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;
import java.net.MalformedURLException;
import java.net.URL;
import javax.swing.*;

public class LabelButton {

    private static final Rectangle CLICK_FIELD = new Rectangle(140, 140, 200, 200);

    public static void main(String[] args) throws MalformedURLException {
        JFrame jf = new JFrame();
        jf.add(createLabelButton());
        jf.setVisible(true);
        jf.pack();
        jf.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    }

    private static JLabel createLabelButton() throws MalformedURLException {
        Icon image = new ImageIcon(new URL("https://images.assetsdelivery.com/compings_v2/4zevar/4zevar1509/4zevar150900035.jpg"));
        JLabel button = new JLabel(image);
        button.setPreferredSize(new Dimension(500, 500));
        button.setBorder(BorderFactory.createLineBorder(Color.RED, 3));

        button.addMouseListener(new MouseAdapter() {
            @Override
            public void mouseClicked(MouseEvent e) {
                if(CLICK_FIELD.contains(e.getX(), e.getY())) {
                    System.out.println("Hello");
                }
            }
        });

        return button;
    }
}
0 голосов
/ 12 апреля 2020

Вы также можете добавить JLabel в JPanel с помощью GridBagLayout, а затем добавить панель в рамку. Таким образом, JPanel будет занимать дополнительное пространство, в то время как JLabel будет всегда центрироваться в нем.

Вот рабочий пример:

import java.awt.Color;
import java.awt.GridBagLayout;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;
import javax.swing.BorderFactory;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.SwingUtilities;

public class Main {
    public static void main(final String[] args) {
        SwingUtilities.invokeLater(() -> {

            final JLabel button = new JLabel("Hello");

            button.addMouseListener(new MouseAdapter() {
                @Override
                public void mouseClicked(final MouseEvent mevt) {
                    System.out.println("Hello label/button!");
                }
            });

            button.setBorder(BorderFactory.createLineBorder(Color.CYAN.darker()));

            final JPanel panel = new JPanel(new GridBagLayout());

            panel.add(button);

            final JFrame frame = new JFrame("Label button");
            frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
            frame.getContentPane().add(panel);
            frame.pack();
            frame.setLocationRelativeTo(null);
            frame.setVisible(true);
        });
    }
}
...