【问题标题】:How to set a background to JFrame by over-riding paintComponent?如何通过覆盖paintComponent为JFrame设置背景?
【发布时间】:2015-05-19 17:21:59
【问题描述】:

我刚刚启动 Java GUI,我想通过覆盖 paintComponent(Graphics g) 方法为 JFrame 设置背景图像,以便能够在图像上添加子组件。我看过其他答案,但代码对于初学者来说太复杂了

请使用以下代码来解释这是如何完成的:

public class staffGUI extends JFrame {

public staffGUI(){
    super("Staff Management");

    this.setVisible(true);
    this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    this.setLocationRelativeTo(null);
    this.setResizable(false);
    this.pack();
}       
}

【问题讨论】:

  • “我看过其他答案,但代码对于初学者来说太复杂了” 初学者应该咨询tutorial on custom painting 来完成这项任务。 “请使用以下代码来解释这是如何完成的:” 所以.. 你希望 我们 完成任务,并以如此简单的方式向你解释(偶)你能看懂吗?投票结束 - “太宽泛”..
  • 我知道这个问题已经被问过很多次了,但是每个用户都发布了他们自己的源代码,这使得代码难以阅读
  • 我已经知道如何使用 JLabel 来做到这一点,但是我无法将子组件放置在图像上
  • 我也看过很多Java GUI的教科书,但是没有一个具体解释如何使用这个功能
  • 简单地说,不要使用JPanel 作为主要表面。覆盖它的paintComponent 方法并将其应用为框架内容窗格,然后将框架视为正常。您最终会得到一个更加灵活的解决方案。对于example

标签: java image swing background jframe


【解决方案1】:
public class staffGUI extends JFrame {

    public staffGUI(){
        super("Staff Management");

        this.setContentPane(new MyContentPane("C://somePath//image.jpg"));

        this.setVisible(true);
        this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        this.setLocationRelativeTo(null);
        this.setResizable(false);
        this.pack();
    }

    private class MyContentPane extends JPanel
    {
         private BufferedImage image;

         public MyContentPane(String path){
               try{
                     image = ImageIO.read(new File(path));
               }catch(IOException e){
                     e.printStackTrace();

                     image = new BufferedImage(100 , 100 , BufferedImage.TYPE_INT_ARGB);
                     Graphics g = image.getGraphics();
                     g.setColor(Color.blue);
                     g.fillRect(0 , 0 , 100 , 100);
                     g.dispose();
         }

         public void paintComponent(Graphics g){
              super.paintComponent(g);

              g.drawImage(image , 0 , 0 , getWidth() , getHeight() , null);
         }
    }
}       

框架中的Painting 始终在框架的内容窗格中完成。内容窗格也是添加组件的地方。 MyContentPane 从给定路径加载 BufferedImage。如果加载失败,则会创建一个蓝色矩形作为图像。通过将示例代码中的内容窗格设置为 MyContentPane 的实例,您可以使 MyContentPane 呈现框架的完整内部区域。

【讨论】:

  • 那么我在哪里加载图像?
  • 哎呀,我错了,我以为你只需要一个背景色。一秒钟,我将编辑它以加载图像
  • 好的,我纠正了我的错误,现在它会加载图像 - 至少只要有人输入有效路径
猜你喜欢
  • 2010-11-08
  • 1970-01-01
  • 2022-01-22
  • 2021-09-12
  • 1970-01-01
  • 2016-01-06
  • 1970-01-01
  • 2015-11-16
  • 2021-10-01
相关资源
最近更新 更多