2012-06-04 49 views
1

这是一个问题,它让我烦恼了3天。 我必须重写一个tictactoe(n×n的Gomoku)游戏的UI。 问题是,当我创建了swing GUI时,我做了一个继承JButton属性的新类,并为列添加了一个int,并为列添加了一个int。我不能这样做与SWT(没有继承)。有没有办法让我把i和j的值加到按钮上。SWT按钮网格

这里是Swing中的例子:

for (int i = 0; i < rows; i++) { 
    for (int j = 0; j < cols; j++) { 
     final MyJButton button = new MyJButton(i, j); 
     button.addActionListener(new ActionListener() { 

      @Override 
      public void actionPerformed(ActionEvent e) { 
       MoveResult move = game.move(button.getRow(), button.getCol()); 
        switch (move) { 
         case ValidMove: 
          button.setBackground(game.getCurrentPlayer().getColor()); 
          game.changePlayer(); 
          break; 
        } 
       } 
      } 
     } 
    } 
} 

我给了游戏类给它一个表CLAS检查招i和j。

if (table.getElement(x, y) != PieceType.NONE) return MoveResult.InvalidMove; 
private PieceType[][] table; 

是否有办法在SWT中做同样的事情,任何迹象都欢迎。

这是我做了什么

buttonpanel = new Composite(shell, SWT.NONE); 
buttonpanel.setLayout(new org.eclipse.swt.layout.GridLayout(cols, true)); 
buttonTable = new Button[rows][cols]; 

for (int i = 0; i < rows; ++i){ 
    for (int j = 0; j < cols; ++j) { 
     gridData.heightHint = 45; 
     gridData.widthHint = 45; 

     Button button = new Button(buttonpanel, SWT.PUSH); 
     button.setLayoutData(gridData); 
     buttonTable[i][j] = button; 
     buttonTable[i][j].addSelectionListener(new buttSelectionListener());  
     // buttonpanel.pack(); 
    } 
} 

回答

2

我看到了两个解决方案:

  • 使用巴顿的SetData方法(在Widget的超类中定义)为对象包含您的X和Y联系起来(你”会发现事件对象中的数据提供给您的听众)
  • 对每个按钮使用不同的听众

就你而言,第一个解决方案似乎是最自然的解决方案。 这意味着创建类控股x和y(姑且称之为电池),和做

button.setData(new Cell(i, j)); 

,并在你的监听器使用

game.move(e.data.x, e.data.y); 
+1

+1 - 我最喜欢setData()。 –

+0

@ AndyThomas-Cramer你是一个绅士 –

+0

所以,我使用setData(),给了我一个错误,该方法移动(int,int)类型游戏不适用于参数(对象,对象),然后我使用(string)cast和parseint来创建一个int,它给了我:java.lang.Integer不能转换为java.lang.String –

0

选项包括:

  • 子类按钮,并重写它的checkSubclass()方法,以表明你正在承担不会造成不良后果的责任。
  • 使每个按钮成为一个Composite,它允许子类化,并在Composite中放置一个Button。
  • 为每个按钮设置一个单独的侦听器。
  • 在单个侦听器中,搜索调用侦听器的按钮的buttonTable。