java - JFrame添加图片的问题

标签 java eclipse swing jframe

我在将图片添加到 JFrame 时遇到问题,可能缺少某些内容或写错了。 以下是类(class):

主类:

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

请大家帮忙看看是什么问题? 谢谢

顺便说一句:我正在使用 eclipse,图像应该位于哪个目录中?

最佳答案

您发布的代码存在几个问题:

  • 您应该在 BorderLayoutFrame 类中使用 getContentPane().add() 而不是简单地使用 add()
  • 您确实应该使用 SwingUtilities.invokeLater() 从测试器类启动 JFrame。像这样的事情:

 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”是打字错误吗?
  • PicPanel.PaintComponent() 中,您不需要需要所有宽度/高度内容,只需执行以下操作:

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

并避免调用 super.paintComponent ,因为您正在绘制图像,为什么要让面板进行绘制?

我对你的东西的最终实现:

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

}

关于java - JFrame添加图片的问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3006162/

相关文章:

java - 将 JSON 文件转换为特定的 XML 格式

java - 安装Android Eclipse时出错

构建JPA项目期间的Eclipse AbstractMethodError

java - 如何使用 BorderLayout 将两个具有首选尺寸的标签添加到面板中?

java - 简单的图形用户界面程序

java - org.plasma.query.OrderBy 不工​​作

java - 对于 Java 中的短固定列表,我应该选择 'enum' 而不是数组,是否有特定或主要原因?

java - 获取 SQLServerException makeFromDriverError 消息 'could not prepare statement' 和 'The connection is closed'

java - 将注释处理器集成到同一个项目中

eclipse - Eclipse Mars.2中没有Gradle文件语法突出显示