2010-08-04 35 views
1

我认为我有点白痴,因为我在一段时间内没有完成Swing编程,但我正在尝试绘制一个简单的图像来屏幕显示,我没有得到我期望的结果无法在OSX上的Swing中显示图像

public class ImageApp { 

    public static void main(String[] args) throws MalformedURLException, IOException { 
     final Image image = ImageIO.read(new File("/Library/WebServer/Documents/image.gif")); 

     final JPanel component = new JPanel(){ 

      public void paint(final Graphics g) { 
       System.out.println("Drawing image "+image.getWidth(null)+" "+image.getHeight(null)); 
       g.drawString("hello", 0,0); 
       g.drawImage(image,this.getWidth()/2,this.getHeight()/2, 100, 100, Color.blue,this); 
       super.paint(g); 
      } 
     }; 

     final JFrame frame = new JFrame(); 

     frame.add(component); 
     frame.setSize(100, 100); 

     frame.pack(); 
     frame.setVisible(true); 
    } 

} 

这呈现一个空白窗口,似乎没有大小为100,100。是否还需要执行其他一些步骤才能使图形出现在屏幕上,或者需要遵循的尺寸?

我使用JDK6上OSX 10.6

+0

它已经我已经好久没做了秋千,而只是扫视,你设置帧大小不同的代码,而不是元件尺寸;您将框架设置为可见但不是组件。这些很重要吗? – sarnold 2010-08-04 09:05:53

+0

我尝试添加大小和setVisible(true),似乎没有任何区别? – Ceilingfish 2010-08-04 09:10:00

+0

用户是否具有读取图像位置的权限? – Goibniu 2010-08-04 09:15:44

回答

2

在Swing中,你应该重写paintComponent(),不paint()

附录:例如,见下文。在评论中,@eugener提出了一个关于使用JLabel作为替代image container的优秀观点。

import java.awt.Dimension; 
import java.awt.EventQueue; 
import java.awt.Graphics; 
import java.awt.Image; 
import java.io.File; 
import java.io.IOException; 
import javax.imageio.ImageIO; 
import javax.swing.JFrame; 
import javax.swing.JPanel; 

public class ImageApp { 

    public static void main(String[] args) throws IOException { 
     final Image image = ImageIO.read(new File("image.jpg")); 
     EventQueue.invokeLater(new Runnable() { 

      @Override 
      public void run() { 
       final JPanel component = new JPanel() { 

        @Override 
        public void paintComponent(final Graphics g) { 
         g.drawImage(image, 0, 0, null); 
        } 

        @Override 
        public Dimension getPreferredSize() { 
         return new Dimension(
          image.getWidth(this), image.getHeight(this)); 
        } 
       }; 

       final JFrame frame = new JFrame(); 
       frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
       frame.add(component); 
       frame.pack(); 
       frame.setVisible(true); 
      } 
     }); 
    } 
} 
+0

这似乎没有改变行为? – Ceilingfish 2010-08-04 09:10:45

+0

@Ceilingfish:我修改了你的例子; @ rekin的例子也很有用。顺便说一句,始终建立在EDT上:http://download-llnw.oracle.com/javase/tutorial/uiswing/concurrency/initial.html – trashgod 2010-08-04 09:26:14

+0

感谢trashgod。这里的关键部分似乎不是在渲染图像之后调用'super.paintComponent',或者它覆盖默认的“无所事事”行为! – Ceilingfish 2010-08-04 09:31:49

2

试试这个:

public class ImageApp { 

    public static void main(String[] args) throws MalformedURLException, IOException { 
     final Image image = ImageIO.read(new File("/Library/WebServer/Documents/image.gif")); 

     final JPanel component = new JPanel() { 

      @Override 
      public void paintComponent(final Graphics g) { 
       super.paintComponent(g); 
       System.out.println("Drawing image " + image.getWidth(null) + " " + image.getHeight(null)); 
       g.drawString("hello", 0,10); 
       g.drawImage(image, this.getWidth()/2, this.getHeight()/2, 100, 100, Color.blue, this); 
      } 
     }; 

     final JFrame frame = new JFrame(); 

     frame.add(component); 
     frame.setSize(100, 100); 

     frame.setVisible(true); 
    } 
} 
+0

很好的例子,虽然看到我对@Ceilingfish的评论。为了比较我的例子不会调用'super.paintComponent(g)',因为它填满了面板。 – trashgod 2010-08-04 09:29:39