java中鼠标监听器的使用

java中鼠标监听器的使用,第1张

import javautilDate;
import javaawt;
import javaxswing;
import javaawtevent;
import javaxswingJButton;
import javaxswingJFrame;
import javaxswingJLabel;
public class MyTime extends JFrame {//删除了集成的接口
JFrame frame = new JFrame();
JLabel label = null;
JPanel panel1 = new JPanel();
JPanel panel2 = new JPanel();
JButton btn1 = new JButton(" 红 色 ");
JButton btn2 = new JButton(" 绿 色 ");
JButton btn3 = new JButton(" 蓝 色 ");
public MyTime() {
panel1setBackground(Colorwhite);
panel2setLayout(new FlowLayout(FlowLayoutCENTER, 20, 10));
panel1setBackground(ColorWHITE);
panel2add(btn1);
panel2add(btn2);
panel2add(btn3);
add(panel1, BorderLayoutCENTER);
add(panel2, BorderLayoutSOUTH);// 创建一个监听器对象
btn1addActionListener(new TimeThread(this)new AL()); // 为按钮注册监听器(使用了TimeThread类的AL内部类)
btn2addActionListener(new TimeThread(this)new AL());
btn3addActionListener(new TimeThread(this)new AL());
frame = new JFrame();
label = new JLabel();
labelsetIcon(new ImageIcon("QQ拼音截图未命名jpg"));
labelsetFont(new Font("幼圆", FontLAYOUT_NO_LIMIT_CONTEXT, 76));
labelsetForeground(ColorBLACK);
add(label);
setTitle("个性数字时钟");
setResizable(false);// 锁定窗口大小
setSize(320, 160);
setLocation(300, 300);
setVisible(true);
setDefaultCloseOperation(JFrameEXIT_ON_CLOSE);
}
public static void main(String[] args) {
try {
UIManagersetLookAndFeel(UIManagergetSystemLookAndFeelClassName());
} catch (Exception e) {
}
MyTime mt = new MyTime();
new TimeThread(mt)start();
}
}
class TimeThread extends Thread {
private MyTime mt;
public TimeThread(MyTime mt) {
thismt = mt;
}
public void run() {
while (true) {
String fullTime = new Date()toString();
String time = fullTimesubstring(11, 19);
mtlabelsetText(time);
mtlabelrepaint();
try {
sleep(1000);
} catch (InterruptedException e) {
eprintStackTrace();
}
}
}
class AL implements ActionListener { // 内部类
public void actionPerformed(ActionEvent e) {
if ((JButton) egetSource() == mtbtn1)//btn1属于MyTime类
mtlabelsetForeground(ColorRED);
else if ((JButton) egetSource() == mtbtn2)
mtlabelsetForeground(ColorGREEN);
else if ((JButton) egetSource() == mtbtn3)
mtlabelsetForeground(ColorBLUE);
}
}
}
//修改的地方已经注释

程序改好了你在OpenJFrame这个类中画界面就行了, ML 这个类是一个监听功能,给你的按钮加上了监听,另外建议不要再main函数中写界面的代码 。
import javaawtBorderLayout;
import javaawtButton;
import javaawtColor;
import javaawtFrame;
import javaawtLabel;
import javaawtPanel;
import javaawtTextField;
import javaawteventActionEvent;
import javaawteventActionListener;
import javaawteventWindowAdapter;
import javaawteventWindowEvent;

import javaxswingJFrame;import javaxswingJLabel;
import javaxswingJPanel;

public class bysj{
static Frame frm = new Frame("中小型超市薪酬管理系统");

public static void main(String[] args){
BorderLayout border = new BorderLayout(5,10);
//GridLayout grid = new GridLayout(2,2);
Panel pan1 = new Panel();
pan1setSize(500,150);
Panel pan2 = new Panel();
pan2setSize(500,150);
Panel pan3 = new Panel();
pan3setSize(500,150);

Label label1 = new Label("欢迎登录超市薪酬管理系统");
label1setSize(500,50);
Label label2 = new Label("用户名:");
label2setLocation(10,10);
label2setSize(30,50);
Label label3 = new Label("密码:");
label3setLocation(10,70);
label3setSize(30,50);

Button bt1 = new Button("登录");
bt1setBounds(40,70,100,40); bt1addActionListener(new ML());
Button bt2 = new Button("注册");
bt2setBounds(150,70,100,40); bt2addActionListener(new ML());
TextField tf1 = new TextField("",20);
tf1setBounds(50, 10, 50, 50);
TextField tf2 = new TextField("",20);
tf2setEchoChar('');
tf2setBounds(10, 70, 30, 50);

pan1setBackground(Colorgray);
pan2setBackground(Colorgray);
//pan2setLayout(grid);
pan3setBackground(Colorgray);

frmsetLayout(border);
frmsetSize(600,400);
frmsetBackground(Colorgray);
frmsetLocation(350,100);

pan1add(label1);
pan2add(label2);
pan2add(tf1);
pan2add(label3);
pan2add(tf2);
pan3add(bt1);
pan3add(bt2);
frmadd(pan1,BorderLayoutNORTH);
frmadd(pan2,BorderLayoutCENTER);
frmadd(pan3,BorderLayoutSOUTH);

frmsetVisible(true);
frmaddWindowListener(new WinCloser());
}
public static class WinCloser extends WindowAdapter{
public void windowClosing(WindowEvent e){
Systemexit(0);

}

}}
class ML implements ActionListener{ public void actionPerformed(ActionEvent event){
Button eventobj = (Button)eventgetSource();
String labelname = eventobjgetLabel();
if("登录"equals(labelname)){
new bysj()frmdispose();
new OpenJFrame();
Systemoutprintln("我是登录 我要关闭当前页面 然后打开其他页面");
}else{
new bysj()frmdispose();
new OpenJFrame();
Systemoutprintln("我是注册 我要关闭当前页面 然后打开其他页面");
}

}
}

class OpenJFrame extends JFrame{
public OpenJFrame(){
JPanel jp2 = new JPanel(new BorderLayout());
thissetSize(380,245);
//设置此窗口永远为最上方 是window的方法
thissetAlwaysOnTop(true);
//不允许用户改变窗口的大小
thissetResizable(false);
//让窗口在屏幕的正中间显示
thissetLocationRelativeTo(null);
thissetTitle("新的窗口");
thissetDefaultCloseOperation(JFrameEXIT_ON_CLOSE);
thissetVisible(true);
}
}

java中的事件监听不是通过线程实现的,它是通过一种注册--通知机制实现的。在java的设计模式中,有一种模式叫:观察者模式,和这个类似。

举个例子,本例子是一个简单的监听当数据发生变化时要做的 *** 作:

1,我们先定义一个接口,可以让多个监听者实现


2、实现一监听者


3、被监听者

4、main方法里面是监听的应用。这样就可以监听DataManager中的updateData行为了,当有数据发生变化时,就可以即时被监听者收到。

import javaawt;
import javaxswing;
import javaawtevent;
public class LayoutTest extends JFrame implements ActionListener {

JButton jb1 = null;
JButton jb2 = null;
JButton jb3 = null;
JButton jb4 = null;
JButton jb5 = null;
public LayoutTest() {
thissetSize(200, 200);
thissetVisible(true);
thissetLayout(new BorderLayout());

jb1 = new JButton("up");
jb1setActionCommand("up");
jb1addActionListener(this);
jb2 = new JButton("down");
jb2setActionCommand("down");
jb2addActionListener(this);
jb3 = new JButton("left");
jb3setActionCommand("left");
jb3addActionListener(this);
jb4 = new JButton("right");
jb4setActionCommand("right");
jb4addActionListener(this);
jb5 = new JButton("center");
jb5setActionCommand("center");
jb5addActionListener(this);
// thisadd(wp);
thisadd("North", jb1);
thisadd("South", jb2);
thisadd("West", jb3);
thisadd("East", jb4);
thisadd("Center", jb5);
}
public static void main(String[] args) {
// TODO Auto-generated method stub
LayoutTest lt = new LayoutTest();
}
@Override
public void actionPerformed(ActionEvent e) {
// TODO Auto-generated method stub
if (egetActionCommand()equals("up")) {
Systemoutprintln("You have clicked up!");
} else if (egetActionCommand()equals("down")) {
Systemoutprintln("You have clicked down!");
} else if (egetActionCommand()equals("left")) {
Systemoutprintln("You have clicked left!");
} else if (egetActionCommand()equals("right")) {
Systemoutprintln("You have clicked right");
} else if (egetActionCommand()equals("center")) {
Systemoutprintln("You have clicker center!");
}
}
}

如果程序实现的话就在需要的地方用Junit的断言。
如果是想观察这个值在程序运行状态下的变化就只能用IDE的功能了,比如Eclipse的Debug可以观看值的变化,自己多设一些断点,或按步执行

voidaddChoosableFileFilter(FileFilter filter)
void setFileFilter(FileFilter filter) Sets the current file filter
voidaddActionListener(ActionListener l)
Adds an ActionListener to the file chooser

补充一下啊××××××××
如果你是想真正实现键盘记录功能,那只能用消息钩子实现,具体怎么搞你搜索一下API HOOK,原理我在下面都说过了。早期的黑客软件都是这样实现的。你可以到安全焦点上看看。主要的技术有:远程线程注入、钩子、键盘消息。
另外,java的进程到底能不能注入很难说,所以我说应该用全局钩子,也就是说对所有的信息进行拦截,所以需要把函数写道DLL文件里实现内存的共享。
另外其实可以投机取巧的方法实现。比如就是空间隐藏,完全可以实现,但是要注意技巧,比如防止焦点丢失啊,因为这样键盘输入的东西就记不下来了~~~
怎么样~这样可以给分了吗?有问题再问啊~~
键盘记录器,估计java是不可能实现的。。。
涉及到windows编程。。
可以用c实现。。。原理是这样的。。
键盘被按下之后,会向窗口发送一个按键消息,这个消息传递给窗口,在窗口的消息循环中被处理,这个时候,如果用c语言写了一个钩子,加入窗口所在进程中,拦截传入的消息,从中读出按下的键是哪个就可以了。。。
java貌似不可能实现那个东西,如果有的话也肯定是钩子之类的~~~
反正进程钩子是有的,消息钩子不知道有没有。。
用c实现的步骤:
写个DLL文件,把钩子处理函数写在里面,然后导出这个函数。编译成DLL文件
然后注入进程。如果你是要在java的程序里记录,那是不可能设置为局部钩子的,只能是全局钩子!!!
java调用c是这样的:
使用jni技术:
首先java中写一个本地方法
1、然后编译这个类,然后用javah编译它,会产生一个头文件
2、在vc中包含这个头文件,重写里面的方法(这个方法和你在java中写的本地方法是对应的),同样生成一个DLL
3、java中,用SystemloadLibrary加载这个dll文件,调用你写的那个方法就可以了~~~
4、键盘记录好像不能直接被java读取,可以先记录到一个文件中,java里面直接读文件了,这样还能避免用jni
你搜索一下呗~~关键字:
api hook、jni、java 钩子


欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/yw/13352945.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-07-20
下一篇 2023-07-20

发表评论

登录后才能评论

评论列表(0条)

保存