私はインターネットを精査しましたが、これに対する答えを見つけることができません:
Forループを使用してa1、a2などと呼ばれる36個のボタンを作成し、それぞれに一意のアクションコマンドを同時に割り当てています。
後で、actionPerformed(ActionEvent e)メソッドからボタンの名前を取得したいと思いました。
ActionCommandは簡単に作成できましたが、ボタンの名前も必要です。
どんな助けでも大歓迎です!
編集:
これが私が使用しているコードです:
String letters[] = {"0", "a", "b", "c", "d", "e", "f"};
JButton btn[] = new JButton[35];
int count = 0;
for (int f=1; f < 7;f++){
for (int i=1; i < 7;i++){
btn[i] = new JButton(letters[f]+i, cup);
System.out.println(btn[i]));
mainGameWindow.add(btn[i]);
btn[i].addActionListener(this);
String StringCommand = Integer.toString(randomArrayNum());
btn[i].setActionCommand(StringCommand);
count++;
if(count == 18){
generateArray();
}
}
}
これにより、a1-6、b1-6、c1-6などに対応する6x6グリッド用の36個のボタンが提供されます。
この方法でボタンを作成すると、ボタンを制御できないように見えます。アイコンを割り当てたり、ボタンの名前を取得したりすることはできません。
前もって感謝します。
ボタンの参照をMap
に保持します
String letters[] = {"0", "a", "b", "c", "d", "e", "f"};
JButton btn;
int count = 0;
HashMap<String,JButton> buttonCache = new HashMap<String,JButton>();
for (int f=1; f < 7;f++){
for (int i=1; i < 7;i++){
btn = new JButton(letters[f]+i, cup);
mainGameWindow.add(btn[i]);
btn.addActionListener(this);
String stringCommand = Integer.toString(randomArrayNum());
btn.setActionCommand(stringCommand);
buttonMap.put(stringCommand,btn);
count++;
if(count == 18){
generateArray();
}
}
}
次に、ActionListener
で、コマンドからボタンを元に戻します。
public void actionPerformed(ActionEvent e) {
String command = ((JButton) e.getSource()).getActionCommand();
JButton button = buttonCache.get(command);
if (null != button) {
// do something with the button
}
}
5年以上後にこの答えを再検討すると、なぜ私がHashMap
:Pを提案したのかわかりません。
このコードはまったく同じことを行い、サードパーティはありませんMap
:
String letters[] = {"0", "a", "b", "c", "d", "e", "f"};
int count = 0;
for (int f=1; f < 7;f++){
for (int i=1; i < 7;i++) {
String stringCommand = Integer.toString(randomArrayNum());
Button btn = new JButton(letters[f]+i, cup);
btn.setActionCommand(stringCommand);
btn.addActionListener(this);
mainGameWindow.add(btn[i]);
// NOTE : I have no idea what this is for...
count++;
if(count == 18){
generateArray();
}
}
}
ActionListener
..で.
public void actionPerformed(ActionEvent e) {
JButton button = (JButton) e.getSource();
String command = button.getActionCommand();
// do something with the button
// the command may help identifying the button...
}
JButton btnClear = new JButton("clear");
btnClear.addActionListener(this);
btnClear.setName("clear");
//..............
//..............
public void actionPerformed(ActionEvent e) {
JButton o = (JButton)e.getSource();
String name = o.getName();
if (name == "clear")
{
euroMillText.setText("");
}
else if (name == "eumill")
{
getLottoNumbers();
}
//JOptionPane.showMessageDialog(null,name);
}
String buttonText = ((JButton) e.getSource()).getText()
を使用してアイコンを設定できます
((JButton)actionEvent.getSource()).setIcon("imageName.png");
//to get the name of button you can use
ArrayList<String> buttonNames;
buttonNames.add("button"+f+i);
別の3つの選択肢があります
1)道具による
JButton[] buttons;
ArrayList<JButton> buttons;
ただし、ループから押されたJButton
を判別する必要があります
2)各JButton
に個別のActionListener
を追加します
myButton.addActionListener(new Java.awt.event.ActionListener() {
@Override
public void actionPerformed(Java.awt.event.ActionEvent evt) {
myButtonActionPerformed(evt);
}
private void myButtonActionPerformed(ActionEvent evt) {
// some Action
}
});
3) javax.swing.Action をJButton
に追加します
ボタンを配列に格納し、e.getSource()
を使用してボタンがどれであるかを判断します...
Private JButton[] buttons;
public void actionPerformed(ActionEvent e) {
int index = -1;
for (int i = 0; i < buttons.length; i++) {
if (e.getSource() == buttons[i]) {
index = i;
break;
}
}
if (index == -1) {
// e didn't come from the buttons
} else {
// do stuff
}
}
動作する可能性のある別のオプションは、ボタンのクライアントプロパティを使用することです。基本JComponentクラスは、任意のプロパティの設定/取得を提供します。
Object JComponent.getClientProperty(Object key)
void JComponent.putClientProperty(Object key, Object value)
したがって、コンポーネントにアプリケーション定義のプロパティ値を設定し、ActionListenerメソッド内でそのプロパティ値を問い合わせることができます(イベントのソースがJComponentであることを確認するだけです)。