我有一个JScrollPane
包含一个BoxLayout
(页轴)的面板。
我的问题是 JScrollPane 对鼠标滚轮事件没有反应。要使其使用鼠标滚轮滚动,我需要在JScrollBar
.
我找到了这个线程,我没有MouseMotionListener
or MouseWheelListener
,只有MouseListener
. 我认为我的问题来自这样一个事实,即我JScrollPane
对JPanel
包含其他面板本身的操作。因此,当鼠标位于其中的面板上时JScrollPane
,似乎该面板消耗了该事件,而滚动面板从未见过该事件。
是否有正确的方法使滚动窗格的子级捕获的事件对此滚动窗格可见?
SSCCE:
这是一个简单的测试用例,试图显示我何时尝试在我的 Swing 应用程序中进行操作。
框架:
public class NewJFrame extends javax.swing.JFrame {
public NewJFrame() {
initComponents();
for (int i = 0; i < 50; i++) {
jPanel1.add(new TestPanel());
}
}
private void initComponents() {
jScrollPane1 = new javax.swing.JScrollPane();
jPanel1 = new javax.swing.JPanel();
setDefaultCloseOperation(javax.swing.WindowConstants.EXIT_ON_CLOSE);
jPanel1.setLayout(new javax.swing.BoxLayout(jPanel1, javax.swing.BoxLayout.PAGE_AXIS));
jScrollPane1.setViewportView(jPanel1);
getContentPane().add(jScrollPane1, java.awt.BorderLayout.CENTER);
pack();
}
public static void main(String args[]) {
java.awt.EventQueue.invokeLater(new Runnable() {
@Override
public void run() {
new NewJFrame().setVisible(true);
}
});
}
}
以及TestPanel
定义:
public class TestPanel extends javax.swing.JPanel {
public TestPanel() {
initComponents();
}
private void initComponents() {
jLabel1 = new javax.swing.JLabel();
jLabel2 = new javax.swing.JLabel();
jScrollPane1 = new javax.swing.JScrollPane();
jTextArea1 = new javax.swing.JTextArea();
jLabel1.setText("jLabel1");
setBackground(new java.awt.Color(255, 51, 51));
setLayout(new java.awt.BorderLayout());
jLabel2.setText("TEST LABEL");
jLabel2.setHorizontalTextPosition(javax.swing.SwingConstants.CENTER);
add(jLabel2, java.awt.BorderLayout.PAGE_START);
jTextArea1.setEditable(false);
jTextArea1.setColumns(20);
jTextArea1.setRows(5);
jTextArea1.setFocusable(false);
jScrollPane1.setViewportView(jTextArea1);
add(jScrollPane1, java.awt.BorderLayout.CENTER);
}
}
似乎消耗了该JTextArea
事件,因为当鼠标光标在其中时,使用滚轮的滚动不起作用。我必须将鼠标光标放在文本区域之外才能使其再次工作。