がクリックされたとき、別のアクションを実行できるように、クリックが、または の "でJLabel
あったかどうかを理解したいと思います。それを行うための賢い方法はありますか? または、 の座標で相対的に解決する必要があります。アイコンとテキスト?"Icon part"
Text part"
JLabel
質問する
6420 次
1 に答える
3
@aymeric コメントに +1。
2 つの異なる JLabel を持つことについて
しかし、私はあなたがためらうかもしれない理由を理解しています
マイナス: 2 つのラベルのメンテナンスが必要です。
これに対する私の巧妙な( :P) 解決策は、コンストラクターのパラメーターとしてアイコンとテキストを受け入れる独自の抽象コンポーネントを作成することですJPanel
。これらのメソッドをオーバーライドする必要があります)。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;
}
}
于 2012-12-08T20:47:39.033 に答える