java – JFrame与在后台运行的Image / Program形状相同
发布时间:2020-12-15 04:59:20 所属栏目:Java 来源:网络整理
导读:我的问题很简单,解决方案肯定不是.我正在寻找一种方法来塑造一个JFrame,就像它将要显示的图像一样.通过形状我的意思是具有alpha!= 0的像素的形状.我已经使用GeneralPath对象找到了一个工作示例,但它为约500 * 400的图像创建了~110000个“节点”,因此启动JFr
我的问题很简单,解决方案肯定不是.我正在寻找一种方法来塑造一个JFrame,就像它将要显示的图像一样.通过形状我的意思是具有alpha!= 0的像素的形状.我已经使用GeneralPath对象找到了一个工作示例,但它为约500 * 400的图像创建了~110000个“节点”,因此启动JFrame耗时超过2分钟,这绝对不是理想的效果,启动应该在2秒以内.
谢谢你的时间. 解决方法
我个人会抛弃窗户的形状,而不是透明的窗户,这对你想做的事情来说更简单……
并使用关闭按钮(查看左下角) 图像周围的红色边框是故意的,因为它显示了“窗口”边界. 这依赖于Java 1.7或Java 1.6_10,代码中有检查. 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)); } 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,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(); } } } } (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |