Jbuttonsの2D配列内の単純なActionListener
-
25-10-2019 - |
質問
さて、私はjtogglebuttonsの2D配列を作成しています。アクションリスナーを起動して行きましたが、どのボタンがどちらであるかを伝える方法はありません。
クリックすると、返すのはすべてのようなものです
javax.swing.jtogglebutton [、59,58,19x14、alignmentx = 0.0、alignmenty = 0.5、border = javax.swing.plaf.borderuireSource@53343ed0、flags = 296、= mismumizize =、defaulredssize =、defaustredsize =、flomsize =、flagsize =、flagsize =、mismumsize = 、disabledicon =、disabledselectedicon =、margin = javax.swing.plaf.insetsuiresource [top = 2、left = 14、bottom = 2、right = 14]、paintborder = true、paintfocus = true、pressedicon =、lolloveredabled = false、false、lollovericon =、rolloverselectedicon =、selectedicon =、text =
とにかく、ボタンオブジェクトに何らかのアイテムまたは番号を貼り付けて、各ボタンを関連付けることができますか?そして、ボタンをクリックすると、そのアイテムまたはそれに与えられた番号を取得できますか?
これが私のボタンジェネレーターコードです。 (どのようにして、「int l」を作成し(およびカウント)、各ボタンを作成すると、呼び出されると、その数またはそれらの線に沿って何かを返します。
JToggleButton buttons[][] = new JToggleButton[row][col];
int l = 0;
for (int i = 0; i < row; i++) {
for (int j = 0; j < col; j++) {
buttons[i][j] = new JToggleButton("");
buttons[i][j].setSize(15,15);
buttons[i][j].addActionListener(new e());
panel.add(buttons[i][j]);
l++;
}
}
ActionListner
public class e implements ActionListener {
@Override
public void actionPerformed(ActionEvent e) {
Object source = e.getSource();
System.out.println(source);
}
}
変数「ソース」はデータを取得するために使用するものです。そのため、ボタンがクリックされると、「ソース」(一意のボタンの一意の値として)を介してどのようにint lを返すことができますか?
ありがとう、-austin
解決
非常に簡単な方法は、jcomponentにclientPropertyを追加し、定義にループに追加することです。
buttons[i][j].putClientProperty("column", i);
buttons[i][j].putClientProperty("row", j);
buttons[i][j].addActionListener(new MyActionListener());
名前を変更します e
に MyActionListener
その内容を変更します
public class MyActionListener implements ActionListener {
@Override
public void actionPerformed(ActionEvent e) {
JToggleButton btn = (JToggleButton) e.getSource();
System.out.println("clicked column " + btn.getClientProperty("column")
+ ", row " + btn.getClientProperty("row"));
}
編集:
為に MinerCraft
クローンは、onyを実装する必要はありません リスナー, 、についてしかありません アイコン, 、このコードで(リスナーのいずれも実装しないでください。
import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
public class ButtonsIcon extends JFrame {
private static final long serialVersionUID = 1L;
private Icon errorIcon = UIManager.getIcon("OptionPane.errorIcon");
private Icon infoIcon = UIManager.getIcon("OptionPane.informationIcon");
private Icon warnIcon = UIManager.getIcon("OptionPane.warningIcon");
public static void main(String[] args) {
SwingUtilities.invokeLater(new Runnable() {
@Override
public void run() {
ButtonsIcon t = new ButtonsIcon();
}
});
}
public ButtonsIcon() {
setLayout(new GridLayout(2, 2, 4, 4));
JButton button = new JButton();
button.setBorderPainted(false);
button.setBorder(null);
button.setFocusable(false);
button.setMargin(new Insets(0, 0, 0, 0));
button.setContentAreaFilled(false);
button.setIcon((errorIcon));
button.setRolloverIcon((infoIcon));
button.setPressedIcon(warnIcon);
button.setDisabledIcon(warnIcon);
add(button);
JButton button1 = new JButton();
button1.setBorderPainted(false);
button1.setBorder(null);
button1.setFocusable(false);
button1.setMargin(new Insets(0, 0, 0, 0));
button1.setContentAreaFilled(false);
button1.setIcon((errorIcon));
button1.setRolloverIcon((infoIcon));
button1.setPressedIcon(warnIcon);
button1.setDisabledIcon(warnIcon);
add(button1);
button1.setEnabled(false);
final JToggleButton toggleButton = new JToggleButton();
toggleButton.setIcon((errorIcon));
toggleButton.setRolloverIcon((infoIcon));
toggleButton.setPressedIcon(warnIcon);
toggleButton.setDisabledIcon(warnIcon);
toggleButton.addItemListener(new ItemListener() {
@Override
public void itemStateChanged(ItemEvent e) {
if (toggleButton.isSelected()) {
} else {
}
}
});
add(toggleButton);
final JToggleButton toggleButton1 = new JToggleButton();
toggleButton1.setIcon((errorIcon));
toggleButton1.setRolloverIcon((infoIcon));
toggleButton1.setPressedIcon(warnIcon);
toggleButton1.setDisabledIcon(warnIcon);
toggleButton1.addItemListener(new ItemListener() {
@Override
public void itemStateChanged(ItemEvent e) {
if (toggleButton1.isSelected()) {
} else {
}
}
});
add(toggleButton1);
toggleButton1.setEnabled(false);
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
pack();
setVisible(true);
}
}
他のヒント
各リスナーに行と列データを追加するだけです。明示的なコンストラクターを追加できますが、少しの方法を追加することをお勧めします(後でさらに追加する可能性があります)。
buttons[i][j].addActionListener(e(i, j));
...
private ActionListener e(final int i, final int j) {
return new ActionListener() {
// i and j available here
...
(JDK8では、ラムダを使用して構文のクラッターを減らすことができるはずです。)
そして、より良い名前で名前を変更します。
私はMinesweeperゲームを作り、同様の問題に遭遇しました。あなたがそれを行うことができる唯一の方法の1つは、クリックされたボタンの絶対的な位置を取得し、それをボタン間でxとyで分割することです。
if ((e.getComponent().getX() != (randx) * 25 && e.getComponent().getY() != (randy) * 25) &&bomb[randx][randy] == false) {
このコードは、エリアに爆弾があるかどうかを確認することでした。そこで、爆弾の位置に25 xとyの違いがありました。それはあなたにこれを行う方法についての一般的なアイデアを与えるだけです。
私は信じています:(左側のx -x間隔) /バッファ-1は機能します。
'e.getSource()'の代わりに、いつでも「e.getActionCommand()」を呼び出すことができます。各ボタンについて、次のことを指定できます。
JButton button = new JButton("Specify your parameters here"); /*you get these from getActionCommand*/
button.setText("title here"); /*as far as I remember*/