当前位置: 首页 > 知识库问答 >
问题:

新创建的JButton不会覆盖先前创建的JButton

蓝慈
2023-03-14

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

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

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

    public class GameFrame extends JFrame implements ActionListener {
        private JButton button1;
        private JButton[] button = new JButton[9];
        private Insets buttonMargin;
        private boolean testImageMethod;
        private JPanel puzpiece;

        public GameFrame(){
            //.. coding ..

            // create new buttons - button1
            button1  = new JButton("Start Game");
            // add action event to "Start" button
            button1.addActionListener(this);

            // creates a new panel for the splitted puzzle pieces
            puzpiece = new JPanel();
            puzpiece.setLayout(new GridLayout(3,3));

            // check if testImageMethod boolean ( in setupImage() ) is true, 
            //if it isn't, adds 9 buttons w/o images.
             for(int a=0; a<9; a++){
                 if(testImageMethod){
                 }
                 else{
                     // adds 9 buttons without images 
                   button[a] = new JButton();  
                   puzpiece.add(button[a]);
                   puzpiece.setPreferredSize(new Dimension(500,200));
                 }


             }
             // adds puzpiece panel into the frame 
              this.add(puzpiece,BorderLayout.WEST);     
            //.. coding ..

        }

        public void actionPerformed(ActionEvent e){
            if (e.getSource() == button1){
                // puzpiece.button.setVisible(false);
                //puzpiece.remove(button);

                // call setImage() method
                setImage();

                for(int a=0; a<9; a++){
                // adds the new 9 buttons with images into panel
                puzpiece.add(button[a]);
                // test if method is running
                System.out.println("qq");
                }
            }
            else{
                System.out.println("bbb");
            }
        } 

        // method setImage() divides the image into subimages
        public void setImage(){
          //.. coding ..
          // test if method is running
          System.out.println("a");

            setupImage( count++, sc );
        }

        // method setupImage() adds the subimages to the buttons
        private void setupImage( int a, Image wi )
        { 
          // test if method is running
          System.out.println("d");

            buttonMargin = new Insets( 0, 0, 0, 0 );
            button[a] = new JButton( new ImageIcon( wi ) );
            button[a].setMargin( buttonMargin );

            // test if method is running
            System.out.println("e");

        } // end method setupImage()
    }

共有1个答案

陆仲渊
2023-03-14

我不知道你在做什么,但是...

  • 您似乎正在用3x3网格的普通JButtons填充JPanel,
  • 和on button按下您要添加到显示图像的JButtons中。
  • 但我看不到您在添加新按钮之前删除原始按钮。
  • 我也没有看到您在更改组件后在puzpiece JPanel上调用revalidate(),然后调用repaint()
  • 更重要的是,为什么要交换JButtons,因为交换JButtons中已经由puzpiece JPanel持有的ImageIcons要容易得多?这是我10分钟前在评论中推荐的内容,但现在正在作出答复。
 类似资料:
  • 问题内容: 你好,我有这个设置 我需要为每个按钮获取以下内容 在Java中是否可以为我声明的每个按钮动态创建此按钮?因为当我有5个按钮时,我不需要3x5 = 15行代码,而是只有几行具有动态创建的按钮。 问题答案: 编写一个小循环并将您的按钮存储在数组中:

  • 你好,我已经准备好了 我需要为每个按钮获得以下内容 在Java中,是否可以为我声明的每个按钮动态创建它?因为当我有5个按钮时,我不希望3x5=15行代码,而只希望有几行动态创建的按钮。

  • 问题内容: 我想创建一个具有任意大小的div,然后在该div上显示一些内容。完全按照CSS中下面的div定位和调整叠加层大小的最佳方法是什么? 问题答案: 您可以使用将叠加层放置在div内部,然后在各个方向上将其拉伸,如下所示: CSS 已更新* 您只需要确保您的父div为其添加了属性,并为其设置了更低的属性。 为下面的评论者制作了一个可以在所有浏览器(包括IE7 +)上运行的演示。 从CSS中移

  • 我试图根据属性文件中定义的URL数量创建动态JButton和JLabel。 到目前为止,我尝试的是: 在我的Java程序中,我正在读取属性文件,并根据拆分字符串,现在我需要相应地生成按钮和标签。就像

  • 我正在使用Apache POI将数据导出到一个.xlsx文件,我想对文件中包含的一些行和单元格设置样式。 我使用XSSF,因为该文件将在Excel2007+中读取。

  • org.openqa.selenium.SessionNotCreatedException:无法创建新会话。(原始错误:命令失败:C:\Windows\system32\cmd.exe/s/C“C:\Program Files(x86)\Android\Android sdk\platform tools\adb.exe”-s 69c7aa170104安装“C:\Program Files(x8