- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我需要一个屏幕虚拟操纵杆解决方案来控制外部设备 - 购物车。我的程序是用 Java/Swing 编写的,它可以在带有电阻式触摸屏的 Windows 坚固型平板电脑上运行。 Swing 中没有 x-y slider 控件,无法通过 Google 找到它,所以可能我需要从头开始编写它。现在的问题是:编写此类控件的最佳方法是什么?我想放置两个 JSlider 控件,一个水平,第二个垂直,并制作自定义拇指,但我担心这会给我带来麻烦,因为它实际上是一种 hack。也许只是从头开始写?也许有现有的解决方案?我将通过拇指拖动并触摸最终拇指位置来使用它。
最佳答案
例如
import java.awt.BasicStroke;
import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.Dimension;
import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.Point;
import java.awt.RenderingHints;
import java.awt.Stroke;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.SwingUtilities;
public class SimpleJoystickDemo extends JFrame {
//I think that orginally made by @HFOE
private int displayWidth = 340;
private int displayHeight = 550;
private final Point position;
public SimpleJoystickDemo() {
super("SimpleJoystickDemo");
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
setSize(displayWidth, displayHeight);
setLocationRelativeTo(null);
position = new Point();
SimpleJoystick myJoystick = new SimpleJoystick(150, position, 100);
add(myJoystick, BorderLayout.PAGE_END);
Drawing drawing = new Drawing(position);
add(drawing);
}
public static void main(final String[] args) {
Runnable gui = new Runnable() {
@Override
public void run() {
new SimpleJoystickDemo().setVisible(true);
}
};
SwingUtilities.invokeLater(gui);
}
private class Drawing extends JPanel {
private static final long serialVersionUID = 1L;
private final Point position;
public Drawing(Point position) {
this.position = position;
}
@Override
protected void paintComponent(Graphics g) {
super.paintComponent(g);
Graphics2D g2 = (Graphics2D) g;
g2.setRenderingHint(RenderingHints.KEY_ANTIALIASING,
RenderingHints.VALUE_ANTIALIAS_ON);
g2.setColor(Color.RED);
g2.fillOval(160 + position.x, 160 - position.y, 15, 15);
}
}
}
class SimpleJoystick extends JPanel {
private static final long serialVersionUID = 1L;
//Maximum value for full horiz or vert position where centered is 0:
private int joyOutputRange;
private float joySize; //joystick icon size
private float joyWidth, joyHeight;
private float joyCenterX, joyCenterY; //Joystick displayed Center
//Display positions for text feedback values:
private int textHorizPos, textVertPos;
private int fontSpace = 12;
private float curJoyAngle; //Current joystick angle
private float curJoySize; //Current joystick size
private boolean isMouseTracking;
private boolean leftMouseButton;
private int mouseX, mouseY;
private Stroke lineStroke = new BasicStroke(10, BasicStroke.CAP_ROUND,
BasicStroke.JOIN_ROUND);
private final Point position;
public SimpleJoystick(final int joyOutputRange,
final Point position, final int joySize) {
this.joyOutputRange = joyOutputRange;
this.position = position;
this.joySize = joySize;
joyWidth = joySize;
joyHeight = joyWidth;
setPreferredSize(new Dimension((int) joyWidth + 250,
(int) joyHeight + 80));
joyCenterX = getPreferredSize().width / 2;
joyCenterY = getPreferredSize().height / 2;
this.joySize = joyWidth / 2;
setBackground(new Color(226, 226, 226));
MouseAdapter mouseAdapter = new MouseAdapter() {
@Override
public void mouseMoved(final MouseEvent e) {
mouseCheck(e);
}
@Override
public void mousePressed(final MouseEvent e) {
leftMouseButton = SwingUtilities.isLeftMouseButton(e);
mouseCheck(e);
}
};
addMouseMotionListener(mouseAdapter);
addMouseListener(mouseAdapter);
}
private void mouseCheck(final MouseEvent e) {
mouseX = e.getX();
mouseY = e.getY();
float dx = mouseX - joyCenterX;
float dy = mouseY - joyCenterY;
if (leftMouseButton) {
isMouseTracking = true;
} else {
isMouseTracking = false;
}
if (isMouseTracking) {
curJoyAngle = (float) Math.atan2(dy, dx);
curJoySize = (float) Point.distance(mouseX, mouseY,
joyCenterX, joyCenterY);
} else {
curJoySize = 0;
}
if (curJoySize > joySize) {
curJoySize = joySize;
}
position.x = (int) (joyOutputRange * (Math.cos(curJoyAngle)
* curJoySize) / joySize);
position.y = (int) (joyOutputRange * (-(Math.sin(curJoyAngle)
* curJoySize) / joySize));
SwingUtilities.getRoot(SimpleJoystick.this).repaint();
}
@Override
protected void paintComponent(final Graphics g) {
super.paintComponent(g);
Graphics2D g2 = (Graphics2D) g;
g2.setRenderingHint(RenderingHints.KEY_ANTIALIASING,
RenderingHints.VALUE_ANTIALIAS_ON);
g2.setColor(Color.LIGHT_GRAY);
g2.fillOval((int) (joyCenterX - joyWidth / 2),
(int) (joyCenterY - joyHeight / 2),
(int) joyWidth, (int) joyHeight);
//rotate and draw joystick line segment:
Graphics2D g3 = (Graphics2D) g2.create();
g3.translate(joyCenterX, joyCenterY);
g3.rotate(curJoyAngle);
g3.setColor(Color.GRAY);
g3.setStroke(lineStroke);
g3.drawLine(0, 0, (int) curJoySize, 0);
g3.dispose();
//
g2.setColor(Color.GRAY);
g2.fillOval((int) joyCenterX - 10, (int) joyCenterY - 10, 20, 20);
textHorizPos = 50;
textVertPos = (int) (joyCenterY - 50);
g2.drawString("Horizont:", textHorizPos, textVertPos);
textHorizPos += (4 * fontSpace);
g2.drawString(String.valueOf(position.x), textHorizPos, textVertPos);
textHorizPos = 50;
textVertPos += 12;
g2.drawString("Vertical :", textHorizPos, textVertPos);
textHorizPos += (4 * fontSpace);
g2.drawString(String.valueOf(position.y), textHorizPos, textVertPos);
}
}
关于Java 屏幕虚拟操纵杆控制,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16439621/
我有一个在 SpriteKit 中创建的圆形操纵杆,我如何将较小的控制杆夹在较大的操纵杆底座内,并以编程方式防止它超出操纵杆底座。 在我的 didMove(toView:) 方法中设置操纵杆的代码。
嘿,我需要创建一个用于相机控制的操纵杆。操纵杆需要能够向左、右、上、下四个方向移动,其中两个方向具有停止功能。我在网上搜索了几个小时,终于找到了一个叫做 nipplejs 的东西。我已将 nipple
Android 3.1+ 支持操纵杆和游戏 handle ,但没有任何示例。我尝试使用 onTrackballEvent 但它没有用。如何在我的 Android 应用程序中使用操纵杆? 最佳答案 查看
每当我改变操纵杆的方向时,我都会尝试执行我的玩家 Sprite 的一些动画。 我正在使用 TheSneakyNarwhal's drop in Joystick class它使用以下方法: if (
如何在 Sphero-Android 应用程序中使用 JoystickView?我关注了this链接以便在我的布局中实现 Joystick View,但 RobotLibrary.jar 中没有名为
我正在使用 Microsoft DirectX 访问我的游戏 handle 。这是一个像这样的 USB 游戏 handle : 我可以知道何时按下按钮以及轴的模拟值... 问题是是否有办法知道何时按下
我正在开发一款带有操纵杆的 Arduino 游戏。我有 4 个 LED 灯,每 2 秒,其中 1 个会亮起。使用操纵杆时,您必须尽快使用react才能关闭 LED 灯。例如,如果左侧 LED 亮起,您
我有一个 USB 操纵杆,我想为其编写自己的 HID 驱动程序。值得注意的是,我想在 Windows 接收操纵杆输入和我的应用程序收到该输入事件通知之间插入延迟。我还想更改我的应用程序感知的操纵杆的身
在我的项目中,我使用 directinput 来管理连接到 PC 的操纵杆并且它可以工作,但是恕我直言,directimput 很难理解和完美地管理... 是否存在其他一些库/方法来以更漂亮的模式管理
我有一个便宜的 PS3 Controller 和一个 NEO-GEO X Controller 。它们都在例如上检测到。 Fedora 20 和 Lubuntu 14.04。它们出现在 lsusb 中
我一直在尝试从 USB 操纵杆读取数据(x/y 轴、按下的按钮等),而且我听说过 DirectInput。一直在寻找几个小时来找到一个像样的例子或演练但收效甚微。如果有人可以分享一个简单的教程,或者指
我想将操纵杆的两 Axis float (水平和垂直)转换为 360 度,以便在游戏中设置玩家方向。根据我的研究,我发现最好的方法是使用 Atan2。 变量: self.rot = 0 horaxis
我是一名优秀的程序员,十分优秀!