1

私は GridBagLayout で JFrame を使用しており、特定の x、y 座標からコンポーネント (私の場合は JButton) を取得できるようにしたいと考えています。そもそもGridBagConstraintsでx、y座標を与えたので、これは可能ではないでしょうか?

これを行う簡単な方法はありますか?

4

3 に答える 3

3

特定のx、y座標からコンポーネント(私の場合はJButton)を取得できるようにしたい。

  1. すべてのボタンにActionListenerを追加します。
  2. event.getSource()ActionListenerコードでは、ActionEventのメソッドを使用してクリックしたボタンを取得できます。
  3. ソースがわかればgetParent()、コンポーネントのメソッドを使用して親コンテナを取得できます。
  4. getLayout()次に、コンテナのメソッドを使用してレイアウトマネージャを取得できます。
  5. GridBagLayoutを取得したら、getContraints()メソッドを使用してコンポーネントの制約を賭けることができます。
  6. 次に、x/y座標を取得できます。
于 2013-03-08T19:15:00.623 に答える
1

必要な JFrame の x、y 座標がわかっている場合は、GridBagLayout の location() メソッドを使用してセル (GridBagConstraints の x、y) を見つけることができます。GridBagLayout の x、y がわかれば、JFrame のコンポーネントを繰り返し処理し、GridBagConstraints で同じ x、y を持つものを見つけて、メソッド getConstraints(Component comp) で指定された Constraints と比較します。

GridBagLayout APIを見てください。

于 2013-03-08T18:59:56.647 に答える
0

ここに画像の説明を入力
これは、あなたが探しているものを達成する少しばかげた例です。それがあなたの助けになることを願っています...

import javax.swing.JFrame;
import javax.swing.JButton;
import javax.swing.SwingUtilities;
import java.awt.GridBagLayout;
import java.awt.GridBagConstraints;
import java.awt.Color;
import java.awt.Point;
import java.awt.Container;
import java.awt.event.ActionListener;
import java.awt.event.ActionEvent;
import java.util.Map;
import java.util.Set;
import java.util.LinkedHashMap;
class GridBagFrame extends JFrame implements ActionListener
{
    GridBagLayout gb ;
    GridBagConstraints gc;
    Map <Point,JButton> map ;
    final int SIZE = 20;
    public void createAndShowGUI()
    {
        gb = new GridBagLayout();
        gc = new GridBagConstraints();
        gc.fill = GridBagConstraints.BOTH;
        map = new LinkedHashMap<Point,JButton>();
        Container container = getContentPane();
        container.setLayout(gb);
        int x =0 , y = -1 ;
        JButton[] button = new JButton[SIZE];
        for (int i = 0 ; i < SIZE ; i++ )
        {
            button[i] = new JButton(String.valueOf(i + 1));
            if (i % 4 == 0)
            {
                x = 0 ;
                y = y +1;
            }
            gc.gridx = x++;
            gc.gridy = y;
            gb.setConstraints(button[i],gc);
            container.add(button[i]);
            map.put(new Point(x,y),button[i]);
            button[i].setActionCommand(x+","+y);
            button[i].addActionListener(this);
        }
        setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        pack();
        setResizable(false);
        setVisible(true);
    }
    @Override
    public void actionPerformed(ActionEvent evt)
    {
        resetAll();
        JButton source = (JButton)evt.getSource();
        String command = source.getActionCommand();
        String[] arr = command.split(",");
        int x = Integer.parseInt(arr[0]);
        int y = Integer.parseInt(arr[1]);
        for ( int iy = y - 1; iy <= y + 1; iy++)
        {
            for (int ix = x -1 ; ix <= x + 1 ; ix++)
            {
                JButton button = map.get(new Point(ix,iy));
                if (button != null)
                {
                    button.setForeground(Color.red);
                }
            }
        }
        source.setForeground(Color.blue);
    }
    private void resetAll()
    {
        Set<Point> pointSet = map.keySet();
        for (Point point : pointSet )
        {
            map.get(point).setForeground(Color.black);
        }
    }
    public static void main(String[] args) 
    {
        SwingUtilities.invokeLater( new Runnable()
        {
            @Override
            public void run()
            {
                GridBagFrame frame = new GridBagFrame();
                frame.createAndShowGUI();
            }
        });
    }
}
于 2013-03-08T20:56:05.147 に答える