簡體   English   中英

JLabel鼠標點擊圖標或文字

[英]JLabel mouse click on icon or text

當它被點擊JLabel ,我想明白了,如果點擊的是"Icon part" ,或“ Text part"中的JLabel ,使不同可采取行動。 有一個聰明的方法嗎? 或者我只需要用圖標和文字的坐標來解決它?

+1到@aymeric評論。

怎么樣有兩個不同的JLabel

但是我明白為什么你會猶豫不決

否定:需要維護2個標簽。

聰明的 (:P)解決方案是創建你自己的抽象組件 - 它接受圖標和文本作為構造函數的參數 - 通過擴展JPanel而不是將2個JLabel添加到JPanel ,每個標簽都有它的MouseAdapter ,它調用抽象方法xxxClicked() (因此任何實現類都必須覆蓋這些方法)。

這是我做的一個例子:

在此輸入圖像描述

import java.awt.FlowLayout;
import java.awt.Image;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;
import java.net.URL;
import javax.imageio.ImageIO;
import javax.swing.ImageIcon;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.SwingUtilities;

public class Test {

    public static void main(String[] args) {
        SwingUtilities.invokeLater(new Runnable() {
            @Override
            public void run() {
                JFrame frame = new JFrame();
                frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

                ImageIcon ii = null;
                try {
                    //I dont remmend getScaledInstance just used it for speed of code writing
                    ii = new ImageIcon(ImageIO.read(new URL("http://www.candonetworking.com/java.gif")).getScaledInstance(32, 32, Image.SCALE_SMOOTH));
                } catch (Exception ex) {
                    ex.printStackTrace();
                }

                MyLabel ml = new MyLabel(ii, "Something") {
                    @Override
                    void iconClicked() {
                        System.out.println("Icon clicked");
                    }

                    @Override
                    void textClicked() {
                        System.out.println("Text clicked");
                    }
                };

                frame.add(ml);

                frame.pack();
                frame.setVisible(true);
            }
        });
    }
}

abstract class MyLabel extends JPanel {

    JLabel iconLabel;
    JLabel textLabel;
    MouseAdapter iconMA;
    MouseAdapter textMA;

    public MyLabel(ImageIcon icon, String text) {
        iconLabel = new JLabel(icon);
        textLabel = new JLabel(text);
        iconMA = new MouseAdapter() {
            @Override
            public void mouseClicked(MouseEvent me) {
                super.mouseClicked(me);
                iconClicked();
            }
        };
        textMA = new MouseAdapter() {
            @Override
            public void mouseClicked(MouseEvent me) {
                super.mouseClicked(me);
                textClicked();
            }
        };
        iconLabel.addMouseListener(iconMA);
        textLabel.addMouseListener(textMA);
        add(iconLabel);
        add(textLabel);
    }

    abstract void iconClicked();

    abstract void textClicked();

    public JLabel getIconLabel() {
        return iconLabel;
    }

    public JLabel getTextLabel() {
        return textLabel;
    }
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM