Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/image/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 新创建的JButton不';t覆盖以前创建的jbutton_Java_Image_Swing - Fatal编程技术网

Java 新创建的JButton不';t覆盖以前创建的jbutton

Java 新创建的JButton不';t覆盖以前创建的jbutton,java,image,swing,Java,Image,Swing,本质上,我编写的是一个益智游戏 它包含一个图像,图像进一步分为9个部分,放置在包含3x3 JButton GridLayout的JPanel上。最初,9个按钮是空的。当用户单击“开始游戏”时,9个按钮将显示按钮上的图像 我使用setPreferredSize()设置包含9个空JButton的JPanel的大小。之后,我使用Inset(0,0,0,0)使按钮的内容填充整个按钮 但是现在,当我想在用户单击“开始游戏”时添加图像按钮来替换空按钮时,它不起作用 我认为这是因为我前面设置的setPrefe

本质上,我编写的是一个益智游戏

它包含一个图像,图像进一步分为9个部分,放置在包含3x3 JButton GridLayout的JPanel上。最初,9个按钮是空的。当用户单击“开始游戏”时,9个按钮将显示按钮上的图像

我使用setPreferredSize()设置包含9个空JButton的JPanel的大小。之后,我使用Inset(0,0,0,0)使按钮的内容填充整个按钮

但是现在,当我想在用户单击“开始游戏”时添加图像按钮来替换空按钮时,它不起作用

我认为这是因为我前面设置的
setPreferredSize()
阻止了
插入值的工作

我插入了一些
system.out.println
值来检查该方法是否正在运行,它正在运行,但当用户单击“开始游戏”时,图像仍然拒绝显示在按钮上

公共类游戏框架扩展JFrame实现ActionListener{
私人按钮1;
私有JButton[]按钮=新JButton[9];
私人插页纽扣边缘;
私有布尔方法;
私人杰帕内尔·普兹皮克;
公共游戏框架(){
//…编码。。
//创建新按钮-按钮1
button1=新的JButton(“开始游戏”);
//将操作事件添加到“开始”按钮
按钮1.addActionListener(此按钮);
//为拆分的拼图块创建新面板
puzpiece=新JPanel();
设置布局(新网格布局(3,3));
//检查testImageMethod boolean(在setupImage()中)是否为true,
//如果不是,则添加9个不带图像的按钮。

对于所述
JButton
的(int a=0;a简单地
setIcon
,不要将
JButton
重新添加到已经可见的
JPanel

这方面的一个小例子是:

import javax.swing.*;
import java.awt.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;

/**
 * Created with IntelliJ IDEA.
 * User: Gagandeep Bali
 * Date: 1/19/13
 * Time: 10:05 AM
 * To change this template use File | Settings | File Templates.
 */
public class ButtonImageTest
{
    private Icon infoIcon = UIManager.getIcon("OptionPane.informationIcon");
    private Icon errorIcon = UIManager.getIcon("OptionPane.errorIcon");
    private JButton button;
    private int counter = 1;

    private void displayGUI()
    {
        JFrame frame  = new JFrame("Button Image Test");
        frame.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);

        JPanel contentPane = new JPanel();
        button = new JButton();
        button.setBorderPainted(false);
        button.addActionListener(new ActionListener() {
            @Override
            public void actionPerformed(ActionEvent e) {
                if (counter % 2 != 0)
                {
                    button.setIcon(errorIcon);
                    counter = 2;
                }
                else
                {
                    button.setIcon(infoIcon);
                    counter = 1;
                }
            }
        });
        contentPane.add(button);

        frame.setContentPane(contentPane);
        frame.setSize(100, 100);
        frame.setLocationByPlatform(true);
        frame.setVisible(true);
    }
    public static void main(String... args)
    {
        EventQueue.invokeLater(new Runnable() {
            @Override
            public void run() {
                new ButtonImageTest().displayGUI();
            }
        });
    }
}

我不确定我确切知道你在做什么,但是

  • 看起来您正在用3x3的普通JButton网格填充JPanel
  • 在按下按钮时,您将添加显示图像的JButtons
  • 但我看不到您在添加新按钮之前删除原始按钮
  • 我也看不到您在更换组件后在puzpiece JPanel上调用
    revalidate()
    ,然后调用
    repaint()
  • 更重要的是,当交换puzpiece JPanel已经拥有的JButtons中的图像图标更容易时,为什么要交换JButtons呢?这是我在10分钟前的评论中建议的,但现在正在给出答案

为什么要替换JButtons?为什么不简单地交换JButtons显示的图像图标?请检查@GagandeepBali答案的编辑。他提供了一些清晰的示例代码来说明他的观点。是的,正如我在前面的评论中所说的。1+详细的示例代码!我会在他回答时给OP留下评论,以回顾这一点你还没有看到。不,没关系,基本上我只是为未来的访客添加了,你的答案已经得到了OP想要的每一个细节:-)感谢您对答案的欣赏:-)actionPerformed方法的@override的目的是什么?它告诉编译器您实际上正在重写超类的某个方法,因此如果您在定义该方法时犯了一些拼写错误,编译器可以检查超类中的所有方法,以便与h您的,以警告您此方法未重写该超类的任何方法。在缺少
@Override
的情况下,(考虑到您在重写时拼写了错误的方法)编译器将把这个拼写错误的方法视为该类的任何其他方法,并且不会生成任何错误。谢谢提示。是的,你所说的反映了我想要做的事情。我在以前的一次试错中尝试调用revalidate()和repaint(),但它创建了附加按钮,而不是覆盖原来的9个按钮:O
import javax.swing.*;
import java.awt.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;

/**
 * Created with IntelliJ IDEA.
 * User: Gagandeep Bali
 * Date: 1/19/13
 * Time: 10:05 AM
 * To change this template use File | Settings | File Templates.
 */
public class ButtonImageTest
{
    private Icon infoIcon = UIManager.getIcon("OptionPane.informationIcon");
    private Icon errorIcon = UIManager.getIcon("OptionPane.errorIcon");
    private JButton button;
    private int counter = 1;

    private void displayGUI()
    {
        JFrame frame  = new JFrame("Button Image Test");
        frame.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);

        JPanel contentPane = new JPanel();
        button = new JButton();
        button.setBorderPainted(false);
        button.addActionListener(new ActionListener() {
            @Override
            public void actionPerformed(ActionEvent e) {
                if (counter % 2 != 0)
                {
                    button.setIcon(errorIcon);
                    counter = 2;
                }
                else
                {
                    button.setIcon(infoIcon);
                    counter = 1;
                }
            }
        });
        contentPane.add(button);

        frame.setContentPane(contentPane);
        frame.setSize(100, 100);
        frame.setLocationByPlatform(true);
        frame.setVisible(true);
    }
    public static void main(String... args)
    {
        EventQueue.invokeLater(new Runnable() {
            @Override
            public void run() {
                new ButtonImageTest().displayGUI();
            }
        });
    }
}