Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/353.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语言吗?_Java_Swing - Fatal编程技术网

如果鼠标在框架内,而当它';那不是Java语言吗?

如果鼠标在框架内,而当它';那不是Java语言吗?,java,swing,Java,Swing,如果我在写伪代码: if(mouseInsideFrame==true) frame.setVisible(true); else frame.setVisible(false); 对于if语句中的mouseInsideFrame,我将使用什么方法 谢谢通常你可以使用听众。具体而言: frame.addMouseListener(new MouseListener() { public void mouseEntered(MouseEvent evt) {

如果我在写伪代码:

if(mouseInsideFrame==true)
    frame.setVisible(true);
else
    frame.setVisible(false);
对于if语句中的
mouseInsideFrame
,我将使用什么方法


谢谢

通常你可以使用听众。具体而言:

frame.addMouseListener(new MouseListener() {
    public void mouseEntered(MouseEvent evt) {
        frame.setVisible(true);
    }

    public void mouseExited(MouseEvent evt) {
        frame.setVisible(false);
    }
});

但问题是,由于您的JFrame不可见,因此无法侦听鼠标事件!!!!至少,据我所知……

更新:与以前相同的方法,但有更明确的逐步解释

其他受访者想知道你想用它实现什么,并质疑一个应用程序背后的设计,该应用程序意外地跳到用户面前。我想这是一个你有多死定决心完全按照你所描述的实现这个功能的问题。这项技术本身也可能对其他目的有用,这也是我对这个答案进行新的、改进的修订的主要动机


据我所知,不可见的帧无法捕获鼠标事件。所以它不知道鼠标是否在里面

这个问题有一个漏洞:如果你让你的框架是可见的,但是没有边界并且完全透明,那么它在技术上是可见的,但是在实际应用中用户是看不见的

无边界部分很简单:
setUndercorated(true)

如果
JFrame
有一个像
setOpaque()
settransparent()
这样的方法,您可以使它完全透明,那就太好了,但遗憾的是,它没有

另一个答案提到了一个基于Sun私有类的解决方案,它允许您使窗口透明。这将适用于当前和可能不久的将来的Sun JRE,但远不能保证适用于其他和未来的JRE,因此我不推荐它。Sun明确建议不要这样使用他们的私有类

还有一个替代的,有点黑的替代方案:框架完全可见,但它显示了屏幕截图的图像。因为这意味着我们在有效地观察整个框架,它实际上是不可见的。此处描述了此解决方案:。作者和我都承认这有点笨拙;它还涉及到很多不必要的代码。但它是基于标准Java编码的,在1.4版以上的许多Java环境中都应该不受任何影响地支持它

本技巧介绍如何创建显示屏幕背景的
组件。当您希望框架不可见时,这很好,但是当您希望它正常可见时会发生什么

要做的事情是给
JFrame
ContentPane
一个
CardLayout
,并将
TransparentBackground
组件和您想要的主要可见组件(可能是
JPanel
)添加到其中。通过这种设置,在“不可见”和“可见”之间切换只涉及:

  • 设置未装饰(假)
    /(真)
  • cardLayout.last()
    //(第一个)

当然,这种切换将由您可以添加到JFrame中的
MouseListener来控制。

在我的脑海中,有一种相当简单的方法可以获得鼠标在屏幕上的位置(我认为这与
工具箱
有关)。现在,如果你能结合一种方法来找出你的帧在屏幕上的位置(如果你还不知道的话),你就有了你的解决方案

我很好奇您想做什么。

我遇到了一个包含可见性选项的应用程序,包括这个使用私有AWT API的应用程序

public class TransparentFrame {
  private static final float OPAQUE = 1.0f;
  private static final float TRANSLUCENT = 0.1f;

  public static void main(String[] args) {
    final JFrame frame = new JFrame();
    frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    frame.setSize(600, 400);
    frame.addMouseListener(new MouseAdapter() {
      @Override
      public void mouseEntered(MouseEvent e) {
        com.sun.awt.AWTUtilities.setWindowOpacity(frame, OPAQUE);
      }

      @Override
      public void mouseExited(MouseEvent e) {
        com.sun.awt.AWTUtilities.setWindowOpacity(frame, TRANSLUCENT);
      }
    });
    frame.setVisible(true);
  }
}

这对于玩具代码来说是可以的,但显然我不会使用私有的
com.sun
类来进行可移植的生产代码。

考虑到您正在尝试做的事情,我会说您需要两个帧(或者可能只是JPanel和一个可以进行大量更改的帧。一个是捕获鼠标在其上移动(使其透明、无装饰或其他可接受的方式)当鼠标在其上移动时,显示新框架(或面板),然后在鼠标移出时隐藏该框架(或面板)


这里的其他答案为您提供了如何捕获鼠标事件并将框架设置为不装饰且透明的基本知识。

如果框架不可见,则鼠标不能“在”中框架,那么你能提供一些关于你试图完成什么的更多上下文吗?我正在尝试创建一个包含桌面图标的java桌面应用程序。该应用程序将是一个不可见的菜单/面板,直到你将光标悬停在屏幕顶部附近,此时满是桌面图标的菜单将下拉。若要将新图标添加到菜单一只需简单地将图标从桌面拖到菜单中,它们就会捕捉到网格。现在,我只是想让菜单在我将鼠标移到不可见的框架上时显示。可能是使用系统托盘,而不是执行某种消失/重新出现的框架。这是您关于此主题的第三篇帖子。保留您的问题在一篇帖子中,每个人都知道已经提出了什么建议,人们不会浪费时间重复已经提出的建议。事实上,偶尔“接受”并回答一次也不会有什么坏处,因为你已经得到了很多有效的建议来回答你的问题。@medopal:Java更像是一种“应用程序”语言,而不是一种语言“系统”语言,因此一些应该或至少可以更简单的东西,不是。虽然我提出的解决方案看起来有点笨拙,但它会起作用。有了它,我相信我已经给出了迄今为止最好的答案。我很遗憾,你显然无法理解它。你的第二种方法,必须是mouseExited(MouseEvent evt).可能只是剪贴错了。