2016-05-11 6 views
1

私の仕事に問題があります。そして問題によって、私はそれをどうやって行うのか全く分かりません。私は写真のように、フィールドの窓を作らなければなりません。フィールドの量(X×Y)はユーザーが設定する必要があります。各フィールドはクリックできるはずです(ボタンのように機能するはずです)。クリック後、ユーザーはいくつかの選択肢(フィールドの色や名前などを変更する必要があります)が必要です。スイングを使用しているゲームフィールド

スイングのどのコンポーネントを使用すればよいですか、チュートリアルは何ですか?私はこれまで何も見つけ出していません。

enter image description here

答えて

3

私は、任意のより多くのスイングは使用しないでください。代わりにJavaFXを強くお勧めします。しかし、私は似たようなことをしました(私の息子のためにオセロゲームを作った)。そして、ちょうどJTableを使いました。特定の色の画像のように、ほとんどのオブジェクトを表のセルオブジェクトとして設定できます。セルをクリックするためのリスナーが付属しています。

テーブルを使用してクリック可能な画像を表示するのと同じソリューションがJavaFXで機能します。スイングの私のテーブルクラスの

サンプル:

package spelmeny.table; 

import java.awt.Component; 
import java.util.Enumeration; 
import javax.swing.JLabel; 
import javax.swing.JTable; 
import javax.swing.table.DefaultTableCellRenderer; 
import javax.swing.table.DefaultTableModel; 
import javax.swing.table.TableColumn; 
import spelmeny.logik.GameModel; 
import spelmeny.style.GameStyle; 

/** 
* 
* @author stefan santesson 
*/ 
public class OthelloTable { 

JTable table; 
GameModel gameModel; 
DefaultTableModel tm; 
String[] heading = new String[]{"1", "2", "3", "4", "5", "6", "7", "8"}; 
GameStyle style; 

public OthelloTable(JTable table, GameModel gameModel, GameStyle style) { 
    this.table = table; 
    table.setRowHeight(GameStyle.CELL_SIZE); 
    this.gameModel = gameModel; 
    this.style = style; 
} 

public void setStyle(GameStyle style) { 
    this.style = style; 
} 

public void updateTable() { 
    int colCount = table.getColumnModel().getColumnCount(); 
    Object[][] tableVal = new Object[colCount][8]; 
    int[][] board = gameModel.getBoardData(); 
    for (int row = 0; row < 8; row++) { 
     for (int col = 0; col < 8; col++) { 
      tableVal[row][col] = board[row][col]; 
     } 
    } 
    for (int row = 0; row < 8; row++) { 
     for (int col = 0; col < colCount; col++) { 
      tm.setValueAt(tableVal[row][col], row, col); 
     } 
    } 
} 

public void setTable() { 
    tm = new MyTableModel(heading); 
    IconRenderer icnRenderer = new IconRenderer(); 
    int[][] board = gameModel.getBoardData(); 

    for (int row = 0; row < 8; row++) { 
     Object[] rowData = new Object[8]; 
     for (int col = 0; col < 8; col++) { 
      rowData[col] = board[row][col]; 
     } 
     tm.addRow(rowData); 
    } 

    table.setModel(tm); 
    Enumeration<TableColumn> columns = table.getColumnModel().getColumns(); 
    for (int colIndex = 0; colIndex < 8; colIndex++) { 
     TableColumn cbCol = table.getColumnModel().getColumn(colIndex); 
     cbCol.setCellRenderer(icnRenderer); 
     columns.nextElement().setPreferredWidth(GameStyle.CELL_SIZE); 
    } 
    table.setAutoResizeMode(JTable.AUTO_RESIZE_ALL_COLUMNS); 
} 

class MyTableModel extends DefaultTableModel { 

    public MyTableModel(Object[] os) { 
     super(); 
     for (Object o : os) { 
      addColumn(o); 
     } 
    } 

    @Override 
    public Class getColumnClass(int columnIndex) { 
     switch (columnIndex) { 
      default: 
       return Integer.class; 
     } 
    } 

    @Override 
    public boolean isCellEditable(int row, int col) { 
     return false; 
    } 
} 

class IconRenderer extends DefaultTableCellRenderer { 

    public IconRenderer() { 
     super(); 
    } 

    @Override 
    public void setValue(Object value) { 
     if (value instanceof Integer) { 
      switch ((Integer) value) { 
       case GameModel.BLACK: 
        setIcon(style.getBlackIcn()); 
        break; 
       case GameModel.WHITE: 
        setIcon(style.getWhiteIcn()); 
        break; 
       case GameModel.POSSIBLE: 
        setIcon(style.getPossibleIcn()); 
        break; 
       default: 
        setIcon(style.getEmptyIcn()); 
      } 
     } 

    } 

    @Override 
    public Component getTableCellRendererComponent(JTable table, Object value, boolean isSelected, boolean hasFocus, int row, int column) { 
     Object firstColumnValue = table.getValueAt(row, 0); 

     setVerticalAlignment(JLabel.TOP); 
     setValue(value); 
     setBackground(table.getBackground()); 
     setForeground(table.getForeground()); 
     return this; 
    } 
} 

}

+0

これはまさに私が探しているもののようです。 – Ravo

+0

othelloゲームのテーブルクラスを追加しました。 – Razumain

2

私はPICのように、フィールドのウィンドウをしなければなりません。

は、各フィールドがJButtonを使用

をクリックすることができるはずGridLayout

を使用してください。 ActionListenerを追加して、ボタンのマウスクリックおよびキーボードのアクティブ化を検出します。

ここでは、グリッドレイアウトとボタンの両方を使用した例を示します。Making a robust, resizable Swing Chess GUI

関連する問題