如何让我自己的mouseListener处理当前表单?

时间:2014-05-15 15:21:43

标签: java

我希望在另一个类中创建自己的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)

2 个答案:

答案 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) {}
});