您好我想在我的JFrame边框添加一些图片。 是否可以将图片附加到JFrame的边框并将其创建为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。手机内/外的透明部分。
参考文献: