java - 出于 glasspane 的目的,为什么 Swing 中的输入元素似乎不被视为 JPanel 的一部分?

标签 java swing jpanel glasspane

我所说的输入元素是指 JSpinners 和 JComboxBoxes 等元素。我的 glasspane 传递了一个包含 JSpinners、JComboBoxes 以及大部分 JLabels 的 JPanel。玻璃板附有一个 MouseListener。令人惊讶的是,当鼠标光标离开输入元素并悬停在 JPanel 的其他部分或空白区域上时,将调用 mouseEntered!这是正常行为吗?出于 Glasspane 的目的,如何才能将输入元素视为 JPanel 的一部分?

这是我的 UI 及其输入元素和 jLabels 的屏幕截图。 Sample UI

这是一段示例代码:

import javax.swing.*;

public class DialogTest {
    public DialogTest() {
        JPanel dialogPanel = new JPanel();
        SpinnerModel edgeModel = new SpinnerNumberModel(1, 1, 9, 1);
        JSpinner edgeSpn = new JSpinner(edgeModel);
        dialogPanel.add(edgeSpn);

        JDialog initialDialog = new JDialog(new JFrame(), "Test", true);
        initialDialog.setContentPane(dialogPanel);
        initialDialog.pack();
        glass = new GlassComponent(dialogPanel);
        initialDialog.setGlassPane(glass);
        glass.setOpaque(false);
        glass.setVisible(true);
    initialDialog.setDefaultCloseOperation(JDialog.DISPOSE_ON_CLOSE);
    initialDialog.setVisible(true);
    }
}

public class GlassComponent implements MouseListener {
   JPanel c;
   public GlassComponent(JPanel c) {
       this.c = c;
       this.c.addMouseListener(this);
   }

   ...
   public mouseEntered(MouseEvent e) {
       System.out.println("Entered JPanel");
   }    
}

作为解释,我的目标是最终使用 GlassPane 来阻止那些标有禁止标志的元素的输入。然而,考虑到分配给dialogPanel的mouseListener似乎在离开输入元素时生成新事件,我可能很难实现这一点。

最佳答案

可以将鼠标事件转发到底层组件,如The Glass Pane所示演示的方法,redispatchMouseEvent()

关于java - 出于 glasspane 的目的,为什么 Swing 中的输入元素似乎不被视为 JPanel 的一部分?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9707470/

相关文章:

java - 代码非常相似的按钮不能同时工作。为什么?

java - 当同一框架中有多个 JPanel 时,如何在特定 JPanel 中绘画 - Java

java - 为什么这个 while 循环会阻止 Paint 方法正常工作?

java - 使用 Retrofit 从服务器获取信息并将所需数据分配给 Spinner

java - 我应该如何运行相同的测试用例而不运行 TestNG 中的 @before 方法?

java - 继承的 Activity 方法不是从导入的库中调用的

java - 如何在 JPanel.getComponents() 内循环时获取 JButton 属性

java - Maven错误: Could not calculate build plan

java - 在 Java Swing 应用程序中嵌入 Log4j 和 AOP 以进行异常日志记录

java - 将 JTextField 的文本分配给数组的下一个元素