(注意:我知道MouseAdapter
- 类的存在,但由于我可能会在以后覆盖所有方法,它的优势会丢失吗?)
我有一个MainProgram.java类,我在其中添加了几个组件。他们中的大多数都有一个Listener(ActionListener,MouseListener,...),它在我的主类中有点拥挤。
因此,我正在尝试"外化"那些听众进入自己的班级。到目前为止,我已经在我的主类中使用了内部类,这使得访问变量,组件......非常简单明了。
但是对于外部监听器,我不确定实现它们的最佳方法是什么。
例如,当我想知道哪些标签被点击时,我正在获取事件,获取事件的来源,将其转换为JLabel
然后获取文本用来比较字符串的标签!
这样可行,但似乎很容易出错(如果我更改了我的主类中的JLabel文本? - >监听器中断)并且非常不洁净。
我试图通过谷歌和StackOverflow搜索更好的方法,但只找到内部类方法。
那么有更好的方法可以访问我的组件/外部化我的听众吗?
public class MainProgram extends JFrame {
public MainProgram() {
super("Landing Page");
setSize(400, 400);
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
JPanel westPanel = new JPanel();
JLabel lbl_orderStatus = new JLabel("Order Status");
JLabel lbl_technicalDocu = new JLabel("Technical Documentation");
JLabel lbl_checkReport = new JLabel("Check Report");
MouseListenerBoldFont mouseListenerLabelBoldPlain = new MouseListenerBoldFont();
lbl_orderStatus.addMouseListener(mouseListenerLabelBoldPlain);
lbl_technicalDocu.addMouseListener(mouseListenerLabelBoldPlain);
lbl_checkReport.addMouseListener(mouseListenerLabelBoldPlain);
westPanel.add(lbl_orderStatus);
westPanel.add(lbl_technicalDocu);
westPanel.add(lbl_checkReport);
add(westPanel);
}
public static void main(String[] args) {
EventQueue.invokeLater(new Runnable() {
public void run() {
try {
UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName());
MainProgram window = new MainProgram();
window.setVisible(true);
}
catch (Exception e) {
e.printStackTrace();
}
}
});
}
MouseListenerBoldFont.java :
public class MouseListenerBoldFont implements MouseListener{
Object lbl_westPanel;
@Override
public void mouseClicked(MouseEvent e) {
if(((JLabel)e.getSource()).getText().equals("Order Status")){
System.out.println("Order Status clicked");
};
if(((JLabel)e.getSource()).getText().equals("Technical Documentation")){
System.out.println("Technical Documentation clicked");
};
if(((JLabel)e.getSource()).getText().equals("Check Report")){
System.out.println("Check Report clicked");
};
}
@Override
public void mouseEntered(MouseEvent e) {
lbl_westPanel = e.getSource();
((JComponent) lbl_westPanel).setFont(new Font("tahoma", Font.BOLD, 12));
}
@Override
public void mouseExited(MouseEvent e) {
lbl_westPanel = e.getSource();
((JComponent) lbl_westPanel).setFont(new Font("tahoma", Font.PLAIN, 11));
}
@Override
public void mousePressed(MouseEvent e) {
}
@Override
public void mouseReleased(MouseEvent e) {
}
}
答案 0 :(得分:2)
确定这不是最佳方式,但可能对您的问题有用
List<User>
然后
public class MyLabel extends JLabel implements MouseListener {
public MyLabel() {
addMouseListener(this);
}
public MyLabel(String txt) {
super(txt);
addMouseListener(this);
}
public void mouseClicked(MouseEvent e) {
System.out.println(getText() + " clicked");
}
public void mouseEntered(MouseEvent e) {
setFont(new Font("tahoma", Font.BOLD, 12));
}
public void mouseExited(MouseEvent e) {
setFont(new Font("tahoma", Font.PLAIN, 11));
}
public void mousePressed(MouseEvent e) { }
public void mouseReleased(MouseEvent e) { }
}
答案 1 :(得分:1)
我的建议是编写内联(匿名类)处理程序,将实际处理转发给另一个非匿名函数。这会给你类似的东西:
JLabel lblOrderStatus = new JLabel("Order Status");
lblOrderStatus.addMouseListener(new MouseAdapter() {
public void mouseClicked(MouseEvent evt) {
doWhateverClickOnOrderStatusRequires();
}
});
// much later
private void doWhateverClickOnOrderStatusRequires() { ... }
外部非完全处理程序方法(doWhateverClickOnOrderStatusRequires
)的名称应捕获它尝试实现的任务(例如,launchRockets
);使用此模式,您可以从多个处理程序中调用相同的非完全处理程序方法。由于编译器会在编译时检查调用是否有效,因此不会涉及脆弱的字符串常量。
答案 2 :(得分:0)
您可能仍然希望使用扩展MouseAdapter的类,因为它可以同时用作MouseListener,MouseMotionListener和MouseWheelListener(您只需将其作为所有这些添加到组件中)。我不确定为什么你需要在JLabel上获取文本以检测它是否是被点击的文本。您应该创建一个扩展MouseAdapter的类,并将其专门用于JLabel,然后将其添加到该JLabel。您应该定义一个自定义构造函数,如果您需要将JLabel作为参数,以便它自动知道JLabel与之交互的内容。然后,您可以添加一个将事件传递给主类的方法。