[英]JFrame translucent/transparent for events but still visible
是否可以在Java JFrame
或其他组件中创建完全半透明的所有鼠标事件?
在我的应用程序中,我只有一个窗口,它是JFrame
实例。 在这个窗口中,我有许多其他JComponent
,其中一些有更多的JComponent
等。但重要的是,主窗口只有一个PopUpFrame
,它继承了JFrame
。 这个PopUpFrame
是不可见的,直到我将光标移动到具有缩略图的特定JComponent
上,当此JComponent
捕获mouseEntered(MouseEvent event)
事件时,它使这一个PopUpFrame
可见并加载到它的完整图像。 我发现PopUpFrame
正在用光标移动但问题是当光标超出缩略图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 Pane中执行此操作(有关如何使用这些内容的示例,请参阅Java教程)。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.