2012-06-04 2 views
1

Это проблема, которая меня раздражает уже 3 дня. Мне нужно переписать пользовательский интерфейс маленькой тиктакто (Gomoku of n x n). проблема заключается в том, что когда я создал графический интерфейс swing, я создал новый класс, который наследует свойства JButton и добавляет int для строк и int для столбцов. Я не могу сделать это с помощью SWT (без наследования). есть ли способ добавить значения i и j к кнопке.SWT Button Grid

Вот пример Свинг:

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

Даю I и J для класса игры, которые дают его к столу CLAS, чтобы проверить ход.

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

Я вижу два решения:

  • метод УстановитьДанные использовать кнопки (определенный в суперкласс виджета), чтобы связать объект, содержащий ваш х и у (вы» ll нашел эти данные в объекте события, предоставленном вашему слушателю)
  • использовать разные слушатели для каждой кнопки

В вашем случае первое решение кажется наиболее естественным. Это означает создание класса удерживающую х и у (назовем его Cell), и делать

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

и в вас Listener с помощью

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

+1 - Мне нравится setData() лучше всего из них. –

+0

@ AndyThomas-Cramer Вы - джентльмен –

+0

Итак, я использовал setData(), дал мне ошибку, что метод move (int, int) в типе Game не применим для аргументов (Object, Object), тогда i использовал (string) cast и parseint, чтобы сделать int, и это дает мне: java.lang.Integer нельзя отнести к java.lang.String –

0

Варианты включают в себя:

  • Подкласс Баттона, и переопределить его метод checkSubclass(), чтобы указать, что вы несете ответственность за неклассифицирование.
  • Сделайте каждую кнопку композитной, что позволяет подклассифицировать и поместить кнопку в композитный.
  • Сделайте отдельный прослушиватель для каждой кнопки.
  • В одном прослушивателе выполните поиск по кнопке «Титл» для кнопки, которая вызывает слушателя.
Смежные вопросы