JFrame the same shape as an Image / Program running in background

前端 未结 3 867
悲&欢浪女
悲&欢浪女 2020-12-06 15:12

My question is simple, the solution surely not. I am looking for a way to shape a JFrame the same as an Image it will be displaying. By shape I mean the shape of the pixels

相关标签:
3条回答
  • 2020-12-06 15:22

    I could not understand your first question. My English is not so good and this could be the reason.

    About the second question, have you tried something about TrayIcon? Please, take e look: http://docs.oracle.com/javase/tutorial/uiswing/misc/systemtray.html and http://docs.oracle.com/javase/6/docs/api/java/awt/TrayIcon.html

    0 讨论(0)
  • 2020-12-06 15:27

    I personally would ditch the window shape in favor of a transparent window, it's just simpler for what you are trying to do...

    enter image description here

    And with the close button (look to the bottom left)

    enter image description here

    The red border around the image is deliberate, as it shows the "window" bounds.

    This relies on either Java 1.7 or Java 1.6_10+, there are checks in the code.

    public class TransparentFrame {
    
        public static void main(String[] args) {
            new TransparentFrame();
        }
    
        public TransparentFrame() {
            EventQueue.invokeLater(new Runnable() {
                @Override
                public void run() {
                    try {
                        UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName());
                    } catch (Exception ex) {
                    }
    
                    JFrame frame = new JFrame("Testing");
                    frame.setUndecorated(true);
                    frame.setContentPane(new ContentPane());
    
                    String version = System.getProperty("java.version");
                    System.out.println(version);
                    if (version.startsWith("1.7")) {
                        frame.setBackground(new Color(0, 0, 0, 0));
                    } else if (version.startsWith("1.6")) {
                        if (supportsPerAlphaPixel()) {
                            setOpaque(frame, false);
                        } else {
                            System.out.println("Per Pixel Alphering is not support with Java " + version);
                            System.exit(1);
                        }
                    } else {
                        System.out.println("Per Pixel Alphering is not support with Java " + version);
                        System.exit(1);
                    }
                    frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
                    frame.setLayout(new BorderLayout());
                    frame.add(new ImagePane());
                    frame.pack();
                    frame.setLocationRelativeTo(null);
                    frame.setVisible(true);
                }
            });
        }
    
        public static boolean supportsPerAlphaPixel() {
    
            boolean support = false;
    
            try {
    
                Class<?> awtUtilsClass = Class.forName("com.sun.awt.AWTUtilities");
                support = true;
    
            } catch (Exception exp) {
            }
    
            return support;
    
        }
    
        public static void setOpaque(Window window, boolean opaque) {
    
            try {
    
                Class<?> awtUtilsClass = Class.forName("com.sun.awt.AWTUtilities");
                if (awtUtilsClass != null) {
    
                    Method method = awtUtilsClass.getMethod("setWindowOpaque", Window.class, boolean.class);
                    method.invoke(null, window, opaque);
    
                }
    
            } catch (Exception exp) {
            }
    
        }
    
        public class ContentPane extends JPanel {
    
            public ContentPane() {
                setOpaque(false);
            }
    
            @Override
            protected void paintComponent(Graphics g) {
                super.paintComponent(g);
                g.setColor(Color.RED);
                g.drawRect(0, 0, getWidth() - 1, getHeight() - 1);
            }
        }
    
        public class ImagePane extends JPanel {
    
            private BufferedImage background;
            private BufferedImage offImage;
            private Ellipse2D offButton;
            private boolean mouseIn;
    
            public ImagePane() {
                setOpaque(false);
                try {
                    background = ImageIO.read(new File("tamagotchi400.png"));
                    offImage = ImageIO.read(new File("powerSmall.png"));
                } catch (IOException ex) {
                    ex.printStackTrace();
                }
                offButton = new Ellipse2D.Float(212, 330, 25, 25);
                MouseAdapter handler = new MouseAdapter() {
                    @Override
                    public void mouseClicked(MouseEvent e) {
                        if (e.getClickCount() == 1 && e.getButton() == MouseEvent.BUTTON1) {
                            if (offButton.contains(e.getPoint())) {
                                Window window = SwingUtilities.getWindowAncestor(ImagePane.this);
                                if (window != null) {
                                    window.dispose();
                                }
                            }
                        }
                    }
    
                    @Override
                    public void mouseMoved(MouseEvent e) {
                        Cursor cursor = Cursor.getDefaultCursor();
                        if (offButton.contains(e.getPoint())) {
                            cursor = Cursor.getPredefinedCursor(Cursor.HAND_CURSOR);
                        }
                        setCursor(cursor);
                    }
    
                    @Override
                    public void mouseEntered(MouseEvent e) {
                        mouseIn = true;
                        repaint();
                    }
    
                    @Override
                    public void mouseExited(MouseEvent e) {
                        mouseIn = false;
                        repaint();
                    }
                };
                addMouseListener(handler);
                addMouseMotionListener(handler);
            }
    
            @Override
            public Dimension getPreferredSize() {
                return background == null ? new Dimension(400, 400) : new Dimension(background.getWidth(), background.getHeight());
            }
    
            @Override
            protected void paintComponent(Graphics g) {
                super.paintComponent(g);
                if (background != null) {
                    Graphics2D g2d = (Graphics2D) g.create();
                    int x = (getWidth() - background.getWidth()) / 2;
                    int y = (getHeight() - background.getHeight()) / 2;
                    g2d.drawImage(background, x, y, this);
                    if (mouseIn && offImage != null) {
                        g2d.drawImage(offImage, (int) offButton.getX(), (int) offButton.getY(), this);
                    }
                    g2d.dispose();
                }
            }
        }
    }
    
    0 讨论(0)
  • 2020-12-06 15:40

    Simply Add New Label Image In JFrame then Set Jframe Background Transparents

    frame.setBackground(new Color(0, 0, 0, 0));
    
    0 讨论(0)
提交回复
热议问题