Java 用JButton更改ImageBackground?

Java 用JButton更改ImageBackground?,java,image,swing,user-interface,awt,Java,Image,Swing,User Interface,Awt,我希望能够用一个简单的按钮改变背景。背景和我将添加的所有其他组件将在JPanel上替换。我已经知道了如何使用Java.awt设置背景,尽管我无法知道如何在不出错的情况下重新绘制背景 public class StartPanel extends JPanel{ private Image virus = "ImagePath"; private Image ecoli = "ImagePath"; private Graphics g; private bo

我希望能够用一个简单的按钮改变背景。背景和我将添加的所有其他组件将在JPanel上替换。我已经知道了如何使用Java.awt设置背景,尽管我无法知道如何在不出错的情况下重新绘制背景

public class StartPanel extends JPanel{ 
    private Image virus = "ImagePath";
    private Image ecoli = "ImagePath";  
    private Graphics g;
    private boolean img;

    public StartPanel(){        
        this.setLayout(null);       
        this.add(Button()); 
        img = true;


    }   

    private JButton Button(){
        JButton b = new JButton("a");
        b.setBounds(230,480,20,20);
        b.addActionListener(new ActionListener(){
            public void actionPerformed(ActionEvent arg0) {
                 img = !img;
                 repaint();
            }
        });
        return b;
    }   


    public void paint(Graphics g){
       If(img){
        g.drawImage(ecoli,0,0,this);
    } else {
       g.drawImage(virus,0,0,this);
   }
}
}

你不能仅仅用一个字符串初始化你的图像,它们需要以其他方式初始化。我认为最简单的方法是使用图像图标,如下所示:

Image ecoli = new ImageIcon("ImagePath").getImage();

如果你对你的awt图像没问题

对于更改任务,只需使用在actionlistener中切换的布尔开关

public class StartPanel extends JPanel{

private BufferedImage virus;
private BufferedImage ecoli;

boolean pic1;


public StartPanel(){

    try{
       virus = ImageIO.read(new File("PathtoImage"));
       ecoli = ImageIO.read(new File("PathtoImage"));
    }
    catch (IOException ex){
        System.out.println("Error ;-)");
    }

    this.setLayout(null);
    this.add(Button());
    pic1 = true;

}

private JButton Button(){
    JButton b = new JButton("a");
    b.setBounds(230,480,20,20);
    b.addActionListener(new ActionListener(){
        public void actionPerformed(ActionEvent arg0) {
            pic1 = !pic1;
            repaint();
        }
    });
    return b;
}

protected void paintComponent(Graphics g){
    if(pic1)
        g.drawImage(ecoli,0,0,this);
    else
        g.drawImage(virus,0,0,this);
}

}

如果您有两张以上的图片,请将int与switch case结合使用

谢谢阅读我的文章。我知道。我只是用这个字符串来隐藏实际的图像路径。你的帖子里有点不清楚问题出在哪里。你到底得到了什么错误?错误不重要,因此我没有详细解释错误“错误不重要,因此我没有详细解释错误”-也许对你来说,但对我们来说,它们所做的只是产生更多的猜测。不幸的是,你的建议不起作用。问题是当面板初始化时,paintComponent会绘制图像。您的代码只是更改了应绘制图像的布尔值,但在按下按钮后,它不会更改实际背景,这在窗口出现之前是不可能发生的。@Power Elch对不起!我忘记了最重要的^^->将repaint()添加到actionlistener(我编辑了我的示例)您也忘记了调用
super.paintComponent
1)
this.setLayout(null)Java GUI必须在不同的操作系统、屏幕大小、屏幕分辨率等上工作,在不同的地区使用不同的PLAF。因此,它们不利于像素完美布局。而是使用布局管理器,或与布局填充和边框一起使用。2) 
public void paint(Graphics g){
对于任何
JComponent
,都应该是
public void paintComponent(Graphics g){
3)
public void update(){
不要触摸此方法。4)…4)
Graphics g=getGraphics()
不,不,一千次不。这是进行自定义绘制的错误方法。请阅读本教程的课程,了解如何正确地进行绘制。“我找到了解决方案。无需回复。”-然后删除question@AndrewThompson,谢谢你的建议。你的观点完全有道理,但对于一个学校项目来说,这太过分了。我已经按照Abgehter建议的方式改变了它。尽管它们仍然存在问题,JComponents被图片覆盖,只有点击它们才能看到。你知道如何解决这个问题吗?“。对于一个学校项目来说,这是一个过火的行为。”如果你认为用良好的实践来学习编码是“过火的行为”,那么这门课程可能不适合你。目前,上面的内容看起来像是‘用魔法编码’。正如你所看到的,魔法不起作用。“你知道如何解决这个问题吗?”我在前4点中总结了它们。@MadProgrammer”然后删除问题“完全同意。这个问答从人类知识的总和中减去。”。