gpt4 book ai didi

java - JLabel 鼠标点击图标或文本

转载 作者:塔克拉玛干 更新时间:2023-11-03 04:32:44 25 4
gpt4 key购买 nike

当点击 JLabel 时,我想了解点击的是 “图标部分”,还是“文本部分” JLabel,以便可以采取不同的操作。有没有聪明的方法来做到这一点?还是只能用图标和文字的坐标相对解决?

最佳答案

+1 给@aymeric 评论。

What about having two different JLabels

不过我明白你为什么会犹豫

negative: requires maintenance of 2 labels.

我的聪明 (:P) 解决方案是创建您自己的抽象组件 - 它接受图标和文本作为构造函数的参数 - 通过扩展 JPanel 并添加 2 JLabelJPanel,每个标签都有其在 MouseAdapter 上调用抽象方法 xxxClicked()(因此任何实现类必须覆盖这些方法)。

这是我做的一个例子:

enter image description here

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;
}
}

关于java - JLabel 鼠标点击图标或文本,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13777411/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com