向JFrame添加图像时出现问题 [英] problem in adding image to JFrame

查看:117
本文介绍了向JFrame添加图像时出现问题的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我在向JFrame添加图片时遇到问题,缺少探测器或写入错误。
这里是类:

I'm having problems in adding a picture into JFrame, something is missing probebly or written wrong. here are the classes:

主类:

public class Tester

    {
        public static void main(String args[])
        {
            BorderLayoutFrame borderLayoutFrame = new BorderLayoutFrame();
            borderLayoutFrame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
            borderLayoutFrame.setSize(600,600);
            borderLayoutFrame.setVisible(true);
        }
    }

public class BorderLayoutFrame extends JFrame implements ActionListener 
 {
     private JButton buttons[]; // array of buttons to hide portions
     private final String names[] = { "North", "South", "East", "West", "Center" };
     private BorderLayout layout; // borderlayout object
     private PicPanel picture = new PicPanel();

     // set up GUI and event handling

     public BorderLayoutFrame()
     {
         super( "Philosofic Problem" );
         layout = new BorderLayout( 5, 5 ); // 5 pixel gaps
         setLayout( layout ); // set frame layout
         buttons = new JButton[ names.length ]; // set size of array

         // create JButtons and register listeners for them

         for ( int count = 0; count < names.length; count++ ) 
         {
             buttons[ count ] = new JButton( names[ count ] );
             buttons[ count ].addActionListener( this );
         }
         add( buttons[ 0 ], BorderLayout.NORTH ); // add button to north
         add( buttons[ 1 ], BorderLayout.SOUTH ); // add button to south
         add( buttons[ 2 ], BorderLayout.EAST ); // add button to east
         add( buttons[ 3 ], BorderLayout.WEST ); // add button to west
         add( picture, BorderLayout.CENTER ); // add button to center
    }

    // handle button events

    public void actionPerformed( ActionEvent event )
    {

    } 

  }

我试图将图像添加到

这里是图像类:

public class PicPanel extends JPanel
{
    Image img;
    private int width = 0;
    private int height = 0;

    public PicPanel()
    {
        super();
        img = Toolkit.getDefaultToolkit().getImage("table.jpg");
    }
    public void paintComponent(Graphics g)
    {
         super.paintComponents(g);
         if ((width <= 0) || (height <= 0))
         {
             width = img.getWidth(this);
             height = img.getHeight(this);
         }
         g.drawImage(img,0,0,width,height,this);
    }
}

请你帮忙,有什么问题?
谢谢

Please your help, what is the problem? thanks

BTW:我正在使用eclipse,该图像假定为哪个目录?

BTW: i'm using eclipse, which directory the image suppose to be in?

推荐答案

您发布的代码有几个问题:

There's several issues with the code you've posted:


  • 您应该使用 getContentPane()。add()而不是简单的 add()在你的 BorderLayoutFrame class。

  • 您应该真正使用 SwingUtilities.invokeLater()从测试员类启动JFrame。这样的:

  • You should use getContentPane().add() instead of simply add() in your BorderLayoutFrame class.
  • You should really use SwingUtilities.invokeLater() to launch your JFrame from the tester class. Something like this:
 SwingUtilities.invokeLater(new Runnable() {
    @Override
    public void run() {
        System.setProperty("DEBUG_UI", "true");

        BorderLayoutFrame blf = new BorderLayoutFrame();
        blf.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        blf.setSize(600,600);
        blf.setVisible(true);
    }
});




  • 不要使用Toolkit加载图片!在下面的代码中,如果Table.jpg与PicPanel在同一个包中,图像将正确加载。

  • public PicPanel() {
        super();
        try {
            rUrl = getClass().getResource("Table.jpg");
            if (rUrl != null) {
                img = ImageIO.read(rUrl);
            }
        } catch (IOException ex) {
            Logger.getLogger(PicPanel.class.getName()).log(Level.SEVERE, null, ex);
        }
    }
    




    • PicPanel.PaintComponent()你调用 super.paintComponents()是's'a typeo?

    • PicPanel.PaintComponent()中,您不要需要所有宽度/高度的东西,只需执行以下操作:

      • In PicPanel.PaintComponent() you call super.paintComponents() is the 's' a typeo?
      • In PicPanel.PaintComponent(), you don't need all the width/height stuff, just do this:

        g.drawImage(img,0,0,getWidth(),getHeight(),this); / p>


      • g.drawImage(img, 0, 0, getWidth(), getHeight(), this);

        避免将super.paintComponent调用在一起,因为您正在绘制图像,为什么要面板要完全绘制?

        And avoid the call to super.paintComponent all together because you're painting an image, why do you want the panel to paint at all?

        我的最终实现你的东西:

        My final implementation of your stuff:

        public class Main {
        
            /**
             * @param args the command line arguments
             */
            public static void main(String[] args) {
                SwingUtilities.invokeLater(new Runnable() {
                    @Override
                    public void run() {
                        System.setProperty("DEBUG_UI", "true");
        
                        BorderLayoutFrame blf = new BorderLayoutFrame();
                        blf.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
                        blf.setSize(600,600);
                        blf.setVisible(true);
                    }
                });
            }
        
        }
        
        class BorderLayoutFrame extends JFrame implements ActionListener
        {
            private final BorderLayout layout;
            private final JButton[] buttons;
            private final String names[] = {"North", "South", "East", "West", "Center"};
        
            public BorderLayoutFrame() {
                super( "Philosofic Problem" );
                layout = new BorderLayout( 5, 5 );
                getContentPane().setLayout( layout );
                buttons = new JButton[ names.length ];
        
                for (int i=0; i<names.length; i++)
                {
                    buttons[i] = new JButton(names[i]);
                    buttons[i].addActionListener(this);
                }
        
                getContentPane().add(buttons[0], BorderLayout.NORTH);
                getContentPane().add(buttons[1], BorderLayout.SOUTH);
                getContentPane().add(buttons[2], BorderLayout.EAST);
                getContentPane().add(buttons[3], BorderLayout.WEST);
                getContentPane().add(new PicPanel(), BorderLayout.CENTER);
            }
        
            public void actionPerformed(ActionEvent e) {
                // ignore
            }
        
        }
        
        class PicPanel extends JPanel
        {
            private URL rUrl;
            private BufferedImage img;
        
        
        
            public PicPanel() {
                super();
                try {
                    rUrl = getClass().getResource("UtilBtn.png");
                    if (rUrl != null) {
                        img = ImageIO.read(rUrl);
                    }
                } catch (IOException ex) {
                    Logger.getLogger(PicPanel.class.getName()).log(Level.SEVERE, null, ex);
                }
            }
        
            @Override
            protected void paintComponent(Graphics g) {
                //super.paintComponent(g);
        
                g.drawImage(img, 0, 0, getWidth(), getHeight(), this);
            }
        
        }
        

        这篇关于向JFrame添加图像时出现问题的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆