私は GridBagLayout で JFrame を使用しており、特定の x、y 座標からコンポーネント (私の場合は JButton) を取得できるようにしたいと考えています。そもそもGridBagConstraintsでx、y座標を与えたので、これは可能ではないでしょうか?
これを行う簡単な方法はありますか?
私は GridBagLayout で JFrame を使用しており、特定の x、y 座標からコンポーネント (私の場合は JButton) を取得できるようにしたいと考えています。そもそもGridBagConstraintsでx、y座標を与えたので、これは可能ではないでしょうか?
これを行う簡単な方法はありますか?
特定のx、y座標からコンポーネント(私の場合はJButton)を取得できるようにしたい。
event.getSource()
ActionListenerコードでは、ActionEventのメソッドを使用してクリックしたボタンを取得できます。getParent()
、コンポーネントのメソッドを使用して親コンテナを取得できます。getLayout()
次に、コンテナのメソッドを使用してレイアウトマネージャを取得できます。getContraints()
メソッドを使用してコンポーネントの制約を賭けることができます。必要な JFrame の x、y 座標がわかっている場合は、GridBagLayout の location() メソッドを使用してセル (GridBagConstraints の x、y) を見つけることができます。GridBagLayout の x、y がわかれば、JFrame のコンポーネントを繰り返し処理し、GridBagConstraints で同じ x、y を持つものを見つけて、メソッド getConstraints(Component comp) で指定された Constraints と比較します。
GridBagLayout APIを見てください。
これは、あなたが探しているものを達成する少しばかげた例です。それがあなたの助けになることを願っています...
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();
}
});
}
}