如何从JFrame添加图片,附加到边框

时间:2014-03-08 22:50:55

标签: java jframe

您好我想在我的JFrame边框添加一些图片。 是否可以将图片附加到JFrame的边框并将其创建为1个对象?

这样的事情:

enter image description here

1 个答案:

答案 0 :(得分:9)

我不确定是否可以将图像直接添加到JFrame的边框(建议欢迎)。我决定通过使用透明内容窗格解决此问题,并使用内部框架“显示”像外框一样。

代码非常简单,但是,如果您想要解释代码是如何工作的,请告诉我。

以下是您启动和运行所需的最低代码。

您需要在类路径的根目录中(即在您的PhoneWindow.java文件旁边的根程序包中)提供您自己的transparent-phone.png图像。

import javax.imageio.ImageIO;
import javax.swing.*;
import java.awt.*;

public class PhoneWindow {

    public static void main(String[] args) {
        new PhoneWindow();
    }

    public PhoneWindow() {
        EventQueue.invokeLater(new Runnable() {
            @Override
            public void run() {
                try {
                    final JFrame frame = new JFrame();
                    frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
                    // create the  inner frame
                    final JInternalFrame frame2 = new JInternalFrame("My Telephone");
                    frame2.setClosable(true);
                    frame2.setDefaultCloseOperation(WindowConstants.DO_NOTHING_ON_CLOSE);
                    // add elements to the outer frame
                    frame.setUndecorated(true);
                    frame.setBackground(new Color(0, 0, 0, 0));
                    JPanel pane = new TranslucentPane();
                    frame.setContentPane(pane);
                    frame.setLayout(new BorderLayout());
                    // add inner frame and phone picture
                    frame.add(frame2, BorderLayout.CENTER);
                    frame.add(new JLabel(new ImageIcon(ImageIO.read(getClass().getResource("/transparent-phone.png")))), BorderLayout.EAST);
                    frame.setLocationRelativeTo(null);
                    frame.setMinimumSize(new Dimension(400, 300));
                    frame.pack();
                    // show
                    frame2.setVisible(true);
                    frame.setVisible(true);
                } catch (Throwable ex) {
                    ex.printStackTrace();
                }

            }
        });
    }

    public class TranslucentPane extends JPanel {

        public TranslucentPane() {
            setOpaque(false);
        }

        @Override
        protected void paintComponent(Graphics g) {
            super.paintComponent(g);
            Graphics2D g2d = (Graphics2D) g.create();
            g2d.setComposite(AlphaComposite.SrcOver.derive(0f));
            g2d.setColor(getBackground());
            g2d.fillRect(0, 0, getWidth(), getHeight());
        }

    }

}

这是完整的Java类(包括关闭和可拖动的行为)

https://gist.github.com/nickgrealy/16901a6428cb79d4f179

这是最终产品的屏幕截图

N.B。手机内/外的透明部分。

The final result with transparency.

参考文献: