从 C 驱动器加载 Java 代码中的图像
我是 Java 新手.我只是想在 JFrame
中加载图像作为背景.我想做的是从 C 驱动器(那不是我的工作区)获取图像,所以我在 Board.java
中做了什么:
i am new to Java . i was just trying to load image as background in JFrame
. What i wanted to do is get the image from C Drive(that is not my workspace) so what i did in Board.java
:
ImageIcon i = new ImageIcon("C:/image.png");
img =i.getImage();
并尝试将其画成这样:
public void paint(Graphics g )
{
super.paint(g);
Graphics2D g2d= (Graphics2D) g;
g2d.drawImage(img, 0, 100, null);
}
然后我像这样调用我的主类
And then i am calling in my main class like this
public static void main(String[] args)
{
JFrame frame= new JFrame(" Game") ;
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.setSize(1200, 365);
frame.setVisible(true);
frame.add(new Board());
}
但我没有显示任何图像,那么添加 Image
是否合法?
but i am not getting any image displayed , so is it legal way to add Image
?
推荐答案
- 不要在
JFrame
中覆盖 - 不要在
JFrame
上调用setSize()
而是在设置可见之前使用JFrame#pack()
- 养成使用 / 的习惯,无论平台是否支持.
- Do not override
paint()
inJFrame
- Do not call
setSize()
onJFrame
rather useJFrame#pack()
before setting it visible - Get into the habit of using / as regardless of platform this is supported.
- 创建
JPanel
/JLabel
实例 - 在
JPanel
/JLabel
中覆盖 - 覆盖
getPreferredSize()
以返回尺寸正确的尺寸/组件到Image
- 将
JPanel
/Jlabel
添加到JFrame
实例 - 通过
JFrame#pack()
打包 - 设置
JFrame
可见 - Create
JPanel
/JLabel
instance - Override
paintComponent(..)
inJPanel
/JLabel
- Override
getPreferredSize()
to return dimensions/component which is correctly sized toImage
- Add
JPanel
/Jlabel
toJFrame
instance - pack
JFrame
byJFrame#pack()
- set
JFrame
visible
paint()
这是我做的一个例子:
paintComponent(..)
JFrame
Test.java:
//necessary imports
import java.awt.Dimension;
import java.awt.Graphics;
import java.awt.Image;
import java.io.File;
import javax.imageio.ImageIO;
import javax.swing.ImageIcon;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.UIManager;
import javax.swing.UnsupportedLookAndFeelException;
public class Test {
static String filename = "c:/test.jpg";//your file path and name here use / as it will work on linux platforms too so get into the habbit
/**
* Default constructor
*/
public Test() throws Exception {
initComponents();
}
/**
* Initialize GUI and components (including ActionListeners etc)
*/
private void initComponents() throws Exception {
JFrame frame = new JFrame("Test");
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
final Image background = ImageIO.read(new File(filename));
final Dimension jpanelDimensions = new Dimension(new ImageIcon(background).getIconWidth(), new ImageIcon(background).getIconHeight());
frame.add(new JPanel() {
@Override
protected void paintComponent(Graphics grphcs) {
super.paintComponent(grphcs);
grphcs.drawImage(background, 0, 0, null);
}
//return a JPanel that matches images size
@Override
public Dimension getPreferredSize() {
return jpanelDimensions;
}
});
frame.setResizable(false);
//pack frame (size JFrame to match preferred sizes of added components and set visible
frame.pack();
frame.setVisible(true);
}
public static void main(String[] args) {
/**
* Create GUI and components on Event-Dispatch-Thread
*/
javax.swing.SwingUtilities.invokeLater(new Runnable() {
@Override
public void run() {
try {
//set nimbus look and feel
for (UIManager.LookAndFeelInfo info : UIManager.getInstalledLookAndFeels()) {
if ("Nimbus".equals(info.getName())) {
UIManager.setLookAndFeel(info.getClassName());
break;
}
}
} catch (ClassNotFoundException | InstantiationException | IllegalAccessException | UnsupportedLookAndFeelException e) {
e.printStackTrace();
}
try {
//create GUI instance
Test test = new Test();
} catch (Exception ex) {
ex.printStackTrace();
}
}
});
}
}
相关文章