我一直在努力让图像显示一段时间。我已经阅读了一些不同的东西,所有这些东西似乎都有不同的显示图像的方式。有人能告诉我我做错了什么吗?我正在尝试制作一个使用2个类的程序来使图片显示在一个框架中。我想我不明白的仍然是Graphics对象是什么,Graphics2D对象是什么以及它的不同之处,以及我为了使图像显示而调用哪个类的方法。这是我的代码:
公共课笑脸{private BufferedImage smileyFace;
private Graphics2D renderWindow;
private Dimension smileyPosition;
private File smileyFile;
public Smiley() {
try{
smileyFile = new File("C:\\Users\\MyName\\Desktop\\smiley.png");
smileyFace = ImageIO.read(smileyFile);
}
catch (Exception e){
System.out.println("There was an error finding or reading the file \" smiley.png.\"");
}
MainScreen.graphicPane.drawImage(smileyFace,50,50, null);
}
和第二节课:
公共类MainScreen扩展了JFrame {
public static MainScreen ms;
public static Graphics2D graphicPane;
public static void main (String[] args){
MainScreen ms = new MainScreen();
Smiley newSmiley = new Smiley();
}
public MainScreen(){
super("Main Screen Window");
this.setDefaultCloseOperation(EXIT_ON_CLOSE);
this.setVisible(true);
this.setSize(500,800);
this.getContentPane().setBackground(Color.black);
graphicPane = (Graphics2D) this.getContentPane().getGraphics();
}
}
程序编译时没有任何错误,并且没有向我报告没有找到文件。
答案 0 :(得分:3)
你需要一些paint
方法的疼痛。为此,您将需要一个Component来绘制。你需要学习一个GUI框架,比如Swing。有一些明显的组件可以像JPanel
一样绘制。使用该面板,您需要覆盖其paintComponent
方法。
Graphcics
对象是组件用于实际将图形绘制到组件上的对象。
Graphics2D
对象只是扩展了Graphics对象的功能。
您应该查看Swing tuorial和**Graphics toturial
要让你的程序运行,你会做这样的事情
public class DrawPanel extends JPanel {
BufferedImage smileyFace;
public DrawPanel() {
try{
smileyFile = new File("C:\\Users\\MyName\\Desktop\\smiley.png");
smileyFace = ImageIO.read(smileyFile);
}
catch (Exception e){
System.out.println("There was an error finding or reading the file \" smiley.png.\"");
}
}
@Override
protected void paintComponent(Graphics g){
super.paintComponent(g);
g.drawImage(smileyFace,50,50, this);
}
@Override
public Dimension getPreferredSize(){
return new Dimension(500, 500);
}
}
然后,您可以在另一个类中实例化该面板,将其添加到JFrame中以运行它
public class Main {
public static void main(String[] args) {
SwingUtiliites.invokeLater(new Runnable(){
public void run() {
JFrame frame = new JFrame();
frame.add(new DrawPanel());
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.pack();
frame.setVisible(true);
}
});
}
}
答案 1 :(得分:2)
你在你的Smiley课程的构造函数中调用它。
MainScreen.graphicPane.drawImage(smileyFace,50,50, null);
如果您要自己绘制图像,则需要覆盖添加到主屏幕的组件中的paintComponent()
。
或者只是将图片添加到您添加到主屏幕的JLabel
。
答案 2 :(得分:2)
您以错误的方式绘制图像。
要使用drawImage()
,您需要在paintComponent()
的{{1}}方法(例如JComponent
)中使用该方法,请检查下一个代码:
JPanel
或者您可以将图片添加到import java.awt.Dimension;
import java.awt.Graphics;
import java.awt.image.BufferedImage;
import java.beans.Transient;
import java.io.File;
import javax.imageio.ImageIO;
import javax.swing.JFrame;
import javax.swing.JPanel;
public class Example extends JFrame {
public Example() {
JFrame frame = new JFrame();
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.add(new Smiley());
frame.pack();
frame.setVisible(true);
}
public static void main(String args[]) {
new Example();
}
class Smiley extends JPanel{
private BufferedImage smileyFace;
Smiley(){
try {
File smileyFile = new File("C:\\Users\\MyName\\Desktop\\smiley.png");
smileyFace = ImageIO.read(smileyFile);
} catch (Exception e) {
System.out
.println("There was an error finding or reading the file \" smiley.png.\"");
}
}
@Override
@Transient
public Dimension getPreferredSize() {
return new Dimension(smileyFace.getWidth(),smileyFace.getHeight());
}
@Override
protected void paintComponent(Graphics g) {
super.paintComponent(g);
g.drawImage(smileyFace, 0,0, this);
}
}
}
并为您完成所有操作,更改JLabel
类,如下所示:
Smile
还详细了解customPaintings。