簡體   English   中英

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

[英]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是光標的右下方,我向左移動鼠標和/或向上移動所有工作正常。 當我向右和/或向下移動鼠標時,光標在PopUpFramePopUpFrame因此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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM