代码之家  ›  专栏  ›  技术社区  ›  Ceilingfish

无法在OSX上的Swing中显示图像

  •  1
  • Ceilingfish  · 技术社区  · 15 年前

    我觉得我有点傻了,因为我已经有一段时间没有做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);
        }
    
    }
    

    这将呈现一个空白窗口,其大小似乎不到100100。是否有一些其他的步骤,我需要执行的图形显示在屏幕上,或大小得到尊重?

    我在osx10.6上使用JDK6

    2 回复  |  直到 15 年前
        1
  •  2
  •   Community Mohan Dere    8 年前

    在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);
                }
            });
        }
    }
    
        2
  •  2
  •   Rekin    15 年前

    试试这个:

    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);
        }
    }