![](/img/trans.png)
[英]How to draw grid using swing class Java and detect mouse position when click and drag
[英]How to detect the user is using the Trackpad and not the mouse in Java swing?
我有一个 Java swing 应用程序,它使用“可平移”JComponent 来显示大数据。 当用户移动鼠标滚轮时,我会监听这些事件,并根据滚动量更新 JComponent 的内容。
我想根据用户是否有不同的行为
我如何检测到用户正在使用鼠标滚轮与触控板来生成滚动事件? 我依赖于 java 1.6 swing,我不能去 javaFX。
问题背后的故事:我只是想在用户使用鼠标滚轮时为滚动事件添加一种很酷的惯性感觉。 但当然,在 MacOSX 上,触控板内置了自己的惯性功能。 所以我想决定是否应该产生惯性运动。
Java Swing是一项老技术,它支持传统的鼠标滚轮旋转事件。
当您使用旧的滚轮鼠标或滚轮轨迹板时,它将读取硬件滚轮的旋转。
当您使用现代激光鼠标时,鼠标移动将转换为旋转运动。
当你使用像现代Mac笔记本电脑那样的触控式跑道时,滚动手势将被转换为旋转动作,单击和双击如左右键(基于OS鼠标垫配置)。
您可以使用库来详细检查输入设备,如果您的鼠标或触控板通过USB连接到您的计算机,您可以尝试J-USB库 。
至于内部硬件,首先必须确定操作系统的类型,并在此基础上获取有关Java系统和硬件的信息 。
最后,如果您的应用程序与用户交互,我建议询问用户他们使用的鼠标类型,并将其存储在配置文件中。
试试这个代码
MetaDown用于右键单击
AltDown用于鼠标滚轮
。
public class Exp extends JFrame {
private String string;
private JLabel l;
public Exp() {
super("Title");
l = new JLabel("Status");
add(l, BorderLayout.SOUTH);
addMouseListener(new MouseClass());
}
private class MouseClass extends MouseAdapter {
public void mouseClicked(MouseEvent e) {
string = String.format("Clicked %d Times", e.getClickCount());
if(e.isMetaDown())
string += " With Right Mouse Button";
else if(e.isAltDown())
string += " With Centre Mouse Button";
else
string += " With Left Mouse Button";
l.setText(string);
}
}
}
也试试这个:
您可以通过SwingUtilities中的这三种方法确定按下哪个鼠标按钮:
isLeftMouseButton
isMiddleMouseButton
isRightMouseButton
鼠标滚轮监听器API
虽然MouseWheelListener
只有一个方法,但它有相应的适配器类 - MouseAdapter
。 此功能使应用程序只有一个适配器类实例,以便组件从鼠标指针管理所有类型的事件。
mouseWheelMoved(MouseWheelEvent) //Called when the mouse wheel is rotated.
以下代码段与鼠标滚轮事件处理有关:
import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.Dimension;
import java.awt.event.MouseWheelEvent;
import java.awt.event.MouseWheelListener;
import javax.swing.*;
public class MouseWheelEventDemo extends JPanel
implements MouseWheelListener {
JTextArea textArea;
JScrollPane scrollPane;
static final String NEWLINE = System.getProperty("line.separator");
public static void main(String[] args) {
/* Use an appropriate Look and Feel */
try {
//UIManager.setLookAndFeel("com.sun.java.swing.plaf.windows.WindowsLookAndFeel");
//UIManager.setLookAndFeel("com.sun.java.swing.plaf.gtk.GTKLookAndFeel");
UIManager.setLookAndFeel("javax.swing.plaf.metal.MetalLookAndFeel");
} catch (UnsupportedLookAndFeelException ex) {
ex.printStackTrace();
} catch (IllegalAccessException ex) {
ex.printStackTrace();
} catch (InstantiationException ex) {
ex.printStackTrace();
} catch (ClassNotFoundException ex) {
ex.printStackTrace();
}
/* Turn off metal's use of bold fonts */
UIManager.put("swing.boldMetal", Boolean.FALSE);
//Schedule a job for the event dispatch thread:
//creating and showing this application's GUI.
javax.swing.SwingUtilities.invokeLater(new Runnable() {
public void run() {
createAndShowGUI();
}
});
}
/**
* Create the GUI and show it. For thread safety,
* this method should be invoked from the
* event dispatch thread.
*/
private static void createAndShowGUI() {
//Create and set up the window.
JFrame frame = new JFrame("MouseWheelEventDemo");
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
//Create and set up the content pane.
JComponent newContentPane = new MouseWheelEventDemo();
newContentPane.setOpaque(true); //content panes must be opaque
frame.setContentPane(newContentPane);
//Display the window.
frame.pack();
frame.setVisible(true);
}
public MouseWheelEventDemo() {
super(new BorderLayout());
textArea = new JTextArea();
textArea.setEditable(false);
scrollPane = new JScrollPane(textArea);
scrollPane.setVerticalScrollBarPolicy(
JScrollPane.VERTICAL_SCROLLBAR_ALWAYS);
scrollPane.setPreferredSize(new Dimension(400, 250));
add(scrollPane, BorderLayout.CENTER);
textArea.append("This text area displays information "
+ "about its mouse wheel events."
+ NEWLINE);
//Register for mouse-wheel events on the text area.
textArea.addMouseWheelListener(this);
setPreferredSize(new Dimension(450, 350));
setBorder(BorderFactory.createEmptyBorder(20,20,20,20));
}
//Append to the text area and make sure the new text is visible.
void eventOutput(String eventDescription, MouseWheelEvent e) {
textArea.append(e.getComponent().getClass().getName()
+ ": "
+ eventDescription);
textArea.setCaretPosition(textArea.getDocument().getLength());
}
public void mouseWheelMoved(MouseWheelEvent e) {
String message;
int notches = e.getWheelRotation();
if (notches < 0) {
message = "Mouse wheel moved UP "
+ -notches + " notch(es)" + NEWLINE;
} else {
message = "Mouse wheel moved DOWN "
+ notches + " notch(es)" + NEWLINE;
}
if (e.getScrollType() == MouseWheelEvent.WHEEL_UNIT_SCROLL) {
message += " Scroll type: WHEEL_UNIT_SCROLL" + NEWLINE;
message += " Scroll amount: " + e.getScrollAmount()
+ " unit increments per notch" + NEWLINE;
message += " Units to scroll: " + e.getUnitsToScroll()
+ " unit increments" + NEWLINE;
message += " Vertical unit increment: "
+ scrollPane.getVerticalScrollBar().getUnitIncrement(1)
+ " pixels" + NEWLINE;
} else { //scroll type == MouseWheelEvent.WHEEL_BLOCK_SCROLL
message += " Scroll type: WHEEL_BLOCK_SCROLL" + NEWLINE;
message += " Vertical block increment: "
+ scrollPane.getVerticalScrollBar().getBlockIncrement(1)
+ " pixels" + NEWLINE;
}
eventOutput(message, e);
}
}
对于使用鼠标滚轮的单位增量的系统,MouseWheelEventDemo的输出可能如下所示:
javax.swing.JTextArea: Mouse wheel moved UP 1 notch(es)
Scroll type: WHEEL_UNIT_SCROLL
Scroll amount: 3 unit increments per notch
Units to scroll: -3 unit increments
Vertical unit increment: 16 pixels
对于 MacOS,您可以在 Java 中获取所有触摸板事件,我已经搜索了一段时间,只是回答了我自己的问题。 把这个留在这里,以防其他人从同一个兔子洞开始
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.