(Примечание: Я знаю о существовании MouseAdapter
-класса, но так как я, вероятно, отвергая все методы позже, преимущество его теряется)Как экстернализировать MouseListener?
У меня есть класс MainProgram.java в который я добавляю несколько компонентов. У большинства из них есть Listener (ActionListener, MouseListener, ...), которые в моем основном классе немного переполнены.
Поэтому я пытаюсь «вытеснить» этих слушателей в свои классы. До сих пор я использовал внутренние классы в своем основном классе, что делает доступ к переменным, компонентам ... довольно простым и понятным.
Но с внешними слушателями я не уверен, что является лучшим способом их реализации.
Например, когда я хочу узнать, какая из таблиц была нажата, я получаю событие, получаю источник события, набрасываю его на JLabel
, а затем получаю текст на ярлыке, с которым Я сравниваю строку!
Это работает, но кажется очень склонным к ошибкам (что, если я изменю текст JLabel в моем основном классе? -> Слушатели) и довольно нечисто.
Я попытался выполнить поиск через google и в 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) {
}
}
Часть проблемы является использование JLabels как кнопки. JLabels на самом деле не предназначены для кликов, как кнопки. Если вы используете JButton, то в вашем ActionListener вы можете использовать getActionCommand() вместо отображаемого текста компонента. Еще лучше создайте константы для сравнения с вашими командами действий. Если вы сделаете это, я думаю, что головная боль экстернализации ваших слушателей исчезнет. – whiskeyspider
Чтобы продолжить с комментарием @whiskeyspider, в этом разделе показано использование JButton, похожего на JLabel: http://stackoverflow.com/questions/9635126/which-jlabel-has-been-clicked – Berger
Сравнение 'Strings' через '==' очень опасно. Вместо этого используйте 'equals()' (поскольку 'Strings' являются объектами). – tucuxi