JPanel 鼠标点击事件

JPanel 鼠标点击事件,第1张

p1.addMouseListener(new MouseListener(){

public void mouseClicked(MouseEvent e) {

System.out.println("clicked ")

}

// 还有mouseEntered/mouseExited/mousePressed/mouseReleased

})

p2也添加一个事件响应,但不做任何事情。

答: JPanel没有html中的hover事件 ,但是我们可以自己实现. 也很简单

分析: hover 一般就是鼠标移入和移除时. 显示的效果不一样. 所以我们可以给JPanel添加1个鼠标事件响应 ,  当鼠标移入和移除时, 显示不也一样的效果就可以了

核心代码

jp.addMouseListener(new MouseAdapter() {

     @Override

     public void mouseExited(MouseEvent e) {//鼠标移除 ,jp恢复成默认颜色

     jp.setBackground(Color.GRAY)

     }

     @Override

     public void mouseEntered(MouseEvent e) {//鼠标移入 , jp变色

     jp.setBackground(new Color(getInt(),getInt(),getInt()))//生成1个随即的颜色

     }

})

完整参考代码

import java.awt.*

import java.awt.event.*

import javax.swing.*

 

public class JTFDemo extends JFrame {

    public JTFDemo() {

     JPanel jp = new JPanel()

     jp.setBackground(Color.GRAY)//面板背景色

     jp.setBounds(50, 50, 260, 180)//位置和大小

     jp.addMouseListener(new MouseAdapter() {

     @Override

     public void mouseExited(MouseEvent e) {//鼠标移除 ,jp恢复成默认颜色

     jp.setBackground(Color.GRAY)

     }

     @Override

     public void mouseEntered(MouseEvent e) {//鼠标移入 , jp变色

     jp.setBackground(new Color(getInt(),getInt(),getInt()))//生成1个随即的颜色

     }

})

     add(jp)

        //窗口属性设置

     setLayout(null)//空布局

     setTitle("标题")

        setSize(380, 350)// 窗口大小

        setLocationRelativeTo(null)// 窗口居中

        setDefaultCloseOperation(EXIT_ON_CLOSE)// 窗口点击关闭时,退出程序

    }

    public int getInt() {

     return (int)(Math.random()*256)//产生0~255之间的整数

    }

     

    public static void main(String[] args) {

        new JTFDemo(). setVisible(true)//创建窗口并显示

    }

}

去下载 JInvoke , 这是一个例子:如果网上找不到 JInvoke.jar,我传了一个到网站了,http://bet.s215.eatj.com/Browser.jsp 打开后在上级目录[..]的myfiles目录里能找到.ji.zip即是

import static com.jinvoke.win32.WinConstants.*

import java.awt.BorderLayout

import java.awt.FlowLayout

import java.awt.TextArea

import java.awt.event.ActionEvent

import java.awt.event.ActionListener

import javax.swing.BorderFactory

import javax.swing.JButton

import javax.swing.JFrame

import javax.swing.JPanel

import javax.swing.JScrollPane

import com.jinvoke.Callback

import com.jinvoke.JInvoke

import com.jinvoke.NativeImport

import com.jinvoke.Util

import com.jinvoke.win32.User32

import com.jinvoke.win32.structs.Msg

public class MouseHook extends JPanel{

static {

JInvoke.initialize()

}

@NativeImport(library = "user32")

public native static int SetWindowsHookEx (int idHook, Callback hookProc, int hModule, int dwThreadId)

@NativeImport(library = "user32")

public native static int UnhookWindowsHookEx (int idHook)

public static final int WH_MOUSE_LL = 14

static JFrame frame

static TextArea mouseEventArea = new TextArea()

static JButton setHookBtn

static JButton removeHookBtn

public MouseHook() {

super(new BorderLayout())

mouseEventArea.setText("1) Click the \"Set Mouse Hook\" button.\n" +

"2) Start clicking anywhere on the desktop. Mouse clicks will be captured here.\n" +

"3) Stop the mouse hook by clicking the \"Remove Mouse Hook\" button.\n\n")

JScrollPane MouseEventPane = new JScrollPane(mouseEventArea)

add(MouseEventPane, BorderLayout.CENTER)

JPanel buttonPanel = new JPanel()

buttonPanel.setBorder(BorderFactory.createEmptyBorder(10,10,10,10))

buttonPanel.setLayout(new FlowLayout(FlowLayout.RIGHT))

setHookBtn = new JButton("Set Mouse Hook")

setHookBtn.addActionListener(new ActionListener() {

public void actionPerformed(ActionEvent arg0) {

setMouseHook()

}} )

removeHookBtn = new JButton("Remove Mouse Hook")

removeHookBtn.addActionListener(new ActionListener() {

public void actionPerformed(ActionEvent arg0) {

unsetMouseHook()

}} )

removeHookBtn.setEnabled(false)

buttonPanel.add(setHookBtn)

buttonPanel.add(removeHookBtn)

add(buttonPanel, BorderLayout.SOUTH)

}

private void setMouseHook() {

setHookBtn.setEnabled(false)

removeHookBtn.setEnabled(true)

// This hook is called in the context of the thread that installed it.

// The call is made by sending a message to the thread that installed the hook.

// Therefore, the thread that installed the hook must have a message loop.

//

// We crate a new thread as we don't want the AWT Event thread to be stuck running a message pump

// nor do we want the main thread to be stuck in running a message pump

Thread hookThread = new Thread(new Runnable(){

public void run() {

if (MouseProc.hookHandle == 0) {

int hInstance = User32.GetWindowLong(Util.getWindowHandle(frame), GWL_HINSTANCE)

MouseProc.hookHandle = SetWindowsHookEx(WH_MOUSE_LL,

new Callback(MouseProc.class, "lowLevelMouseProc"),

hInstance,

0)

// Standard message dispatch loop (message pump)

Msg msg = new Msg()

while (User32.GetMessage(msg, 0, 0, 0)) {

User32.TranslateMessage(msg)

User32.DispatchMessage(msg)

}

} else {

mouseEventArea.append("The Hook is already installed.\n")

}

}})

hookThread.start()

}

private void unsetMouseHook() {

setHookBtn.setEnabled(true)

removeHookBtn.setEnabled(false)

UnhookWindowsHookEx(MouseProc.hookHandle)

MouseProc.hookHandle = 0

}

private static void createAndShowGUI() {

//Create and set up the window.

frame = new JFrame("Mouse Hook")

frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE)

MouseHook MouseEventsWindow = new MouseHook()

MouseEventsWindow.setBorder(BorderFactory.createEmptyBorder(5,5,5,5))

//Add content to the window.

frame.add(MouseEventsWindow, BorderLayout.CENTER)

//Display the window.

frame.pack()

frame.setBounds(300, 200, 750, 600)

frame.setVisible(true)

}

public static void main(String[] args) {

//Schedule a job for the event-dispatching thread:

//creating and showing this application's GUI.

javax.swing.SwingUtilities.invokeLater(new Runnable() {

public void run() {

createAndShowGUI()

}

})

}

}

class MouseProc {

static int hookHandle

@NativeImport(library = "user32")

public native static int CallNextHookEx (int idHook, int nCode, int wParam, int lParam)

static {

JInvoke.initialize()

}

public static int lowLevelMouseProc(int nCode, int wParam, int lParam ) {

if (nCode <0)

return CallNextHookEx(hookHandle, nCode, wParam, lParam)

if (nCode == HC_ACTION) {

MouseHookStruct mInfo = Util.ptrToStruct(lParam, MouseHookStruct.class)

String message = "Mouse pt: (" + mInfo.pt.x + ", " + mInfo.pt.y + ") "

switch (wParam) {

case WM_LBUTTONDOWN:

message += "Left button down"

break

case WM_LBUTTONUP:

message += "Left button up"

break

case WM_MOUSEMOVE:

message += "Mouse moved"

break

case WM_MOUSEWHEEL:

message += "Mouse wheel rotated"

break

case WM_RBUTTONDOWN:

message += "Right button down"

break

case WM_RBUTTONUP:

message += "Right button down"

break

}

System.out.println(message)

//MouseHook.mouseEventArea.append(message+"\n")

}

return CallNextHookEx(hookHandle, nCode, wParam, lParam)

}

}

=============================================

import com.jinvoke.NativeStruct

import com.jinvoke.win32.structs.Point

@NativeStruct

public class MouseHookStruct {//MSLLHOOKSTRUCT

public Point pt = new Point()

public int mouseData

public int flags

public int time

public int dwExtraInfo

}


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

原文地址:https://54852.com/bake/7948488.html

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

发表评论

登录后才能评论

评论列表(0条)

    保存