Java 在JButton上单击打印特定值

Java 在JButton上单击打印特定值,java,swing,Java,Swing,我有一个方法被调用了4次。该方法返回一个JPanel,其中包含一个JButton。当我点击按钮1打印1,点击按钮2打印2,依此类推。现在,当我点击任何按钮时,它会打印4。就像这个方法被调用了4次,count=4,每个按钮都有4次。我怎样才能解决这个问题 private int count=0; private JPanel createPanel(){ count++; JPanel app = new JPanel(true); app.set

我有一个方法被调用了4次。该方法返回一个JPanel,其中包含一个JButton。当我点击按钮1打印1,点击按钮2打印2,依此类推。现在,当我点击任何按钮时,它会打印4。就像这个方法被调用了4次,count=4,每个按钮都有4次。我怎样才能解决这个问题

private int count=0;

private JPanel createPanel(){
        count++;
        JPanel app = new JPanel(true);
        app.setLayout(new GridLayout(1,1);
        app.setPreferredSize(new Dimension(width,dHeight));
        JButton btn = createButton("Click Me");
        buttonStyle(btn);
        btn.addActionListener(e -> this.doStuff(count));
        app.add(btn);

        return app;
}

private void doStuff(int t){
    System.out.println(t);
}

当您说您调用
createPanel()
4次时,您的计数器将增加4倍。所有
doStuff()
调用都传递变量
count
,该变量是类的成员,由所有其他成员(如
doStuff()
)共享。
计数之前增加了4倍,因此为4。所以每个按钮都会打印出4

快速修复:

private JPanel createPanel(){
        int copyCounter = count; // Copy the counter
        count++;
        JPanel app = new JPanel(true);
        app.setLayout(new GridLayout(1,1);
        app.setPreferredSize(new Dimension(width,dHeight));
        JButton btn = createButton("Click Me");
        buttonStyle(btn);
        btn.addActionListener(e -> this.doStuff(copyCounter)); // Use copy here
        app.add(btn);

        return app;
}

通过这样做,您将在方法中创建计数器的副本,该值不会因以后调用
createPanel()

而增加。当您说调用
createPanel()
4次时,您的计数器将增加4倍。所有
doStuff()
调用都传递变量
count
,该变量是类的成员,由所有其他成员(如
doStuff()
)共享。
计数之前增加了4倍,因此为4。所以每个按钮都会打印出4

快速修复:

private JPanel createPanel(){
        int copyCounter = count; // Copy the counter
        count++;
        JPanel app = new JPanel(true);
        app.setLayout(new GridLayout(1,1);
        app.setPreferredSize(new Dimension(width,dHeight));
        JButton btn = createButton("Click Me");
        buttonStyle(btn);
        btn.addActionListener(e -> this.doStuff(copyCounter)); // Use copy here
        app.add(btn);

        return app;
}

通过这样做,您将在方法中创建计数器的副本,此值不会因以后调用
createPanel()

而增加。您的count变量是类的成员。因此,每次调用createPanel()都会增加它的值

doStuff打印t(计数的当前值)


您必须将count的值存储在JButton的实例中。通常,通过使用成员变量“private int id”将该类扩展到您自己的MyJButton类。count变量是您的类的成员。因此,每次调用createPanel()都会增加它的值

doStuff打印t(计数的当前值)


您必须将count的值存储在JButton的实例中。通常通过使用成员变量“private int id”将该类扩展到您自己的MyJButton类来实现。

谢谢。这就解决了问题。你为什么说那是肮脏的?干净的方法是什么呢?您使用的是lambda,所以我想无论如何都可以,但是在我看来,在方法中创建一个变量的副本,然后在以后使用(通常在方法退出后它就会消失),这有点脏。我从帖子中删除了脏的内容(这只是我的一般意见)不创建变量副本的情况下,还有什么其他方法可以做到这一点?变量需要以任何一种方式复制。我想到的方法是创建另一个从actionlistener接口扩展的类(就像),并将值传递给这个类并将其存储在那里。对于单个打印方法来说,开销可能有点大,但在我看来更可取。为了使我的观点更合理一些:如果您不使用java 8(lambda),并且这就是我的原始调用的来源,则需要将变量“copyCounter”设为final。这是我想避免的,谢谢。这就解决了问题。你为什么说那是肮脏的?干净的方法是什么呢?您使用的是lambda,所以我想无论如何都可以,但是在我看来,在方法中创建一个变量的副本,然后在以后使用(通常在方法退出后它就会消失),这有点脏。我从帖子中删除了脏的内容(这只是我的一般意见)不创建变量副本的情况下,还有什么其他方法可以做到这一点?变量需要以任何一种方式复制。我想到的方法是创建另一个从actionlistener接口扩展的类(就像),并将值传递给这个类并将其存储在那里。对于单个打印方法来说,开销可能有点大,但在我看来更可取。为了使我的观点更合理一些:如果您不使用java 8(lambda),并且这就是我的原始调用的来源,则需要将变量“copyCounter”设为final。这是我试图避免的事情。