我希望在另一个类中创建自己的MouseListener。容易做到。但我希望它能破坏当前的JFrame(关闭按钮)如果MouseListener位于当前类中,这很容易。但这不是我想要的。我想创建我自己的泛型类,可以使用 - >
附加到任何关闭按钮 new myMouseCloseListener({form instance probably will go here})
我知道麻烦是什么。我需要传递类鼠标侦听器一个表示当前表单的参数。我尝试了几种不同的东西,但它没有用。
我不想使用静态变量。
问题:如何将当前表单的变量传递给myMouseCloseListener(...)?
代码:
import java.awt.EventQueue;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.UIManager;
import javax.swing.border.EmptyBorder;
import javax.swing.JTextArea;
import javax.swing.JButton;
import java.awt.Color;
import java.awt.Font;
import java.awt.event.MouseEvent;
import java.awt.event.MouseListener;
import javax.swing.JLabel;
import java.awt.event.ActionListener;
import java.awt.event.ActionEvent;
public class RichTextBox extends JFrame {
private static final long serialVersionUID = 1L;
private JPanel MyPanel;
static RichTextBox t;
public static void main(String[] args) {
t = new RichTextBox();
t.setVisible(true);
}
public RichTextBox() {
setResizable(false);
try {
UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName());
} catch (Exception ex) { }
setTitle("Personal Note Entry");
setForeground(new Color(255, 192, 203));
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
setBounds(100, 100, 420, 266);
MyPanel = new JPanel();
MyPanel.setBorder(new EmptyBorder(5, 5, 5, 5));
setContentPane(MyPanel);
MyPanel.setLayout(null);
JTextArea yourNote = new JTextArea();
yourNote.setWrapStyleWord(true);
yourNote.setToolTipText("This will allow the user to enter a personal note for a specific transaction if they wish.");
yourNote.setText("Enter your note!");
yourNote.setTabSize(5);
yourNote.setLineWrap(true);
yourNote.setFont(new Font("Times New Roman", Font.PLAIN, 16));
yourNote.setBackground(new Color(255, 248, 220));
yourNote.setBounds(10, 45, 392, 147);
MyPanel.add(yourNote);
JButton btnClose = new JButton("Close");
btnClose.addActionListener(new ActionListener(t));
btnClose.setBounds(313, 203, 89, 23);
//btnClose.addActionListener(new myMouseCloseListener(t));
MyPanel.add(btnClose);
JButton btnNewButton_1 = new JButton("Save");
btnNewButton_1.setBounds(214, 203, 89, 23);
MyPanel.add(btnNewButton_1);
JLabel lblNewLabel = new JLabel("Please enter a personal note:");
lblNewLabel.setFont(new Font("Times New Roman", Font.PLAIN, 16));
lblNewLabel.setToolTipText("Label name associated with the text box");
lblNewLabel.setBackground(new Color(255, 0, 0));
lblNewLabel.setBounds(10, 11, 202, 23);
MyPanel.add(lblNewLabel);
}
}
class myMouseCloseListener implements MouseListener {
RichTextBox temp = null; <-- not sure here (trying different things)
myMouseCloseListener(RichTextBox r) {
this.temp = r;
}
@Override
public void mouseClicked(MouseEvent e) {
// TODO Auto-generated method stub
}
@Override
public void mousePressed(MouseEvent e) {
temp.dispose();
}
@Override
public void mouseReleased(MouseEvent e) {
// TODO Auto-generated method stub
}
@Override
public void mouseEntered(MouseEvent e) {
// TODO Auto-generated method stub
}
@Override
public void mouseExited(MouseEvent e) {
// TODO Auto-generated method stub
}
}
错误:
Compile Error
The method addActionListener(ActionListener) in the type
AbstractButton is not applicable for the arguments (myMouseCloseListener)
答案 0 :(得分:2)
错误消息清楚地解释了问题。方法addActionListener(ActionListener)
将ActionListener
实例作为其参数。您正在传递MouseListener
个实例。如果您想传递MouseListener
,则需要使用addMouseListener(MouseListener)
。
您也不需要传入JFrame实例。在我的头顶,可能无法编译,仔细检查自己:
@Override
public void mousePressed(final MouseEvent e) {
final Component source = e.getComponent();
final JFrame frame = (JFrame) SwingUtilities.getRoot(source);
frame.dispose();
}
当然,添加ActionListener
而不是MouseListener
要容易得多,因为那时您只实现了一种方法。如果您坚持使用MouseListener
,我强烈建议您延长MouseAdapter
,以便您只需覆盖您关注的方法。
答案 1 :(得分:1)
继续@Eric Stein,
这是一个使用匿名内部类的示例,这可能比为其创建另一个类要简单得多:
btnClose.addMouseListener(new MouseListener() {
public void mouseClicked(MouseEvent me) {
t.setVisible(false);
t.dispose(); // If you want.
}
public void mouseEntered(MouseEvent me) {} // Other required impls for MouseListener
public void mouseExited(MouseEvent me) {}
public void mousePressed(MouseEvent me) {}
public void mouseReleased(MouseEvent me) {}
});