4

各ボタンを手動で作成してランダムな色を割り当てるのではなく、作成時にランダムな色が割り当てられるJButtonの配列を作成しました。これで、クリックしたボタンの色をランダムに変更して使用したいところに来ました。これまでにボタンを作成して追加したのと同じ方法で(ループを使用して)実行したいと思います。

私が思ったようにそれをやったのに失敗しました。私は与えられ"local variable is accessed from within inner class; needs to be declared final"ます。ファイナルを使うと変更できないので迷ってしまいました。

考えられる回避策はありますか?

package test;

import javax.swing.*;
import java.awt.*;
import java.awt.event.*;
import java.beans.EventHandler;
import java.lang.String;
import java.util.Random;

public class TEST

{

/**
 * @param args the command line arguments
 */
public static Random rand = new Random();
public static int oh;

public void btnPress(ActionEvent e, JButton[] jButts, float r, float g, float b) {
    for (int y = 0; y < jButts.length; y++) {
        if (e.getSource() == jButts[y]) {
            jButts[y].setBackground(Color.getHSBColor(r, g, b));
        }
    }
}

public static void main(String[] args) {
    JFrame frame = new JFrame("Suhp, Brah?");
    frame.setLayout(new BorderLayout());
    frame.setVisible(true);
    frame.setBackground(Color.magenta);
    frame.setSize(400, 400);
    frame.setResizable(false);
    frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    frame.setLayout(new GridLayout(4, 4));
    String[] numbs = {"0", "1", "2", "3", "4", "5", "6", "7"};
    final JButton[] jButts = new JButton[numbs.length];//0-7

    for (int i = 0; i < 8; i++) {

        jButts[i] = new JButton(numbs[i].toString());
        //String leString = rand.nextInt(255).toString;
        jButts[i].setBackground(Color.getHSBColor(rand.nextFloat(), rand.nextFloat(), rand.nextFloat()));
    }
    for (int x = 0; x < 8; x++) {
        frame.add(jButts[x]);
    }
    //ActionListener
    for (int i =0; i < 8; i++) {

        jButts[i].addActionListener(new ActionListener() {
            @Override
            public void actionPerformed(ActionEvent e) {
                i++;
                jButts[i].setBackground(Color.getHSBColor(rand.nextFloat(), rand.nextFloat(), rand.nextFloat()));
            }
        });
    }

}
}
4

3 に答える 3

5

iで使用する必要はありませんActionListener。次を使用してボタンを取得できますActionEvent#getSource

jButts[i].addActionListener(new ActionListener() {
    @Override
    public void actionPerformed(ActionEvent e) {
        JButton button = (JButton) e.getSource();
        button.setBackground(Color.getHSBColor(rand.nextFloat(),
                rand.nextFloat(), rand.nextFloat()));
    }
});
于 2013-02-28T00:27:35.853 に答える
3

ここに回避策があります。

//ActionListener
for (int i =0; i < 8; i++) 
{
    final int temp = i; // assign to temporary variable
    jButts[temp].addActionListener(new ActionListener() 
    {
        @Override
        public void actionPerformed(ActionEvent e) 
        {
            // i++; Not sure what you're trying to do here..
            jButts[temp].setBackground(Color.getHSBColor(rand.nextFloat(), rand.nextFloat(), rand.nextFloat()));
        }
    });
}

しかし、アプローチを再考することを強くお勧めします。

于 2013-02-28T00:30:00.057 に答える
2
// ActionListener
    ActionListener listener = new ActionListener() {
        @Override
        public void actionPerformed(ActionEvent e) {
            JButton button = (JButton) e.getSource();
            button.setBackground(Color.getHSBColor(rand.nextFloat(),
                    rand.nextFloat(), rand.nextFloat()));
        }
    };

    for (int i = 0; i < 8; i++)
        jButts[i].addActionListener(listener);
于 2013-02-28T00:34:48.923 に答える