我现在正在试着做一个数独网格。因此,我使用了两个数组(双维),一个数组包含所有的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) {
}
}
谢谢你的回答!
在处理二维数组时,第一个索引是行,第二个索引是列。
因此使用更好的变量名可能有助于理解循环逻辑。在下面代码中,我使用了包含“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中只显示单个按钮。