Java:如何保存鼠标按钮状态?

Java:如何保存鼠标按钮状态?,java,logging,mouse,Java,Logging,Mouse,因此,我正在编写一个程序,将鼠标按钮(当前仅为鼠标按下,但一旦此操作正常,将添加鼠标释放)状态保存到日志文件中。我该怎么做? 当前代码: import static com.sun.java.accessibility.util.AWTEventMonitor.addMouseListener; import java.awt.event.MouseAdapter; import java.awt.event.MouseEvent; import java.io.BufferedWriter;

因此,我正在编写一个程序,将鼠标按钮(当前仅为鼠标按下,但一旦此操作正常,将添加鼠标释放)状态保存到日志文件中。我该怎么做?
当前代码:

import static com.sun.java.accessibility.util.AWTEventMonitor.addMouseListener;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;
import java.io.BufferedWriter;
import java.io.File;
import java.io.FileWriter;
import java.io.IOException;
import java.util.concurrent.TimeUnit;

public class mouse {
public static void main(String[] args) throws InterruptedException{
mouse();

} 
public static void mouse() throws InterruptedException{
for(int i=0;i<10000;i++){
    addMouseListener(new MouseAdapter() { 
        public void mousePressed(MouseEvent me) { 
        writeToFile(me);    //writeToFile saves the me value to txt
        } 
       });
    TimeUnit.MILLISECONDS.sleep(1); // time delay, so it saves every 1ms
}
}


public static void writeToFile(MouseEvent me){

try{
    String data =" "+me+" ";

    File file =new File("log.txt");

    //if log.txt doesn't exist, it makes it
    if(!file.exists()){
        file.createNewFile();
    }

    //true = write
        FileWriter fileWritter = new FileWriter(file.getName(),true);
        BufferedWriter bufferWritter = new BufferedWriter(fileWritter);
        bufferWritter.write(data);
        bufferWritter.close();


    }catch(IOException e){
    }
}

}
import static com.sun.java.accessibility.util.AWTEventMonitor.addMouseListener;
导入java.awt.event.MouseAdapter;
导入java.awt.event.MouseEvent;
导入java.io.BufferedWriter;
导入java.io.File;
导入java.io.FileWriter;
导入java.io.IOException;
导入java.util.concurrent.TimeUnit;
公共类鼠标{
公共静态void main(字符串[]args)引发InterruptedException{
鼠标();
} 
public static void mouse()引发InterruptedException{

对于(int i=0;i如果您不想创建GUI,而是想记录鼠标的一般位置,那么向类中添加鼠标侦听器将毫无用处。相反,请理解Java并没有针对这种类型的程序进行优化,您可能必须使用JNA或JNI来捕获操作系统的鼠标处理代码。另一方面,如果您希望o捕获Swing GUI的鼠标使用情况,然后您首先需要创建Swing GUI,然后向其中添加鼠标侦听器。我建议您阅读鼠标侦听器教程以了解更多信息


编辑
你说:


最终,它将成为GUI应用程序的一部分,我只是想对它做一个概念

请理解,如果不将MouseListener添加到接受MouseListener的组件(该组件最终从GUI中显示的组件类型扩展而来)中,MouseListener将无法正常工作。因此,为了测试您的概念,您需要再次创建Swing GUI,并将MouseListener添加到其中一个可视化组件中再次,请阅读


关于覆盖文件,它没有,我从我以前的程序中获取了它,它工作正常

对不起,我的错,我误读了你的密码


编辑2
如注释中所述,侦听器不应具有循环,而应响应鼠标事件。例如,以下代码侦听鼠标的按下、释放和拖动,并在JTextArea中显示信息。将其更改为写入文件很简单:

import java.awt.BorderLayout;
import java.awt.Dimension;
import java.awt.Font;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;

import javax.swing.*;

@SuppressWarnings("serial")
public class SimpleMouseListenerEg extends JPanel {
   private static final int PREF_W = 600;
   private static final int PREF_H = 400;
   private JPanel listenedToPanel = new JPanel();
   private JTextArea textArea = new JTextArea(10, 25);

   public SimpleMouseListenerEg() {
      listenedToPanel.setBorder(BorderFactory.createTitledBorder("Listened To Panel"));
      MouseAdapter myMouseAdapter = new MyMouseAdapter();
      listenedToPanel.addMouseListener(myMouseAdapter);
      listenedToPanel.addMouseMotionListener(myMouseAdapter);

      textArea.setFont(new Font(Font.MONOSPACED, Font.PLAIN, 12));
      JScrollPane scrollPane = new JScrollPane(textArea);
      scrollPane.setVerticalScrollBarPolicy(JScrollPane.VERTICAL_SCROLLBAR_ALWAYS);

      setLayout(new BorderLayout());
      add(listenedToPanel, BorderLayout.CENTER);
      add(scrollPane, BorderLayout.EAST);
   }

   @Override
   public Dimension getPreferredSize() {
      return new Dimension(PREF_W, PREF_H);
   }

   // a combination MouseListener and MouseMotionListener
   private class MyMouseAdapter extends MouseAdapter {
      private String template = "%-10s [%03d, %03d]%n";

      @Override
      public void mousePressed(MouseEvent mEvt) {
         String text = String.format(template, "Pressed", mEvt.getX(), mEvt.getY());
         textArea.append(text);
      }

      @Override
      public void mouseReleased(MouseEvent mEvt) {
         String text = String.format(template, "Released", mEvt.getX(), mEvt.getY());
         textArea.append(text);
      }

      @Override
      public void mouseDragged(MouseEvent mEvt) {
         String text = String.format(template, "Dragged", mEvt.getX(), mEvt.getY());
         textArea.append(text);
      }
   }

   private static void createAndShowGui() {
      SimpleMouseListenerEg mainPanel = new SimpleMouseListenerEg();

      JFrame frame = new JFrame("SimpleMouseListenerEg");
      frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
      frame.getContentPane().add(mainPanel);
      frame.pack();
      frame.setLocationByPlatform(true);
      frame.setVisible(true);
   }

   public static void main(String[] args) {
      SwingUtilities.invokeLater(new Runnable() {
         public void run() {
            createAndShowGui();
         }
      });
   }
}

这可能是因为循环创建了新的侦听器。请看一下mouseListener文档:不,我尝试将for循环放入其中,以便它只执行
WriteFile(me)
line,但它仍然不起任何作用。侦听器不应该有任何循环,您的GUI应该等待并“侦听”事件。您的GUI中需要一个组件作为这些事件的源。例如,一个包含可将侦听器附加到的整个GUI的对象。最终,它将成为GUI应用程序的一部分“我只是想了解一下它的概念。关于覆盖文件,它没有,我从我以前的程序中获取了它,并且它工作正常。@dvd:请不要试图编辑我的答案,因为你这样做不太礼貌。我很好奇,你为什么要我删除对我答案的第一次编辑。我不知道,伙计,我是Stackoverflow的新手……ju。”请告诉我如何编辑,我会做的…@dvd:如何编辑什么?您可以通过按下面的编辑链接编辑您自己的问题,但您不应该试图编辑他人的答案,尤其是您自己问题的答案。稍后当您获得更多声誉时,您可以编辑他人的问题和答案,但您仍然不应该编辑这样做是为了删除问题或答案中的重要信息,因为这被称为“污损”答案。我误解了,我的错!谢谢你所做的一切。