gpt4 book ai didi

java - JFrame对事件是半透明/透明的,但仍然可见

转载 作者:行者123 更新时间:2023-12-02 04:47:31 25 4
gpt4 key购买 nike

是否可以用Java JFrame或其他组件为所有鼠标事件创建完全透明的组件?

在我的应用程序中,我只有一个窗口,它是JFrame的实例。在此窗口中,我还有许多其他JComponent,其中有些具有更多的JComponent等。但是重要的是,主窗口只有一个PopUpFrame,它是继承JFrame。直到我将光标移到带有缩略图的特定PopUpFrame上之前,此JComponent才可见,当此JComponent捕获mouseEntered(MouseEvent event)事件时,它将使该PopUpFrame可见并将其加载到完整图像中。我使PopUpFrame随光标移动,但问题是当光标移到缩略图PopUpFrame之外。例如,当带有完整图像的PopUpFrame在光标的右下侧并且我将鼠标左移和/或上移时,一切正常。当我向右和/或向下移动鼠标时,光标移到PopUpFrame上,因此PopUpFrame被“冻结”。当然,我可以在此PopUpFrame中添加一个额外的事件,即使将光标放在它上面,它也将随光标一起移动,但这不是解决方案。 PopUpFrame仅在光标位于缩略图上时才可见。如果PopUpFrame可以捕获事件并涵盖缩略图,则我无法正确捕获缩略图中的mouseExited(MouseEvent event)

因此,有什么方法可以使JFrame对鼠标事件完全透明,但仍使其在屏幕上可见(也许类似于JavaFX中的setMouseTransparent)。并且,如果不可能,如何创建具有完整图像(仅图像)的工作弹出窗口,该图像仅在光标位于缩略图上并且随光标移动时才可见。

这是我的代码。

import java.awt.Color;
import java.awt.Point;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;
import java.awt.event.MouseMotionAdapter;
import javax.swing.ImageIcon;
import javax.swing.JComponent;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;

public class MainExample {

private static MainWindow window;

public static void main(String args[]) {
window=new MainWindow();
}
}

class MainWindow extends JFrame {

private static PopUpFrame popup=new PopUpFrame();
private static ThumbnailPanel mini=new ThumbnailPanel("panel");

public MainWindow() {
setVisible(true);
setSize(600, 400);
setLayout(null);

add(mini);
mini.setLocation(50, 75);
}

public static void previewPopUpShow(Point cursor) {
popup.refresh(cursor.x, cursor.y);
}

public static void previewPopUpHide() {
popup.setVisible(false);
}

public static void previewPopUpLoad(String url) {
popup.setImage(url);
}
}

class ThumbnailPanel extends JComponent {

private JPanel thumbnail=new JPanel();

public ThumbnailPanel(String name) {
setVisible(true);
setOpaque(false);
setSize(80, 45);
setBorder(null);
setLayout(null);

add(thumbnail);

thumbnail.setBackground(Color.RED);
thumbnail.setBorder(null);
thumbnail.setBounds(0, 0, 70, 40);
thumbnail.addMouseListener(new MouseAdapter() {
public void mouseEntered(MouseEvent entered) {
MainWindow.previewPopUpLoad("");
}

public void mouseExited(MouseEvent exited) {
MainWindow.previewPopUpHide();
}
});
thumbnail.addMouseMotionListener(new MouseMotionAdapter() {
public void mouseMoved(MouseEvent moved) {
MainWindow.previewPopUpShow(moved.getLocationOnScreen());
}
});
}
}

class PopUpFrame extends JFrame {

private ImageIcon full;
private JLabel fullLabel;

public PopUpFrame() {
setSize(440, 260);
setResizable(false);
setUndecorated(true);
setVisible(false);
setFocusable(false);
setAlwaysOnTop(true);

addMouseMotionListener(new MouseMotionAdapter() {
public void mouseMoved(MouseEvent moved) {
MainWindow.previewPopUpShow(moved.getLocationOnScreen());
}
});
}

void refresh(int x, int y) {
setLocation(x, y);
}

void setImage(String url) {
full=new ImageIcon("full_image.png");
fullLabel=new JLabel();
fullLabel.setOpaque(true);
fullLabel.setBackground(Color.WHITE);
this.getContentPane().add(fullLabel);
this.setVisible(true);
}
}

最佳答案

如果要拦截(并丢弃)所有鼠标事件到JFrame,请尝试在Glass窗格中执行此操作(有关如何使用这些事件的示例,请参阅Java教程)。

关于java - JFrame对事件是半透明/透明的,但仍然可见,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31641861/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com