【发布时间】:2014-06-06 18:05:10
【问题描述】:
我有一个子类 JFrame 的小程序。代码如下:
package complexviewer;
import java.awt.*;
import java.awt.event.*;
import java.util.concurrent.*;
import static java.util.concurrent.TimeUnit.*;
import javax.swing.*;
public class Applet extends JFrame {
// Window and applet stats
public static final int windowSize = 400;
public static final int updateDelay = 20;
// Instance variables
private ScheduledExecutorService timer = Executors.newScheduledThreadPool(1);
public static void main(String[] args) {
new Applet();
}
public Applet() {
// Set up window
super("Complex Viewing Frame");
setSize(windowSize, windowSize);
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
setVisible(true);
// Add listeners
JPanel panel = new JPanel();
panel.setFocusable(true);
panel.addKeyListener(new KeyListener() {
public void keyPressed(KeyEvent key) {
System.out.println("Key pressed.");
}
public void keyReleased(KeyEvent key) {}
public void keyTyped(KeyEvent key) {}
});
panel.addMouseListener(new MouseListener() {
public void mouseReleased(MouseEvent mouse) {}
public void mouseClicked(MouseEvent mouse) {}
public void mousePressed(MouseEvent mouse) {
System.out.println("Mouse clicked.");
}
public void mouseEntered(MouseEvent mouse) {}
public void mouseExited(MouseEvent mouse) {}
});
panel.addMouseMotionListener(new MouseMotionListener() {
public void mouseDragged(MouseEvent mouse) {
System.out.println("Mouse dragged.");
}
public void mouseMoved(MouseEvent mouse) {}
});
add(panel);
panel.requestFocus();
timer.scheduleAtFixedRate(() -> repaint(), 0, 200, MILLISECONDS);
}
public void paint(Graphics G) {
// Drawing
}
}
当我运行它时,“按键”事件工作正常,但鼠标事件都不起作用。我在这里想念什么?我查看了其他答案,例如
- Problems With MouseListener
- Why isn't mouselistener working?
- MouseListener on JFrame
- MouseListener/KeyListener not working (JPanel)
- Unresponsive KeyListener for JFrame
此外,选择不同的组件,如 getContentPane() 似乎也不能解决问题。
【问题讨论】:
-
"I have an applet which subclasses JFrame..."-- 必须扩展 Applet 或 JApplet 的 applet 类不能“继承 JFrame”。请澄清。你班级的名字真的是“Applet”吗?这让人困惑到了极点。不要那样做。 -
这一行:
timer.scheduleAtFixedRate(() -> repaint(), 0, 200, MILLISECONDS);表明您在绘画方法中有代码,无论是paint 还是paintComponent,它都会更改此类的状态。您不想这样做,因为您无法控制何时或是否调用这些方法,并且您不想减慢绘制方法的速度。同样,发布您的最小代码示例 -
... 在添加所有组件之前,您不应调用
setVisible(true)。仅在添加所有组件后调用它。如果您真的需要帮助,请再次创建并发布您的 minimal example program。 -
@HovercraftFullOfEels 对于这个(简单的,只是绘制和接收键盘/鼠标事件)应用程序,除了 JFrame,您还建议使用什么结构?使用 JApplet 有什么好处?还是您只是说将其称为“小程序”会令人困惑?
标签: java swing jframe mouselistener