Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/391.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 出于glasspane的目的,为什么Swing中的输入元素似乎不被视为JPanel的一部分?_Java_Swing_Jpanel_Glasspane - Fatal编程技术网

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

Java 出于glasspane的目的,为什么Swing中的输入元素似乎不被视为JPanel的一部分?,java,swing,jpanel,glasspane,Java,Swing,Jpanel,Glasspane,我所说的输入元素是指像JSpinner和JComboxBox这样的东西。我的glasspane被传递给一个JPanel,其中包含JSpinner、JComboxes和大部分JLabel。玻璃窗上有一个鼠标听筒。令人惊讶的是,鼠标光标离开输入元素并悬停在JPanel的其他部分或空白处时,Mouseenterned被调用!这是正常的行为吗?如何使输入元素被视为用于Glasspane的JPanel的一部分 下面是我的UI的屏幕截图,其中包含输入元素和jlabel。 下面是一段示例代码: import

我所说的输入元素是指像JSpinner和JComboxBox这样的东西。我的glasspane被传递给一个JPanel,其中包含JSpinner、JComboxes和大部分JLabel。玻璃窗上有一个鼠标听筒。令人惊讶的是,鼠标光标离开输入元素并悬停在JPanel的其他部分或空白处时,Mouseenterned被调用!这是正常的行为吗?如何使输入元素被视为用于Glasspane的JPanel的一部分

下面是我的UI的屏幕截图,其中包含输入元素和jlabel。

下面是一段示例代码:

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的MouseStener在离开输入元素时似乎正在生成新事件,我可能很难实现这一点

您似乎在使用glasspane,而我觉得它不应该被使用

据我所知,玻璃窗格通常不应该容纳任何组件,而是覆盖在顶层窗口上,然后可以充当其下方组件的门卫,所有组件都由顶层窗口的内容窗格容纳。

  • 您可以使用
    GlassPane
    获取@camickr所需的覆盖,或者根据他的代码或

  • 另一个建议是使用(Java6需要Java7,JXLayer是否存在)


您可以将鼠标事件转发到底层组件,如演示的方法所示,
RedispatchMouseeEvent()

感谢您的回答,这似乎有助于我实现目标。我在演示中看到了RedispatchMouseeEvent(),但直到现在还没有意识到它的重要性和实用性+凌晨1点,我正确推断这是一种新的方式来表示控制不适用?
setEnabled()
或动态布局也可以吗?谢谢您的评论,您的推断是正确的。不幸的是,setEnabled()会使相关的JComponents变灰,因此几乎无法读取。上面的截图并没有达到不可理解的程度。我将不得不谷歌动态布局。嗨气垫船,谢谢你的评论,我重视和尊重它。我想我需要进一步考虑如何实现玻璃窗格。我最初担心的是,我无法用一块空白的玻璃窗格确定鼠标在哪个组件上,但我想GetDeepTestComponentAT()将解决这个问题+你好,mKorbel,感谢您的回答和建议。我仍在消化您链接的代码。:)+1.