- iOS/Objective-C 元类和类别
- objective-c - -1001 错误,当 NSURLSession 通过 httpproxy 和/etc/hosts
- java - 使用网络类获取 url 地址
- ios - 推送通知中不播放声音
我有一个带有以下 ActionListener 的 MenuItem“maddbound3”的窗口:
maddbound3.addActionListener
(
new ActionListener()
{
public void actionPerformed(ActionEvent e)
{
menu_addbound3();
}
}
);
当菜单被点击时,这个监听器调用下面的 menu_addbound3():
void menu_addbound3()
{
while(getEditMode() != EditMode.NONE)
{
System.out.println("!... " + getEditMode());
synchronized(this)
{
try
{
wait();
}
catch(InterruptedException e)
{
e.printStackTrace();
}
}
}
}
MouseClicked 事件改变编辑模式的值并发出 notifyAll() 以便 while 循环退出。但是,测试表明,当系统运行while循环时,鼠标点击不会发生MouseClicked事件。
ActionListener 是否会阻止 MouseClicked 事件?我该如何解决这个问题?
谢谢
最佳答案
在 Swing 事件线程上不要有 while(true)
,同样不要在 Swing 事件线程上调用 wait()
—— 你将卡住整个 GUI,使其完全无响应。您需要了解主 Swing 事件线程或“事件调度线程”负责所有 Swing 绘图和用户交互,因此如果您将其与长时间运行或卡住的代码捆绑在一起,就会锁定整个 GUI。
相反,更改程序的状态——可能通过设置一两个变量,并让程序的行为取决于此状态。如果您需要更具体的建议,请告诉我们您想要实现的行为,我们或许可以为您提供更好的方法。
有关 Swing 事件线程的更多信息,请阅读:Lesson: Concurrency in Swing
编辑
你声明:
When the user clicks the menu item I want to obtain information via a series of "discrete" mouse clicks from the window. Hence, on clicking the menu, the user would be prompted to "select a point in the window". So, what I need is for my ActionListener function (menu_addbound3) to then wait for a mouse click. Hence the wait/notify setup. A mouse click changes the edit_mode and notifyAll() causes the wait in the while loop to exit which then causes the while loop to exit and I can then prompt for my next bit of information within the menu_addbound3 function, repeating this as as I need to.
感谢您的澄清,现在我可以肯定地告诉您您做错了,您绝对不想使用 while 循环或等待或通知。有很多方法可以解决这个问题,一个可能是使用一些 boolean 或枚举变量来给程序一个状态,然后根据状态改变它的行为。您的 EditMode 枚举可以在 MouseListener 中使用,让它知道它处于 Activity 状态,然后您还可以为 MouseListener 类提供一个 boolean 变量 windowPointSelected,设置为 false,然后仅在第一次点击后才将其设置为 true。
编辑2
例如:
import java.awt.Color;
import java.awt.Dimension;
import java.awt.Point;
import java.awt.event.ActionEvent;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;
import javax.swing.*;
@SuppressWarnings("serial")
public class ProgState extends JPanel {
private static final int PREF_W = 400;
private static final int PREF_H = PREF_W;
private static final Color EDIT_COLOR = Color.red;
private EditMode editMode = EditMode.NONE;
private boolean firstPointSelected = false;
private JMenuBar jMenuBar = new JMenuBar();
private JTextField firstPointField = new JTextField(15);
private JTextField secondPointField = new JTextField(15);
public ProgState() {
add(firstPointField);
add(secondPointField);
JMenu menu = new JMenu("Menu");
menu.add(new JMenuItem(new AbstractAction("Edit") {
@Override
public void actionPerformed(ActionEvent arg0) {
setEditMode(EditMode.EDITING);
setFirstPointSelected(false);
}
}));
jMenuBar.add(menu);
addMouseListener(new MouseAdapter() {
@Override
public void mousePressed(MouseEvent mEvt) {
if (getEditMode() == EditMode.EDITING) {
Point p = mEvt.getPoint();
String pStr = String.format("[%d, %d]", p.x, p.y);
if (!isFirstPointSelected()) {
firstPointField.setText(pStr);
setFirstPointSelected(true);
} else {
secondPointField.setText(pStr);
setEditMode(EditMode.NONE);
}
}
}
});
}
public void setEditMode(EditMode editMode) {
this.editMode = editMode;
Color c = editMode == EditMode.NONE ? null : EDIT_COLOR;
setBackground(c);
}
public EditMode getEditMode() {
return editMode;
}
public void setFirstPointSelected(boolean firstPointSelected) {
this.firstPointSelected = firstPointSelected;
}
public boolean isFirstPointSelected() {
return firstPointSelected;
}
@Override
public Dimension getPreferredSize() {
return new Dimension(PREF_W, PREF_H);
}
public JMenuBar getJMenuBar() {
return jMenuBar;
}
private static void createAndShowGui() {
ProgState progState = new ProgState();
JFrame frame = new JFrame("EditMode");
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.getContentPane().add(progState);
frame.setJMenuBar(progState.getJMenuBar());
frame.pack();
frame.setLocationRelativeTo(null);
frame.setVisible(true);
}
public static void main(String[] args) {
SwingUtilities.invokeLater(new Runnable() {
public void run() {
createAndShowGui();
}
});
}
}
enum EditMode {
NONE, EDITING
}
关于java - ActionListener 调用阻止 MouseClick 事件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11032321/
到目前为止,我的 mouseClicked() 方法使用 getX() 和 getY()。查看用户是否单击肺部图片。然而,通过使用 x 和 y,成功的“区域”是一个盒子,而不是肺部的形状。因此,单击肺
private JTable getTRent() { if (tRent == null) { ... tRent.addMouseListener(new MouseAda
经过 2 个小时的搜索,我真的找不到为什么我的代码不起作用,所以我想知道你是否可以提供帮助。 当我按下按钮时,我想看到的只是“点击”。我的类 MouseInput 实现了 MouseListener
所以我本质上正在开发一个交易或不交易的java游戏,现在我试图让图像图标在用户点击的地方消失。因此,我有一个 6 x 6 的“金属公文包”(casesArray) 图像图标数组,但无论用户单击何处,只
这是我第一次用 Java 编写游戏。我正在制作一款角色扮演游戏。我已经成功地使用 KeyListener 函数用箭头键移动我的角色。但是,当在窗口中单击鼠标时,我一直试图将角色移向鼠标。我已经发现它可
我正在尝试编写一个寻路迷宫算法,以尝试将 A* 实现到 JPanel 接口(interface)中。代码如下。如您所见,我使用随机数生成器随机生成迷宫方 block 的颜色。以下是源代码的基本实现:
这似乎应该有效,但实际上无效。我在 SWITCH 语句上设置了调试停止。此事件仅在左键单击时触发。没有任何反应,方法不会在中键或右键单击时触发。有任何想法吗?附言我已经尝试过使用 MouseUp 和
我有一个单元格对象的二维数组,其中包含其“tileCode”的字符串变量,当我使用键盘设置 Activity 图 block 代码,然后单击二维数组中所需的单元格时,它应该更改该单元格的tileCod
我正在制作一个 GUI 配对猜谜游戏,带有 9x12 面板,每个面板中保存一个随机数。我已经做到了,当您将鼠标悬停在每个单独的面板上时,它会从红色变为黄色,并在鼠标离开面板区域后变回红色。我现在的问题
public class ControllerGui { private JFrame frame; private JTextField textField; private JTextField
我正在扩展 JButton 类并使用 ImageIcon 作为按钮背景。我还添加了一个 mouseListener,以便当鼠标悬停在按钮上或按下按钮时可以更改按钮的图像。这一切都工作正常,但问题是,当
我正在使用 java3D 并希望将单击的项目的 ID 传递给我的类。但它没有成功。它可以打印 ID,也可以将其传递给字符串文本。但它在 game.btClicked(text); 行中显示 nullP
我尝试制作一个程序,每次单击时都会创建一个视觉效果,但它不起作用,因此我将代码精简为不起作用的示例。起初我认为问题是我没有绘图函数,因此处理没有搜索事件,但是当我添加 println 时它仍然没有触发
我想知道是否有一个选项可以使用java机器人类来单击像素之间。我在网上没有找到任何相关信息。 示例:robot.mousePress(float x, float y); 最佳答案 我认为您不能在 m
有没有一种方法可以以秒或毫秒为单位计算单击鼠标按钮和释放鼠标按钮之间的时间。 我使用了此功能,但不适合我 public void mouseClicked (MouseEvent me) { l
所以我对如何从另一个组件的 mouseClicked 方法访问其他屏幕组件/变量(我不知道如何调用它们,但是像文本框、按钮等)有点困惑。例如,假设单击一个按钮后,另一个按钮就会被禁用。我的意思是,在这
我使用 JPanel 为 Game Of Life 制作 GUI,我的类扩展了 JFrame 并实现了 MouseListener,但是当我单击 JLabel 时,MouseListener 只工作一
我正在编写一个程序,当我单击时,它将移动一个矩形。我有一个函数 move(),它可以将矩形向下移动 100 倍一个像素,并使用 pause(20) 在每次移动之间等待 20 毫秒。当我在 run()
我在窗体上有一个带有 MouseClick 事件的面板。问题是每次单击面板时都不会触发 MouseClick 事件。它跳过点击时非常随机。 我想我可以改用 MouseDown 和 MouseUp 事件
你好我读过可以像方法一样引发事件。嗯,它适用于我的自定义事件(我创建了一个委托(delegate),事件,我可以通过调用它来引发事件)。但是,我无法手动引发 MouseClick 等事件,它一直说它必
我是一名优秀的程序员,十分优秀!