【发布时间】:2013-11-20 21:51:02
【问题描述】:
我是 Java Swing 开发的新手,遇到以下问题。
我必须创建一个具有背景图像的 JFrame 窗口。
所以我执行了以下操作:
1) 我创建了一个名为 JPanelWithBackground 的类,它扩展了 JPanel:
package com.test.login;
import java.awt.Graphics;
import java.awt.Image;
import java.io.File;
import java.io.IOException;
import javax.imageio.ImageIO;
import javax.swing.JPanel;
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);
g.drawImage(backgroundImage, 0, 0, 550, 230, this);
}
}
如您所见,此类读取图像文件并将其引用放入名为 backgroundImage 的 Image 对象中,然后将其绘制在 Graphics 对象上。
2) 然后我创建了一个名为 LoginFrame2 的类:
package com.test.login;
import javax.swing.JButton;
import java.awt.Container;
import java.awt.Dimension;
import java.io.IOException;
import javax.swing.ImageIcon;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.JPopupMenu.Separator;
import javax.swing.JTabbedPane;
import javax.swing.JTextField;
import net.miginfocom.swt.MigLayout;
import org.jdesktop.application.SingleFrameApplication;
public class LoginFrame2 extends SingleFrameApplication {
private static final int FIXED_WIDTH = 550;
private static final Dimension INITAL_SIZE = new Dimension(FIXED_WIDTH, 230);
public static void main(String[] args) {
System.out.println("DENTRO: LoginFrame() ---> main()");
launch(LoginFrame2.class, args);
}
@Override
protected void startup() {
// TODO Auto-generated method stub
System.out.println("Inside startup()");
JFrame mainFrame = this.getMainFrame(); // main JFrame that represents the Windows
mainFrame.setTitle("Chilli Login");
mainFrame.setPreferredSize(INITAL_SIZE);
mainFrame.setResizable(false);
Container mainContainer = mainFrame.getContentPane(); // main Container into the main JFrame
// JPanel creation and settings of the MigLayout on it:
// JPanel externalPanel = new JPanel();
JPanelWithBackground externalPanel = null;
try {
externalPanel = new JPanelWithBackground("/home/andrea/Immagini/logo2.jpg");
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
externalPanel.setLayout(new net.miginfocom.swing.MigLayout("fill"));
externalPanel.add(new JLabel("Username"), "w 50%, wrap");
JTextField userNameTextField = new JTextField(20);
externalPanel.add(userNameTextField, "w 90%, wrap");
externalPanel.add(new JLabel("Password"), "w 50%, wrap");
JTextField pswdTextField = new JTextField(20);
externalPanel.add(pswdTextField, "w 90%, wrap");
JButton loginButton = new JButton("Login");
externalPanel.add(loginButton, "w 25%, wrap");
mainContainer.add(externalPanel);
//mainFrame.add(mainContainer);
show(mainFrame);
}
}
这个类扩展了 JDesktop Swin 框架的 SingleFrameApplication 抽象类,它为我提供了一个 JFrame 实例。
这个类简单地创建 JPanelWithBackground 对象:
externalPanel = new JPanelWithBackground("/home/andrea/Immagini/logo2.jpg");
并在这个对象中放入一些 Swing 组件。
这是我的结果:
我的疑问/问题是:如您所见,显示字符串 Password 的 JLabel 位于图像的红色部分(我的辣椒徽标)等不是很可读。
我可以做些什么来使它更具可读性?例如,我可以通过某种方式将 JLabel 的背景设置为白色吗?
Tnx
安德烈亚
【问题讨论】:
-
不,可能是其他字体或图像。
-
For example can I set in some way that the background of my JLabel have to be white?- 这很容易做到,但您似乎不太感谢您在所有其他问题中获得的帮助,所以我会传递这个。
标签: java swing jframe jpanel jlabel