1

2D配列を使用して10x10ボタンを含むグリッドを作成しました。x.getSource()。getLabel()を試しましたが、コンパイラは互換性がないと言っています。また、クリックされた特定のボタンを取得したいと思います。

作成したグリッドからクリックされた正確なボタンを取得し、そのラベルを取得したいと思います。どの方法を使用する必要がありますか?

import javax.swing.JFrame; //imports JFrame library
import javax.swing.JButton; //imports JButton library
import java.awt.GridLayout; //imports GridLayout library
import javax.swing.*;
import java.awt.event.*;
import java.util.*;

public class ButtonGrid extends JFrame implements ActionListener
{
    JFrame frame=new JFrame(); //creates frame
    JButton[][] grid; //names the grid of buttons
    public int x;
    public int y;
    public ButtonGrid(int width, int length)
    { //constructor
        char temp;
        String charput;
        frame.setLayout(new GridLayout(width,length)); //set layout
        grid = new JButton[width][length]; //allocate the size of grid
        for(int y=0; y<length; y++)
        { //start
            for(int x=0; x<width; x++) 
            {
                temp=charRand(); //get random character
                charput = ""+temp; //converts character to string
                grid[x][y]=new JButton(); //creates new button
                frame.add(grid[x][y]); //adds button to grid
                grid[x][y].addActionListener(this);
                grid[x][y].setLabel(charput); //set charput as label
            }
        }
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        frame.pack(); //sets appropriate size for frame
        frame.setVisible(true); //makes frame visible
    }
    /* generates  randomiz letter for the button of the grid*/
    public char charRand()
    {
        String consonantList = new String("BCDFGHL"); //list 1
        String consonantList2 = new String("MNPRSTWY"); //list 2
        String consonantList3= new String("JQXZVK"); //list 3
        String vowelList = new String("AEIOU"); //list of vowels
        int vowelOrConsonant; //holder of random number 
        int chosen; //selects the chosen random letter
        Random randGen = new Random(); //generates random int value
        char selected; //gets the random letter chosen by variable chosen

        vowelOrConsonant = randGen.nextInt(4);
        if (vowelOrConsonant == 0)
        {
            chosen = randGen.nextInt(5); //list of vowels
            selected = vowelList.charAt(chosen); //selects a char from vowels
        }
        else if(vowelOrConsonant == 1)
        {
            chosen = randGen.nextInt(7); //list 1
            selected = consonantList2.charAt(chosen); //selects a char
        }
        else if(vowelOrConsonant == 2)
        {
            chosen = randGen.nextInt(8); //list 2
            selected = consonantList2.charAt(chosen); //selects a char
        }
        else
        {
            chosen = randGen.nextInt(6); //list 3
            selected = consonantList.charAt(chosen);
        }
        return selected; //returns the random letter
    }

    public static void main(String[] args) 
    {
        new ButtonGrid(10,10);//makes new ButtonGrid with 2 parameters
    }

    public void actionPerformed(ActionEvent x)
    {
        /* i get wrong output on this line. 
         * i want to get the exact button that was clicked and get its label.
         */ 
        if (x.getSource()==grid[x][y])
            JOptionPane.showMessageDialog(null,x.getSource().getLabel);
    }
}
4

2 に答える 2

0

getSource()を返すObjectので、次のようににキャストする必要がありますJButton

public void actionPerformed(ActionEvent x) {
    JOptionPane.showMessageDialog(null, ((JButton)x.getSource()).getText());
}

また、getLabel()setLabel()は非推奨であり、とに置き換える必要があることに注意しgetText()てくださいsetText()

于 2012-09-09T11:21:29.997 に答える
0

Jbuttonを拡張するクラスを作成できます。そして、int(X&Y)型の2つのフィールドを追加します。コンストラクターは次のようになります。publicMyButton(int x、y);

また、グリッドを埋めるときは、Jbuttonクラスを直接使用しないでください。クラスを使用し、XとYに、使用しているサイクルの2つのiとjパラメーターを指定します。これで、ボタンにアクションリスナーを使用しているときに、グリッド上の位置を表すXおよびYフィールドを使用できます。お役に立てれば!それは私のために完全に機能し、地獄のように単純です。

于 2016-11-25T18:37:49.387 に答える