使用 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?的主要内容,如果未能解决你的问题,请参考以下文章