1

さて、JToggleButtons の 2 次元配列を作成しています。アクションリスナーを起動しましたが、どのボタンがどれであるかを知る方法がありません。

1つをクリックすると、返されるのは次のようなものだけです

javax.swing.JToggleButton[,59,58,19x14,alignmentX=0.0,alignmentY=0.5,border=javax.swing.plaf.BorderUIResource$CompoundBorderUIResource@53343ed0,flags=296,maximumSize=,minimumSize=,preferredSize=,defaultIcon= ,disabledIcon=,disabledSelectedIcon=,margin=javax.swing.plaf.InsetsUIResource[上=2,左=14,下=2,右=14],paintBorder=true,paintFocus=true,pressedIcon=,rolloverEnabled=false,rolloverIcon =,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++;

            }
        }

アクションリスナー

public class e implements ActionListener {

    @Override
    public void actionPerformed(ActionEvent e) {
        Object source = e.getSource();
        System.out.println(source);
    }

}

変数「ソース」はデータを取得するために使用するものですが、ボタンがクリックされたときに「ソース」を介して (クリックされた一意のボタンの一意の値として) int l を返すにはどうすればよいですか?

ありがとう - オースティン

4

4 に答える 4

3

非常に簡単な方法は、ClientProperty を JComponent に追加し、定義をループに追加することです。

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"));
}

編集:

MinerCraftclone はListenersのいずれかを実装する必要がないため、 Iconについてのみあります。このコードでそれを見つけてください (Listeners を実装しないで、使用された ItemListener を削除してください)。

ここに画像の説明を入力

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);
    }
}
于 2012-02-15T20:28:33.273 に答える
1

行と列のデータを各リスナーに追加するだけです。明示的なコンストラクターを追加することもできますが、小さなメソッドを追加することをお勧めします (後でさらに追加される可能性があります)。

            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 では、ラムダを使用して構文の煩雑さを軽減できるはずです。)

そして、それをより良い名前に変更します。

于 2012-02-15T20:47:16.907 に答える
0

私は掃海艇ゲームを作成し、同様の問題に遭遇しました。あなたがそれを行うことができる唯一の方法の1つは、クリックされたボタンの絶対位置を取得し、それをボタン間のxとyで割ることです。

if ((e.getComponent().getX() != (randx) * 25 && e.getComponent().getY() != (randy) * 25) &&bomb[randx][randy] == false) {

このコードは、その地域に爆弾があるかどうかを確認するためのものでした。したがって、爆弾の位置には x と y の差が 25 ありました。これは、これを行う方法に関する一般的なアイデアを提供するだけです。

私は信じています: (x - 左側の x 間隔) / buffer - 1 が機能します。

于 2012-02-15T20:15:08.587 に答える
0

「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*/
于 2012-02-15T20:17:42.007 に答える