我使用Swing of Java创建了一个GUI。我现在必须将一个sample.jpeg图像设置为我放置组件的框架的背景。如何做到这一点?
答案 0 :(得分:21)
JPanel
中没有“背景图片”的概念,因此必须用自己的方式来实现这样的功能。
实现此目的的一种方法是覆盖paintComponent
方法,以便在每次刷新JPanel
时绘制背景图像。
例如,可以将JPanel
子类化,并添加一个字段来保存背景图像,并覆盖paintComponent
方法:
public class JPanelWithBackground extends JPanel {
private Image backgroundImage;
// Some code to initialize the background image.
// Here, we use the constructor to load the image. This
// can vary depending on the use case of the panel.
public JPanelWithBackground(String fileName) throws IOException {
backgroundImage = ImageIO.read(new File(fileName));
}
public void paintComponent(Graphics g) {
super.paintComponent(g);
// Draw the background image.
g.drawImage(backgroundImage, 0, 0, this);
}
}
(以上代码尚未经过测试。)
以下代码可用于将JPanelWithBackground
添加到JFrame
:
JFrame f = new JFrame();
f.getContentPane().add(new JPanelWithBackground("sample.jpeg"));
在此示例中,ImageIO.read(File)
方法用于读取外部JPEG文件。
答案 1 :(得分:5)
通过使用绘制图像的JPanel替换框架的内容窗格,可以轻松完成此操作:
try {
final Image backgroundImage = javax.imageio.ImageIO.read(new File(...));
setContentPane(new JPanel(new BorderLayout()) {
@Override public void paintComponent(Graphics g) {
g.drawImage(backgroundImage, 0, 0, null);
}
});
} catch (IOException e) {
throw new RuntimeException(e);
}
此示例还将面板的布局设置为BorderLayout以匹配默认的内容窗格布局。
(如果您在查看图片时遇到任何问题,可能需要在其他一些组件上调用setOpaque(false)
,以便您可以看到背景。)
答案 2 :(得分:3)
Background Panel条目根据您的要求显示了几种不同的方式。
答案 3 :(得分:2)
您可以创建组件的子类
http://www.jguru.com/faq/view.jsp?EID=9691
或者摆弄包装纸
http://www.java-tips.org/java-se-tips/javax.swing/wrap-a-swing-jcomponent-in-a-background-image.html
答案 4 :(得分:1)
这是另一种不使用其他面板的快速方法。
JFrame f = new JFrame("stackoverflow") {
private Image backgroundImage = ImageIO.read(new File("background.jpg"));
public void paint( Graphics g ) {
super.paint(g);
g.drawImage(backgroundImage, 0, 0, null);
}
};
答案 5 :(得分:1)
如果您使用netbeans,可以在框架中添加jlabel,并通过属性将其图标更改为图像并删除文本。然后通过导航器
将jlabel移动到Jframe的底部或任何内容窗格答案 6 :(得分:1)
也许最简单的方法是添加图像,缩放图像并将其设置为JFrame / JPanel(在我的情况下为JPanel),但是请记住只有在添加其他子项之后才将其“添加”到容器中组件。
public void fillPOcombo()
{
DynamicConnection con = new DynamicConnection();
con.mysqlconnection();
con.sqlquery("select PO_No from TBL_PO");
con.dataread();
while (con.datareader.Read())
{
cmbpono.Items.Add((int)con.datareader["PO_NO"]);
}
}
答案 7 :(得分:0)
import javax.swing.*;
import java.awt.*;
import java.awt.event.*;
class BackgroundImageJFrame extends JFrame
{
JButton b1;
JLabel l1;
public BackgroundImageJFrame()
{
setTitle("Background Color for JFrame");
setSize(400,400);
setLocationRelativeTo(null);
setDefaultCloseOperation(EXIT_ON_CLOSE);
setVisible(true);
/*
One way
-----------------*/
setLayout(new BorderLayout());
JLabel background=new JLabel(new ImageIcon("C:\\Users\\Computer\\Downloads\\colorful design.png"));
add(background);
background.setLayout(new FlowLayout());
l1=new JLabel("Here is a button");
b1=new JButton("I am a button");
background.add(l1);
background.add(b1);
// Another way
setLayout(new BorderLayout());
setContentPane(new JLabel(new ImageIcon("C:\\Users\\Computer\\Downloads \\colorful design.png")));
setLayout(new FlowLayout());
l1=new JLabel("Here is a button");
b1=new JButton("I am a button");
add(l1);
add(b1);
// Just for refresh :) Not optional!
setSize(399,399);
setSize(400,400);
}
public static void main(String args[])
{
new BackgroundImageJFrame();
}
}