鼠标事件通过组件

时间:2015-07-02 10:06:18

标签: java swing

我添加了一个简单的程序来说明。

import java.awt.*;
import java.awt.event.*;

import javax.swing.*;

public class SimpleInternalFrame extends Frame
{

  private static final long serialVersionUID = 1L;

  static JLayeredPane desktop;

  JInternalFrame internalFrame;

  public SimpleInternalFrame()
  {
    super("Internal Frame Demo");
    setSize(500, 400);


    Panel p = new Panel();


    add(p, BorderLayout.SOUTH);
    addWindowListener(new WindowAdapter()
    {
      public void windowClosing(WindowEvent e)
      {
        System.exit(0);
      }
    });


    desktop = new JDesktopPane();
    desktop.setOpaque(true);
    add(desktop, BorderLayout.CENTER);
  }


  public static void main(String args[])
  {
    SimpleInternalFrame sif = new SimpleInternalFrame();
    sif.setVisible(true);

    final JInternalFrame internalFrame = new JInternalFrame("Internal Frame 1", true, true, true, true);
    internalFrame.setBounds(50, 50, 300, 200);
    desktop.add(internalFrame, new Integer(1));
    JTextField tf = new JTextField();
    tf.addMouseListener(new MouseAdapter()
    {
      public void mouseClicked(MouseEvent evt)
      {

        System.out.println("Text Field " + evt.getClickCount());
      }
    });
    internalFrame.add(tf);
    internalFrame.setVisible(true);

    final JInternalFrame internalFrame2 = new JInternalFrame("Internal Frame 1", true, true, true, true);
    internalFrame2.setBounds(50, 50, 200, 100);
    desktop.add(internalFrame2, new Integer(1));
    JButton jb = new JButton("click me");
    jb.addMouseListener(new MouseAdapter()
    {
      public void mouseClicked(MouseEvent evt)
      {

        if (evt.getClickCount() == 1)
        {
          System.out.println("Button " + evt.getClickCount());
          internalFrame2.setVisible(false);
        }
      }
    });
    internalFrame2.add(jb);
    internalFrame2.setVisible(true);

  }
}

运行代码时,它会打开两个内部框架。一个有按钮。一个有文本字段。按钮将关闭第一个内部框架进行单击。

双击按钮。它将在文本字段中显示点击次数2。 这是我们目前在项目中遇到的问题.Thing是实际项目中没有文本字段的第二帧剂量。它具有双击事件中可点击的项目。 这是我们目前的问题。请帮助。

3 个答案:

答案 0 :(得分:1)

tf.addMouseListener(new MouseAdapter() {
    int cc;

    public void mouseClicked(MouseEvent evt) {
        int ccount = evt.getClickCount();
        if(ccount == 1 || ccount == cc+1) {
            cc = ccount;
            System.out.println("Text Field " + evt.getClickCount());
        }
    }
});

这将不止一次。

另一种可能性是使用覆盖processMouseEvent()的组件:

public class SimpleInternalFrame extends Frame {
...
    private MouseEvent lastMouseEvent;

    public boolean checkEvent(MouseEvent e) {
        if(lastMouseEvent != null) {
            if(lastMouseEvent.getSource() != e.getSource()) {
                if(e.getClickCount() != 1) {
                    return false;
                }
            }
        }
        lastMouseEvent = e;
        return true;
    }

    class MTextField extends JTextField {
        protected void processMouseEvent(MouseEvent e) {
            if (checkEvent(e)) {
                super.processMouseEvent(e);
            }
        }
    }

    class MButton extends JButton {
        protected void processMouseEvent(MouseEvent e) {
            if (checkEvent(e)) {
                super.processMouseEvent(e);
            }
        }
    }

    public JTextField createText() {
        return new MTextField();
    }

    public MButton createButton() {
        return new MButton();
    }
} //end of SimpleInternalFrame 

创建组件:

final JTextField tf = sif.createText();
tf.addMouseListener(new MouseAdapter() {
    public void mouseClicked(MouseEvent evt) {
        System.out.println("Text Field " + evt.getClickCount());
    }
});

JButton jb = sif.createButton();
jb.setText("click me");
jb.addMouseListener(new MouseAdapter() {
    public void mouseClicked(MouseEvent evt) {
        if (evt.getClickCount() == 1) {
            internalFrame2.setVisible(false);
        }
    }
});

答案 1 :(得分:0)

您可以使用名为myTurn的静态布尔值初始化为false,然后在文本字段中使用mouseClicked:

tf.addMouseListener(new MouseAdapter()
        {
            public void mouseClicked(MouseEvent evt)
            {
                if (evt.getClickCount() >= 2 && !myTurn) {
                    myTurn = true;
                    evt.consume();
                } else {
                    myTurn = true; //Initial one click on me
                    System.out.println("Text Field " + evt.getClickCount());
                    evt.consume();
                }
            }
        });

这解决了这个基本情况下的问题,但我不知道它是否会出现在您的应用程序中。问题是,如果在Button之前单击TextField,则可能会遇到相同的问题。但是,如果不可能,这将解决它。

答案 2 :(得分:0)

在互联网上搜索并阅读一些文档时,我得到了一个解决方案。

     --------------------------------------------------------------------------------
     location | 20GP | 20HD | 20RF | 30FR | 30HD | 30GP | 30GP | 40HD | 40FR | 40RF |
     --------------------------------------------------------------------------------
        UAE   |   0  |   1  |   1  |   0  |   0  |   0  |   0  |   1  |   0  |   1  |
        USA   |   2  |   0  |   0  |   0  |   1  |   0  |   1  |   0  |   0  |   0  |
        IND   |   0  |   0  |   0  |   2  |   0  |   0  |   0  |   0  |   1  |   1  |
     --------------------------------------------------------------------------------

此解决方案的一个缺点是,如果用户单击一下他需要等待 timerinterval 不必要。任何人都有更好的解决方案,请发帖。