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

JButtons与JPanel的位置不同

史淇
2023-03-14

我现在正在试着做一个数独网格。因此,我使用了两个数组(双维),一个数组包含所有的JButtons,另一个数组包含9个JPanels。我在每个JPanel中放置了9个按钮,我在每个JPanel中使用了(3,3)的GridLayout,所有的JPanel都在一个更大的JPanel中,它也使用了GridLayout。问题是按钮在窗口的底部,所以不是所有的按钮都显示出来。我为第一个JPanel(包含前9个按钮)设置了一个绿色背景,以查看它与它的按钮相比较的位置。我不能调整按钮和面板的大小。

这里是HMI的屏幕

下面是我的类的代码:

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

public class Sudoku extends JFrame implements ActionListener {


    public Sudoku(){
        //Initialise the window and show it
        this.setTitle("Sudoku Solver");
        this.setSize(1000, 500);
        this.setLocationRelativeTo(null);
        this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

        JPanel pan = new JPanel();
        pan.setLayout(new GridLayout(3,3));

        //Initialise an array of JPanel
        JPanel[][] jPanelTab = new JPanel[3][3];
        for(int i = 0; i < 3;i++){
            for(int j = 0; j < 3;j++){
                jPanelTab[i][j] = new JPanel();
                jPanelTab[i][j].setLayout(new GridLayout(3,3));
            }
        }


        //Initialise the JButtons
        JButton[][] boutonTab = new JButton[9][9];
        for(int i = 0; i < 9;i++){
            for(int j = 0; j < 9;j++){
                boutonTab[i][j] = new JButton();
                boutonTab[i][j].setText(""+i+"/"+j);
            }
        }


        for(int h = 0; h < 3; h++) {
            int n = 0;
            for (int i = 0; i < 3; i++) {
                int column = 0;
                for (int j = 0; j < 9; j++) {
                    jPanelTab[h][column].add(boutonTab[n][j]);
                    if (j == 2 || j == 5) {
                        column++;
                    }
                }
                n++;
            }
        }

        //Add the 9 JPanels to the JFrame
        for(int i = 0; i < 3;i++){
            for(int j = 0; j < 3;j++){
                if(j == 0 && i == 0)
                    pan.add(jPanelTab[i][j]).setBackground(Color.green);
                else
                    pan.add(jPanelTab[i][j]);

            }
        }
        this.setContentPane(pan);
        this.setVisible(true);

    }

    @Override
    public void actionPerformed(ActionEvent e) {

    }
}

谢谢你的回答!

共有1个答案

羊丰茂
2023-03-14

在处理二维数组时,第一个索引是行,第二个索引是列。

因此使用更好的变量名可能有助于理解循环逻辑。在下面代码中,我使用了包含“r”(行)和“c”(列)的变量。

当在循环代码中使用上述变量名时,您现在循环遍历列之前的行,因此外部循环将在变量名中包含“r”,内部循环将在变量名中包含“c”。

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

public class Sudoku extends JFrame {

    public Sudoku(){

        //Initialise the window and show it
        this.setTitle("Sudoku Solver");
        this.setSize(1000, 500);
        this.setLocationRelativeTo(null);
        this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

        JPanel board = new JPanel();
        board.setLayout(new GridLayout(3,3));

        //Initialise an array of JPanel
        JPanel[][] panels = new JPanel[3][3];
        for (int r = 0; r < 3; r++)
        {
            for (int c = 0; c < 3; c++++)
            {
                JPanel panel = new JPanel( new GridLayout(3, 3) );
                panels[r][c] = panel;
                board.add( panel );
            }
        }

        //Initialise the JButtons
        JButton[][] buttons = new JButton[9][9];
        for(int r = 0; r < 9; r++)
        {
            for(int c = 0; c < 9; c++)
            {
                buttons[r][c] = new JButton(r + "/" + c);
            }
        }

        for (int panelR = 0; panelR < 3; panelR++)
        {
            for (int panelC = 0; panelC < 3; panelC++)
            {
                int buttonR = panelR * 3;
                int buttonC = panelC * 3;

                for (int i = 0; i < 9; i++)
                {
                    panels[panelR][panelC].add(buttons[buttonR][buttonC]);
                    buttonC++;

                    if ((i + 1) % 3 == 0)
                    {
                        buttonC = panelC * 3;
                        buttonR++;
                    }
                }
            }
        }

        this.setContentPane(board);
        this.setVisible(true);

    }

    public static void main(String[] args) throws Exception
    {
        java.awt.EventQueue.invokeLater( () -> new Sudoku() );
    }
}
 类似资料:
  • 我有一个JFrame,它被设置为大小为NxN的GridLayout。N由用户在程序开始时作为命令行给出。NxN模式中的JButton被添加到JPanels中的窗口中,由GridLayout(我认为)在位置中设置。 每个JButton是否需要自己的JPanel来使用GridLayout?我的印象是,您可以为所有按钮设置一个JPanel,并将JPanel设置为JButtons的GridLayout。我

  • 但是,我的程序稍后尝试将一个新的JPanel添加到类的扩展JPanel中,方法是: 这个新的JPanel以正确的BorderLayout格式显示内容,但是JPanel本身将保持在扩展JPanel的顶部中心,我知道这是因为默认布局设置为FlowLayout,但是将其设置为BorderLayout只会导致面板占用整个屏幕。将布局设置为null将完全破坏框架,除了框架的最小化和关闭按钮之外,什么也没有出

  • 我有一个JFrame,里面装满了JPanel(下面的代码)。 我正在使用JPanel在里面画东西,例如,我可以在任何我喜欢的地方画线,但是当添加JLabel到它的时候,我不能把它移动到它卡住的任何地方 但问题是他们建议的解决方案对我不起作用。 很抱歉,如果我不清楚,我试图在创建Surface之前和之后在函数initUI()中添加上面的内容。 但是在那之后,框架显示几乎(1,1)大小和它的空(如果我

  • 我需要一个帮助来定位一个JPanel在一个特定的位置到一个Jframe。 我在一个扩展JFrame的类中有一个JPanel,我需要将这个JPanel放在一个特定的x,y位置。 是这样的: 我不需要一个LayoutManager的位置的JPanel,因为我需要把JPanel在一个特定的位置(像150,150的例子)。但是如果我panel.set位置(150,150),就像上面的代码一样,什么都不会发

  • 我想知道我们是否可以有一个布局不同于其父JFrame的JPanel。例如。如果我有JFrame与边框布局,我们有一个JPanel嵌入到它,它有不同的布局。有可能吗? 我正在努力做这件事。但是这样JPanel的组件就不会显示出来了。

  • 有人能解释一下我如何在jLabel中放置几个jButtons,这些jButtons有像这个图片一样的背景图片吗?主jFrame没有装饰,设置为全屏。 我看到了很多像这样的不同例子,但这些例子在jPanel中只显示单个按钮。