Java swing,无法使映像正常工作
我写了一个简单的程序只是为了画一个图像,我根本无法让它工作。它应该只在一个框架内的一个窗格中显示一张图片。p、 有很多我不需要的进口产品,我尝试了很多不同的东西Java swing,无法使映像正常工作,java,image,swing,Java,Image,Swing,我写了一个简单的程序只是为了画一个图像,我根本无法让它工作。它应该只在一个框架内的一个窗格中显示一张图片。p、 有很多我不需要的进口产品,我尝试了很多不同的东西 import java.awt.Color; import java.awt.FlowLayout; import java.awt.Graphics; import java.awt.Panel; import java.awt.image.BufferedImage; import java.io.File; import java
import java.awt.Color;
import java.awt.FlowLayout;
import java.awt.Graphics;
import java.awt.Panel;
import java.awt.image.BufferedImage;
import java.io.File;
import java.io.IOException;
import java.util.ArrayList;
import javax.swing.*;
import javax.imageio.ImageIO;
public class ShowImage {
private Graphics g;
private BufferedImage lionImage=null;
private JFrame frame;
private JPanel totalGUI,values;
public static void main(String[] args) {
SwingUtilities.invokeLater(new Runnable() {
public void run() {
createAndShowGUI();
}
});
}
public JPanel createContentPane(){
totalGUI = new JPanel();
totalGUI.setLayout(null);
values = new JPanel();
values.setLayout(null);
values.setLocation(10, 10);
values.setSize(490, 290);
values.setBackground(Color.WHITE);
totalGUI.add(values);
getImage();
Graphics g = values.getGraphics();
g.drawImage(lionImage,100,100,null);
totalGUI.setOpaque(true);
return totalGUI;
}
private static void createAndShowGUI() {
JFrame.setDefaultLookAndFeelDecorated(true);
JFrame frame = new JFrame("Calculator");
ShowImage demo = new ShowImage();
frame.setContentPane(demo.createContentPane());
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.setSize(500, 300);
frame.setVisible(true);
}
void getImage(){
try{
lionImage =ImageIO.read(new File("imgres.jpg"));// *see note
}catch (IOException e){}
}
}
我得到了错误。我不知道问题出在哪里
Exception in thread "AWT-EventQueue-0" java.lang.NullPointerException
at ShowImage.createContentPane(ShowImage.java:43)
at ShowImage.createAndShowGUI(ShowImage.java:55)
at ShowImage.access$0(ShowImage.java:50)
at ShowImage$1.run(ShowImage.java:23)
at java.awt.event.InvocationEvent.dispatch(Unknown Source)
at java.awt.EventQueue.dispatchEventImpl(Unknown Source)
at java.awt.EventQueue.access$000(Unknown Source)
at java.awt.EventQueue$3.run(Unknown Source)
at java.awt.EventQueue$3.run(Unknown Source)
at java.security.AccessController.doPrivileged(Native Method)
at java.security.ProtectionDomain$1.doIntersectionPrivilege(Unknown Source)
at java.awt.EventQueue.dispatchEvent(Unknown Source)
at java.awt.EventDispatchThread.pumpOneEventForFilters(Unknown Source)
at java.awt.EventDispatchThread.pumpEventsForFilter(Unknown Source)
at java.awt.EventDispatchThread.pumpEventsForHierarchy(Unknown Source)
at java.awt.EventDispatchThread.pumpEvents(Unknown Source)
at java.awt.EventDispatchThread.pumpEvents(Unknown Source)
at java.awt.EventDispatchThread.run(Unknown Source)
这是因为您的
g
为null
。当屏幕上尚未显示JPanel的路径时,就会发生这种情况
为了在JPanel
中绘制图像,您通常会创建一个新类扩展JPanel
并覆盖其paintComponent(Graphics g)
方法。请参见示例,您需要调用drawImage()
方法
我建议您永远不要捕获异常,也不要以任何方式处理它。您可以在尝试加载图像的
getImage()
方法中执行此操作。我正在使用讲师建议的方法。如何修复路径?它是g或lionImage null。@user1817988获取新的讲师。永远不要直接使用getGraphics方法。而是创建自定义组件,替代其paintComponent方法并在其中渲染图像。或者,使用ImageIcon并将其应用于JLabelWhere存储图像?如果它在罐子里,请看。另请参阅,以了解如何将图像绘制到JPanel.BTW,catch块中的ex.printStackTrace()
在哪里?始终使用itAJLabel
(使用ImageIcon
显示图像)可以完成JComponent
似乎正在做的所有事情<代码>g.drawImage(lionImage,0,0,null)它也倾向于使用图像观察者绘制图像,如this
例如g.drawImage(lionImage,0,0,this)代码>。
public static void main (String [] args) throws Exception
{
final BufferedImage lionImage = ImageIO.read (new File ("imgres.jpg"));
JComponent image = new JComponent ()
{
@Override
protected void paintComponent (Graphics g)
{
super.paintComponent (g);
g.drawImage (lionImage, 0, 0, null);
}
@Override
@Transient
public Dimension getPreferredSize ()
{
return new Dimension (lionImage.getWidth (), lionImage.getHeight ());
}
};
image.setOpaque (true);
JFrame frame = new JFrame ("Image");
frame.setDefaultCloseOperation (JFrame.EXIT_ON_CLOSE);
frame.getContentPane ().setLayout (new BorderLayout ());
frame.getContentPane ().add (image, BorderLayout.CENTER);
frame.pack ();
frame.setVisible (true);
}