在Java中通过方法传递变量

在Java中通过方法传递变量,java,swing,variables,methods,jbutton,Java,Swing,Variables,Methods,Jbutton,我来这里是想请你帮我解决一个我已经有好几个小时的问题 实际上,我希望能够通过矩阵中的方法传递变量“j”和“k”。问题在于传递它们,在不了解原因的情况下,它们在进入if时不会被“捕获”。事实上,如果我尝试在if之前打印'r'和'c',它们匹配。我不明白我错在哪里,因为if中的其他东西工作得很好,但是当我尝试在if中打印'r'和'c'时,它们总是为0 按钮创建: Integer[] x = {10, 70, 130, 190, 250, 310, 370}; Integer[] y = {80, 1

我来这里是想请你帮我解决一个我已经有好几个小时的问题

实际上,我希望能够通过矩阵中的方法传递变量“j”和“k”。问题在于传递它们,在不了解原因的情况下,它们在进入if时不会被“捕获”。事实上,如果我尝试在if之前打印'r'和'c',它们匹配。我不明白我错在哪里,因为if中的其他东西工作得很好,但是当我尝试在if中打印'r'和'c'时,它们总是为0

按钮创建:

Integer[] x = {10, 70, 130, 190, 250, 310, 370}; Integer[] y = {80, 140, 200, 260, 320, 380};
    for (int i = 0, k = 0, j = 0; i < 42; i++, j++) {
        if (j % 7 == 0 && i != 0) { j = 0; k++; }
        lblCircles[i] = new JLabel(new ImageIcon(this.getClass().getResource("vuoto.png")));
        lblCircles[i].setBounds(x[j], y[k], 50, 50);
        lblCircles[i].setName("vuota");
        lblCircles[i].addMouseListener(new MouseAdapter() {  
            public void mouseClicked(MouseEvent e) {
                for (int i = 0; i < 42; i++) {
                    for (int j = 0; j < 6; j++) {
                        for (int k = 0; k < 7; k++)
                            if (e.getSource() == lblCircles[i] && choose == 1) lblClickedPlayer(lblCircles[i], j, k);
                    }
                }
            }
        });
        frame.getContentPane().add(lblCircles[i]);
    }
提前谢谢你的帮助

测试代码:

public class Prova {
public JFrame frame;
public JLabel[] lblCircles = new JLabel[42];
public String hostname;
public Font big = new Font("Comic Sans MS", Font.BOLD, 18);
public Integer[][] tbl = new Integer[6][7];
public int choose = 1, n = 0;

public static void main(String[] args) {
    EventQueue.invokeLater(new Runnable() {
        public void run() {
            try {
                Prova window = new Prova();
                window.frame.setVisible(true);
            } catch (Exception e) { e.printStackTrace(); }
        }
    });
}

public Prova() { initialize(); }

private void initialize() {
    frame = new JFrame();
    baseFrame(frame, 430, 510);

    JPanel panel = new JPanel();
    panel.setLayout(new GridLayout(6, 7));
    panel.setBackground(new Color(41, 41, 41));
    panel.setBounds(10, 80, 410, 350);
    frame.getContentPane().add(panel);

    Integer[] x = {10, 70, 130, 190, 250, 310, 370}; Integer[] y = {80, 140, 200, 260, 320, 380};
    for (int i = 0, k = 0, j = 0; i < 42; i++, j++) {
        if (j % 7 == 0 && i != 0) { j = 0; k++; }
        lblCircles[i] = new JLabel("test");
        lblCircles[i].setBounds(x[j], y[k], 50, 50);
        lblCircles[i].setForeground(Color.RED);
        lblCircles[i].setFont(big);
        lblCircles[i].setName("vuota");
        lblCircles[i].addMouseListener(new MouseAdapter() {  
            public void mouseClicked(MouseEvent e) {
                for (int i = 0; i < 42; i++) {
                    for (int j = 0; j < 6; j++) {
                        for (int k = 0; k < 7; k++) {
                            if (e.getSource() == lblCircles[i] && choose == 1) lblClickedPlayer(lblCircles[i], j, k);
                        }
                    }
                }
            }
        });
        panel.add(lblCircles[i]);
    }
}

public void baseFrame(JFrame baseFrame, int width, int height) {
    baseFrame.getContentPane().setBackground(new Color(41, 41, 41));
    baseFrame.setBounds(100, 100, width, height);
    baseFrame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    baseFrame.getContentPane().setLayout(null);
    baseFrame.setUndecorated(true);
    baseFrame.setLocationRelativeTo(null);
    baseFrame.setResizable(false);
    baseFrame.setVisible(true);
    baseFrame.setShape(new RoundRectangle2D.Double(0, 0, baseFrame.getWidth(), baseFrame.getHeight(), 30, 30));
}

public void lblClickedPlayer(JLabel lbl, int r, int c) {
    if (n == 0 && "vuota".equals(lbl.getName())) {
        n = 1;
        lbl.setText("ok1");
        lbl.setForeground(Color.GREEN);
        lbl.setName("piena");
        tbl[r][c] = 1;
        System.out.println("tbl[" + r + "][" + c + "] = " + tbl[r][c]);
    } else if (n == 1 && "vuota".equals(lbl.getName())) {
        n = 0;
        lbl.setText("ok2");
        lbl.setForeground(Color.GREEN);
        lbl.setName("piena");
        tbl[r][c] = 2;
        System.out.println("tbl[" + r + "][" + c + "] = " + tbl[r][c]);
    }
}
公共类Prova{
公共框架;
公共JLabel[]lblCircles=新JLabel[42];
公共字符串主机名;
公共字体大=新字体(“Comic Sans MS”,Font.BOLD,18);
公共整数[][]tbl=新整数[6][7];
公共int-choose=1,n=0;
公共静态void main(字符串[]args){
invokeLater(新的Runnable(){
公开募捐{
试一试{
Prova窗口=新Prova();
window.frame.setVisible(true);
}catch(异常e){e.printStackTrace();}
}
});
}
公共Prova(){initialize();}
私有void初始化(){
frame=新的JFrame();
基架(帧430510);
JPanel面板=新的JPanel();
面板设置布局(新网格布局(6,7));
面板.立根背景(新颜色(41,41,41));
嵌板.立根(10,80,410,350);
frame.getContentPane().add(面板);
整数[]x={10,70,130,190,250,310,370};整数[]y={80,140,200,260,320,380};
对于(inti=0,k=0,j=0;i<42;i++,j++){
如果(j%7==0&&i!=0){j=0;k++;}
lblCircles[i]=新的JLabel(“测试”);
lblCircles[i].立根(x[j],y[k],50,50);
lblCircles[i].设置前景(颜色.红色);
lblCircles[i].setFont(大);
lblCircles[i].setName(“vuota”);
lblCircles[i].addMouseListener(新的MouseAdapter(){
公共无效mouseClicked(MouseEvent e){
对于(int i=0;i<42;i++){
对于(int j=0;j<6;j++){
对于(int k=0;k<7;k++){
如果(e.getSource()==lblCircles[i]&&choose==1)lblClickedPlayer(lblCircles[i],j,k);
}
}
}
}
});
新增(lblCircles[i]);
}
}
公共空心基架(JFrame基架,整数宽度,整数高度){
baseFrame.getContentPane().setBackground(新颜色(41,41,41));
基架.立根(100,100,宽度,高度);
baseFrame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
baseFrame.getContentPane().setLayout(null);
基架。设置未装饰(真实);
baseFrame.setLocationRelativeTo(空);
baseFrame.SetResizeable(假);
baseFrame.setVisible(true);
baseFrame.setShape(新的RoundRectangle2D.Double(0,0,baseFrame.getWidth(),baseFrame.getHeight(),30,30));
}
public void lblClickedPlayer(JLabel lbl,int r,int c){
如果(n==0&&“vuota”.equals(lbl.getName())){
n=1;
lbl.setText(“ok1”);
lbl.设置前景(颜色为绿色);
lbl.集合名(“piena”);
tbl[r][c]=1;
System.out.println(“tbl[“+r+”][“+c+”]=”+tbl[r][c]);
}如果(n==1&&“vuota.equals(lbl.getName())),则为else{
n=0;
lbl.setText(“ok2”);
lbl.设置前景(颜色为绿色);
lbl.集合名(“piena”);
tbl[r][c]=2;
System.out.println(“tbl[“+r+”][“+c+”]=”+tbl[r][c]);
}
}

}您不需要这些内部循环,因为
i
就是您所需要的。通过使用整数除法和整数余数,可以轻松地从i值计算行和列

    int r = i / COLS;
    int c = i % COLS;
比如说

public class Prova {
    private static final int ROWS = 6;
    private static final int COLS = 7;

    // ....

            lblCircles[i].addMouseListener(new MouseAdapter() {
                // better to use mousePressed, not mouseClicked
                public void mousePressed(MouseEvent e) {

                    // no magic numbers such as 42 please. 
                    for (int i = 0; i < lblCircles.length; i++) {
                        if (e.getSource() == lblCircles[i] && choose == 1) {
                            myLabelClicked(lblCircles[i], i);
                        }
                    }
                }
            });
附带问题:

  • 是的,使用布局管理器比使用挫折要好得多,因此您的第二段代码更好
  • 避免使用幻数,如
    42
    ,而是使用属性和常量
  • 在我上面的代码中,行=6,列=7
我的MCVE:

import java.awt.Color;
import java.awt.Font;
import java.awt.GridLayout;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;

import javax.swing.*;

@SuppressWarnings("serial")
public class Prova2 extends JPanel {
    private static final int ROWS = 6;
    private static final int COLS = 7;
    private static final int LBL_EB = 25; // "eb" for empty border
    private static final int PNL_EB = 3;
    public static final Font BIG = new Font("Comic Sans MS", Font.BOLD, 18);
    private static final Color BACKGROUND = new Color(41, 41, 41);
    private static final String VUOTA = "vuota";
    private JLabel[] lblCircles = new JLabel[ROWS * COLS];
    private Integer[][] tbl = new Integer[ROWS][COLS];
    private int choose = 1, n = 0;

    public Prova2() {
        setBorder(BorderFactory.createEmptyBorder(PNL_EB, PNL_EB, PNL_EB, PNL_EB));
        setLayout(new GridLayout(ROWS, COLS));
        setBackground(BACKGROUND);
        for (int i = 0; i < lblCircles.length; i++) {
            lblCircles[i] = new JLabel("test");
            lblCircles[i].setForeground(Color.RED);
            lblCircles[i].setFont(BIG);
            lblCircles[i].setBorder(BorderFactory.createEmptyBorder(LBL_EB, LBL_EB, LBL_EB, LBL_EB));
            lblCircles[i].setName(VUOTA);
            lblCircles[i].addMouseListener(new MouseAdapter() {
                public void mousePressed(MouseEvent e) {
                    for (int i = 0; i < lblCircles.length; i++) {
                        if (e.getSource() == lblCircles[i] && choose == 1) {
                            myLabelClicked(lblCircles[i], i);
                        }
                    }
                }
            });
            add(lblCircles[i]);
        }
    }

    protected void myLabelClicked(JLabel label, int i) {
        int row = i / COLS;
        int col = i % COLS;
        if (!VUOTA.equals(label.getName())) {
            return;
        }
        if (n == 0) {
            n = 1;
            label.setText("ok1");
            tbl[row][col] = 1;
        } else {
            n = 0;
            label.setText("ok2");
            tbl[row][col] = 2;
        }
        label.setForeground(Color.GREEN);
        label.setName("piena");
        System.out.printf("tbl[%d][%d] = %d%n", row, col, tbl[row][col]);
    }

    private static void createAndShowGui() {
        Prova2 mainPanel = new Prova2();

        JFrame frame = new JFrame("Prova 2");
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        frame.getContentPane().add(mainPanel);
        frame.pack();
        frame.setLocationRelativeTo(null);
        frame.setVisible(true);
    }

    public static void main(String[] args) {
        SwingUtilities.invokeLater(() -> createAndShowGui());
    }
}
导入java.awt.Color;
导入java.awt.Font;
导入java.awt.GridLayout;
导入java.awt.event.MouseAdapter;
导入java.awt.event.MouseEvent;
导入javax.swing.*;
@抑制警告(“串行”)
公共类Prova2扩展了JPanel{
私有静态最终整数行=6;
专用静态最终int COLS=7;
私有静态最终整数LBL_EB=25;/“EB”表示空边框
专用静态最终int PNL_EB=3;
公共静态最终字体大=新字体(“Comic Sans MS”,Font.BOLD,18);
私有静态最终颜色背景=新颜色(41,41,41);
私有静态最终字符串VUOTA=“VUOTA”;
私有JLabel[]lblCircles=新JLabel[ROWS*COLS];
私有整数[][]tbl=新整数[行][COLS];
私有int-choose=1,n=0;
公共图书馆2(){
setBORDORDER(BorderFactory.createEmptyBorder(PNL_EB,PNL_EB,PNL_EB,PNL_EB));
setLayout(新网格布局(行、列));
挫折背景(背景);
对于(int i=0;ipublic void myLabelClicked(JLabel label, int i) {
    int r = i / COLS;
    int c = i % COLS;
    if (n == 0 && "vuota".equals(label.getName())) {
        n = 1;
        label.setText("ok1");
        label.setForeground(Color.GREEN);
        label.setName("piena");
        tbl[r][c] = 1;
    } else {
        n = 0;
        label.setText("ok2");
        label.setForeground(Color.GREEN);
        label.setName("piena");
        tbl[r][c] = 2;
    }
    System.out.println("tbl[" + r + "][" + c + "] = " + tbl[r][c]);
}
import java.awt.Color;
import java.awt.Font;
import java.awt.GridLayout;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;

import javax.swing.*;

@SuppressWarnings("serial")
public class Prova2 extends JPanel {
    private static final int ROWS = 6;
    private static final int COLS = 7;
    private static final int LBL_EB = 25; // "eb" for empty border
    private static final int PNL_EB = 3;
    public static final Font BIG = new Font("Comic Sans MS", Font.BOLD, 18);
    private static final Color BACKGROUND = new Color(41, 41, 41);
    private static final String VUOTA = "vuota";
    private JLabel[] lblCircles = new JLabel[ROWS * COLS];
    private Integer[][] tbl = new Integer[ROWS][COLS];
    private int choose = 1, n = 0;

    public Prova2() {
        setBorder(BorderFactory.createEmptyBorder(PNL_EB, PNL_EB, PNL_EB, PNL_EB));
        setLayout(new GridLayout(ROWS, COLS));
        setBackground(BACKGROUND);
        for (int i = 0; i < lblCircles.length; i++) {
            lblCircles[i] = new JLabel("test");
            lblCircles[i].setForeground(Color.RED);
            lblCircles[i].setFont(BIG);
            lblCircles[i].setBorder(BorderFactory.createEmptyBorder(LBL_EB, LBL_EB, LBL_EB, LBL_EB));
            lblCircles[i].setName(VUOTA);
            lblCircles[i].addMouseListener(new MouseAdapter() {
                public void mousePressed(MouseEvent e) {
                    for (int i = 0; i < lblCircles.length; i++) {
                        if (e.getSource() == lblCircles[i] && choose == 1) {
                            myLabelClicked(lblCircles[i], i);
                        }
                    }
                }
            });
            add(lblCircles[i]);
        }
    }

    protected void myLabelClicked(JLabel label, int i) {
        int row = i / COLS;
        int col = i % COLS;
        if (!VUOTA.equals(label.getName())) {
            return;
        }
        if (n == 0) {
            n = 1;
            label.setText("ok1");
            tbl[row][col] = 1;
        } else {
            n = 0;
            label.setText("ok2");
            tbl[row][col] = 2;
        }
        label.setForeground(Color.GREEN);
        label.setName("piena");
        System.out.printf("tbl[%d][%d] = %d%n", row, col, tbl[row][col]);
    }

    private static void createAndShowGui() {
        Prova2 mainPanel = new Prova2();

        JFrame frame = new JFrame("Prova 2");
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        frame.getContentPane().add(mainPanel);
        frame.pack();
        frame.setLocationRelativeTo(null);
        frame.setVisible(true);
    }

    public static void main(String[] args) {
        SwingUtilities.invokeLater(() -> createAndShowGui());
    }
}