web-dev-qa-db-ja.com

GridLayout内の要素のXおよびYインデックスを取得する方法?

私はa Javaチュートリアルを勉強していて、GridLayout内のJButtonのx/yインデックスを見つける方法は、レイアウトとチェックに関連付けられているボタンbの2次元配列をトラバースすることであることを見ましたもし

b[i][j] == buttonReference

  @Override
  public void actionPerformed(ActionEvent ae) {
    JButton bx = (JButton) ae.getSource();
    for (int i = 0; i < 5; i++)
      for (int j = 0; j < 5; j++)
        if (b[i][j] == bx)
        {
          bx.setBackground(Color.RED);
        }
  }

ボタンのX/Yインデックスを取得する簡単な方法はありますか?

何かのようなもの:

JButton button = (JButton) ev.getSource();
int x = this.getContentPane().getComponentXIndex(button);
int y = this.getContentPane().getComponentYIndex(button);

thisはGameWindowインスタンスであり、evはユーザーがボタンを押したときにトリガーされるActionEventです。

この場合、次のようになります:x == 2、y == 1

@ GameWindow.Java:

package javaswingapplication;

import Java.awt.Color;
import Java.awt.GridLayout;
import Java.awt.event.*;
import javax.swing.*;

public class GameWindow extends JFrame implements ActionListener
{
  JButton b[][] = new JButton[5][5];

  int v1[] = { 2, 5, 3, 7, 10 };
  int v2[] = { 3, 5, 6, 9, 12 };

  public GameWindow(String title)
  {
    super(title);

    setLayout(new GridLayout(5, 5));
    setDefaultCloseOperation(EXIT_ON_CLOSE );

    for (int i = 0; i < 5; i++)
      for (int j = 0; j < 5; j++)
      {
        b[i][j] = new JButton();
        b[i][j].addActionListener(this);
        add(b[i][j]);
      }
  }

  @Override
  public void actionPerformed(ActionEvent ae) {
    ((JButton)ae.getSource()).setBackground(Color.red);
  }
}

@ JavaSwingApplication.Java:

package javaswingapplication;

public class JavaSwingApplication {
  public static void main(String[] args) {
    GameWindow g = new GameWindow("Game");
    g.setVisible(true);
    g.setSize(500, 500);
  }
}
16

この例は、グリッド上の位置を知っているグリッドボタンを作成する方法を示しています。メソッドgetGridButton()は、グリッド座標に基づいてボタン参照を効率的に取得する方法を示し、アクションリスナーは、クリックされたボタンと見つかったボタンが同一であることを示します。

GridButtonPanel

package gui;

import Java.awt.EventQueue;
import Java.awt.GridLayout;
import Java.awt.event.ActionEvent;
import Java.awt.event.ActionListener;
import Java.util.ArrayList;
import Java.util.List;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JPanel;

/**
 * @see http://stackoverflow.com/questions/7702697
 */
public class GridButtonPanel {

    private static final int N = 5;
    private final List<JButton> list = new ArrayList<JButton>();

    private JButton getGridButton(int r, int c) {
        int index = r * N + c;
        return list.get(index);
    }

    private JButton createGridButton(final int row, final int col) {
        final JButton b = new JButton("r" + row + ",c" + col);
        b.addActionListener(new ActionListener() {

            @Override
            public void actionPerformed(ActionEvent e) {
                JButton gb = GridButtonPanel.this.getGridButton(row, col);
                System.out.println("r" + row + ",c" + col
                    + " " + (b == gb)
                    + " " + (b.equals(gb)));
            }
        });
        return b;
    }

    private JPanel createGridPanel() {
        JPanel p = new JPanel(new GridLayout(N, N));
        for (int i = 0; i < N * N; i++) {
            int row = i / N;
            int col = i % N;
            JButton gb = createGridButton(row, col);
            list.add(gb);
            p.add(gb);
        }
        return p;
    }

    private void display() {
        JFrame f = new JFrame("GridButton");
        f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        f.add(createGridPanel());
        f.pack();
        f.setLocationRelativeTo(null);
        f.setVisible(true);
    }

    public static void main(String[] args) {
        EventQueue.invokeLater(new Runnable() {

            @Override
            public void run() {
                new GridButtonPanel().display();
            }
        });
    }
}
19
trashgod

すべてのJButtonの配列を保存しました。あなたはae.getSource()を検索することができ、あなたはそのポジションを持っています。

for (int i = 0; i < 5; i++) {
  for (int j = 0; j < 5; j++) {
    if( b[i][j] == ae.getSource() ) { 
      // position i,j
    }
  }
}
9
MasterCassim

JButtonsから

  • JButton#setName(String);

  • JBUtton#setActionCommand(String);

  • JBUtton#setAction(Action);

コンテナから/へ

SwingUtilities#convert ...

SwingUtilities#getDeepestComponentAt

5
mKorbel

このソリューションは、それらのようなすべてのオブジェクトを選択します
テキストを取得する最初の書き込みメソッド、またはJbuutonまたはjlableに必要なすべてのもの、またはコードの下での2番目の変更

public class Event_mouse implements MouseListener {

    @Override
    public void mouseReleased(MouseEvent e) {
        try {
            Everything source = (Everything) e.getSource();
             if(Everything.gettext==gol){

             }

        } catch (Exception ee) {
            JOptionPane.showMessageDialog(null, ee.getMessage());

    }

}
1

SetName()を使用して、作成時にJButton内にその位置(例:button.setName(i + "" + j);)を格納できます。その後、button.getName()から取得した文字列をスペースの周りで分割することにより、それにアクセスできます。これは特に効率的な方法ではありませんが、あなたが探している(または今までは探していた)ものに少し似ています。

1
RSDB