【发布时间】:2020-07-08 05:54:02
【问题描述】:
我正在尝试创建一个摆动弹出窗口,它将所有键盘事件转发到其中的文本字段,并将所有鼠标滚动事件转发到其中的 JScrollPane。我想出了这段代码,它覆盖了一些 processXXXEvent 方法,但是这种覆盖没有任何效果(您必须单击文本字段来键入并将鼠标移到 JScrollPane 上才能滚动它。
import javax.swing.*;
import java.awt.*;
import java.awt.event.KeyEvent;
import java.awt.event.MouseEvent;
import java.awt.event.MouseListener;
import java.awt.event.MouseWheelEvent;
import java.util.Random;
public class T extends JPanel {
private final JTextField tf;
private final JScrollPane sv;
T() {
this.tf = new JTextField();
this.tf.setPreferredSize(new Dimension(100, 30));
var lv = new JList<String>();
lv.setListData(new String[] {"A", "B", "C", "D", "A", "B", "C", "D", "A", "B", "C", "D"});
this.sv = new JScrollPane(lv);
add(this.sv);
add(this.tf);
}
@Override
protected void processKeyEvent(KeyEvent e) {
if (e.getKeyCode() == KeyEvent.VK_ENTER) {
this.setVisible(false);
} else {
this.tf.dispatchEvent(e);
}
}
@Override
protected void processMouseWheelEvent(MouseWheelEvent e) {
this.sv.dispatchEvent(e);
}
static JPopupMenu popup;
static void showPopup(JFrame frame) {
popup = new JPopupMenu();
popup.add(new T());
popup.show(frame, 0 ,0);
}
public static void main(String[] args) {
JFrame frame = new JFrame("HelloWorldSwing");
frame.setPreferredSize(new Dimension(200, 200));
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.setBackground(Color.GRAY);
var b = new JButton("CLICK");
b.setPreferredSize(new Dimension(100, 100));
b.addMouseListener(new MouseListener() {
@Override
public void mouseClicked(MouseEvent mouseEvent) {
showPopup(frame);
}
@Override
public void mousePressed(MouseEvent mouseEvent) {}
@Override
public void mouseReleased(MouseEvent mouseEvent) {}
@Override
public void mouseEntered(MouseEvent mouseEvent) {}
@Override
public void mouseExited(MouseEvent mouseEvent) {}
});
frame.add(b);
frame.pack();
frame.setVisible(true);
}
}
如何实现这种行为?
【问题讨论】:
标签: java swing user-interface event-handling