创建自定义JFrame

时间:2012-12-27 12:45:34

标签: java swing opacity bufferedimage shapes

enter image description here

我知道如何创建一个半透明的窗口,但为了完整起见,我将其包括在内 现在这就是我想要做的......

创建一个具有60%不透明度的未修饰JFrame

软窗边缘。

参考上图,您可以看到边缘清晰且定义明确。我想让它们变得柔软

给它一个圆角矩形的形状。

我可以使用AWTUtilities.setWindowShape(Window,Shape)给出形状,但我想知道如何创建圆角矩形

创建“BufferedImage”的反射以用作背景

你为什么不使用Photoshop?你可能会问,但要想创建一个你想尝试用作背景的每个图像的反映是很繁琐的。相反,我想知道是否有一种编程方式:

  • 选择BufferedImage
  • 垂直翻转。换句话说,颠倒了。
  • 将其不透明度更改为所需的值
  • JFrame的尺寸设为原始缓冲图片的两倍
  • 帮助!!!


    import java.awt.*;
    import java.awt.geom.AffineTransform;
    import java.awt.image.BufferedImage;
    import javax.swing.*;
    public class ImageReflection extends JFrame{
        public ImageReflection(){
            ImageIcon baseIcon = new ImageIcon("src/images/mentalist-logo.png");
            ImageIcon reflectIcon = new ImageIcon("src/images/mentalist-logo.png");
            JLabel baseLabel = new JLabel(baseIcon);
            JLabel reflectLabel = new JLabel();
    
            Graphics2D g2D = (Graphics2D) reflectIcon.getImage().getGraphics();
            g2D.rotate(180);
            reflectLabel.setIcon(reflectIcon);
    
    
            this.add(reflectLabel);
            this.setVisible(true);
            this.pack();
    
        }
        public static void main(String[] args) {
            new ImageReflection();
        }
    }
    

    我在UnsupportedOperationException得到Graphics2D g2D = (Graphics2D) reflectIcon.getImage().getGraphics(); 这是我的代码,可以将图像颠倒过来。

    2 个答案:

    答案 0 :(得分:3)

      

    剩下的就是创造一个反思。

    您可以像这样更改图形上下文AffineTransform

    BufferedImage newImage = new BufferedImage(
        oldImage.getWidth(), oldImage.getHeight, BufferedImage.TYPE_INT_ARGB);
    Graphics2D g2d = newImage.createGraphics();
    g2d.translate(0, newImage.getHeight());
    g2d.scale(1, -1);
    g2d.drawImage(oldImage, 0, 0, null);
    g2d.dispose();
    

    答案 1 :(得分:2)

    可能你可以尝试这样的事情(如果不是全部可能会有所帮助),这就是我之前尝试过的事情:

    final JWindow initWindow = new JWindow();
    SwingWorker<Object, Object> task = new SwingWorker<Object, Object>()
                {
            public Object doInBackground() 
            {
                //show init window
                //....
                initWindow.getContentPane().add(text);
    
               ( (JComponent) initWindow.getContentPane ( ) ).setBorder(new CompoundBorder(new CustomRoundedBorder(), new LineBorder(new Color(...)));
    
               AWTUtilities.setWindowOpaque ( initWindow, false );
    
               initWindow.setAlwaysOnTop(true);
    
               initWindow.setVisible(true);
                 //....
                return null;
            }
            public void done() 
            {
            }
        };
        task.execute();