使用 JButton 更改 ImageBackground?

Posted

技术标签:

【中文标题】使用 JButton 更改 ImageBackground?【英文标题】:Changing ImageBackground with a JButton? 【发布时间】:2017-07-22 07:04:47 【问题描述】:

我希望能够使用简单的 Jbutton 更改背景。我将添加的背景和其他所有组件都将在 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);
   


【问题讨论】:

1) this.setLayout(null); Java GUI 必须在不同的操作系统、屏幕尺寸、屏幕分辨率等上使用不同语言环境中的不同 PLAF。因此,它们不利于像素完美布局。而是使用布局管理器,或combinations of them 以及white space 的布局填充和边框。 2) public void paint(Graphics g) 对于任何JComponent,应该是public void paintComponent(Graphics g) 3) public void update() 不要碰这个方法。 4) .. .. 4) Graphics g = getGraphics(); 不,不,一千次不。这是进行自定义绘画的错误方法。仔细阅读本教程的Performing Custom Painting 课程,了解如何正确操作。 “我找到了解决方案。无需回复。” - 然后删除问题 @AndrewThompson,感谢您的建议。您的观点完全有道理,但对于学校项目来说,这将是过度杀伤力。我已经按照 Abgehter 的建议进行了更改。尽管它们仍然是 JComponents 被 Image 覆盖的问题,并且只有通过单击它们才能看到它们。知道如何解决这个问题吗? "..这对学校项目来说有点过头了。" 如果您认为使用良好实践学习编码是“过头”,那么本课程可能不适合您.目前,上面的内容看起来像是“魔法编码”。如你所见,魔法不起作用。 “知道如何解决这个问题吗?” 我在前 4 点中总结了它们。 @MadProgrammer “然后删除问题” 完全同意。此问答从人类知识的总和中减去 【参考方案1】:

您不能只使用字符串初始化图像,它们需要以其他方式初始化。我相信最简单的方法是使用 ImageIcon,如下所示:

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

【讨论】:

感谢您阅读我的帖子。我知道。我只是使用字符串来隐藏实际的图像路径。 在你的帖子中有点不清楚问题是什么。您到底遇到了什么错误? 错误不重要,所以我没有详细解释错误 “错误并不重要,因此我没有详细解释错误” - 也许对你来说,但对我们来说,他们所做的只是产生更多的猜测工作【参考方案2】:

如果你对你的 awt-Image 没问题...

对于更改任务,只需使用您在动作监听器中切换的布尔女巫

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 结合使用

【讨论】:

很遗憾,您的建议不起作用。问题是当 Panel 初始化时,paintComponent 会绘制图像。您的代码只是更改了应该绘制哪个图像的布尔值,但在按下按钮后不会更改实际背景,这在窗口出现之前不会发生。 @Power-Elch 对不起!我忘记了最重要的^^ -> 将 repaint() 添加到 actionlistener(我编辑了我的示例) 你也忘了打super.paintComponent

以上是关于使用 JButton 更改 ImageBackground?的主要内容,如果未能解决你的问题,请参考以下文章

在 500 毫秒内更改 JButton 颜色

更改可见性时,JButton 大小设置为默认大小

使用 JButton 在 Java 中创建自定义按钮

java 界面编程中 JButton问题

使用 for 循环时向 JButton 添加操作

使用前景标签将图像添加到 Jbutton