JFrame半透明/透明的事件,但仍然可见

时间:2015-07-26 20:55:52

标签: java swing jframe translucency

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

在我的应用程序中,我只有一个窗口是JFrame的实例。在这个窗口中,我有许多其他JComponent,其中有一些JComponent等等。但重要的是,主窗口只有一个PopUpFrame是继承{{1 }}。在我将光标移动到具有缩略图的特定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);
    }
}

1 个答案:

答案 0 :(得分:0)

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