简体   繁体   中英

How can I make my own mouseListener dispose of the current form?

I want to have my own MouseListener created in another class. Easy to do. But I want it to destroy the current JFrame (close button) This is easy to do if you MouseListener is inside of the current class. But this is not what I want. I would like to make my own generic class that could be attached to any close button with -->

     new myMouseCloseListener({form instance probably will go here})

I know what the trouble is. I need to pass the class mouse listener a parameter that represents the current form. I have tried a couple of different things but it is not working.

I do not want to use a static variable.

Question: How do I pass a variable of the current form to the myMouseCloseListener(...)?

Code:

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

    }

}

Error:

  Compile Error

   The method addActionListener(ActionListener) in the type 
   AbstractButton is not applicable for the arguments (myMouseCloseListener)

The error message clearly explains the problem. The method addActionListener(ActionListener) takes as its argument an ActionListener instance. You're passing in a MouseListener instance. If you want to pass in a MouseListener , you need to use addMouseListener(MouseListener) instead.

You also don't need to pass in the JFrame instance. Off the top of my head, may not compile, double-check yourself:

@Override
public void mousePressed(final MouseEvent e) {
    final Component source = e.getComponent();
    final JFrame frame = (JFrame) SwingUtilities.getRoot(source);
    frame.dispose();
}

Of course, it would be much easier to add an ActionListener instead of a MouseListener , because then you're only implementing one method. If you insist on using a MouseListener , I strongly suggest extending MouseAdapter so you only have to override the methods you care about.

Continued from @Eric Stein,

An example if this using anonymous inner classes, which may be a lot simpler than making a whole another class for it:

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

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM