Java 使用秋千的游戏场

Java 使用秋千的游戏场,java,swing,grid,Java,Swing,Grid,我的任务有问题。我所说的问题是,我完全不知道该怎么做。我必须做一个窗口的领域,如图。字段数量(X X Y)应由用户设置。每个字段都应该能够单击(它们应该像按钮一样工作),单击后用户应该有一些选择(例如更改字段的颜色、名称等) 有什么建议我应该使用Swing的哪些组件,有什么教程吗?到目前为止我什么也没找到 我不再使用Swing了。我强烈建议改为使用JavaFX。但我也做了类似的事情(为我儿子做了一个奥赛罗游戏),然后我就用了一个JTable。您可以通过一些微调将几乎任何对象设置为表单元格对象,例

我的任务有问题。我所说的问题是,我完全不知道该怎么做。我必须做一个窗口的领域,如图。字段数量(X X Y)应由用户设置。每个字段都应该能够单击(它们应该像按钮一样工作),单击后用户应该有一些选择(例如更改字段的颜色、名称等)

有什么建议我应该使用Swing的哪些组件,有什么教程吗?到目前为止我什么也没找到


我不再使用Swing了。我强烈建议改为使用JavaFX。但我也做了类似的事情(为我儿子做了一个奥赛罗游戏),然后我就用了一个JTable。您可以通过一些微调将几乎任何对象设置为表单元格对象,例如特定颜色的图像,并且它附带了用于单击单元格的侦听器

同样的解决方案也适用于JavaFX,它使用一个表来显示可单击的图像

Swing中我的Table类示例:

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;
    }
}
package spelmeny.table;
导入java.awt.Component;
导入java.util.Enumeration;
导入javax.swing.JLabel;
导入javax.swing.JTable;
导入javax.swing.table.DefaultTableCellRenderer;
导入javax.swing.table.DefaultTableModel;
导入javax.swing.table.TableColumn;
导入spelmeny.logik.GameModel;
导入spelmeny.style.GameStyle;
/**
*
*@作者stefan santesson
*/
公共类OthelloTable{
JTable表;
博弈模型;
模型tm;
字符串[]标题=新字符串[]{“1”、“2”、“3”、“4”、“5”、“6”、“7”、“8”};
游戏风格;
公共OthelloTable(JTable表格、GameModel GameModel、GameStyle样式){
this.table=表格;
表.setRowHeight(游戏风格、单元格大小);
this.gameModel=gameModel;
这个。风格=风格;
}
公共无效设置样式(游戏样式){
这个。风格=风格;
}
公共void updateTable(){
int colCount=table.getColumnModel().getColumnCount();
Object[]tableVal=新对象[colCount][8];
int[][]board=gameModel.getBoardData();
用于(int行=0;行<8;行++){
for(int col=0;col<8;col++){
tableVal[行][col]=板[行][col];
}
}
用于(int行=0;行<8;行++){
for(int col=0;col

}我不再使用Swing了。我强烈建议改为使用JavaFX。但我也做了类似的事情(为我儿子做了一个奥赛罗游戏),然后我就用了一个JTable。您可以通过一些微调将几乎任何对象设置为表单元格对象,例如特定颜色的图像,并且它附带了用于单击单元格的侦听器

同样的解决方案也适用于JavaFX,它使用一个表来显示可单击的图像

Swing中我的Table类示例:

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;
    }
}
package spelmeny.table;
导入java.awt.Component;
导入java.util.Enumeration;
导入javax.swing.JLabel;
导入javax.swing.JTable;
导入javax.swing.table.DefaultTableCellRenderer;
导入javax.swing.table.DefaultTableModel;
导入javax.swing.table.TableColumn;
导入spelmeny.logik.GameModel;
导入spelmeny.style.GameStyle;
/**
*
*@作者stefan santesson
*/
公共类OthelloTable{
JTable表;
博弈模型;
模型tm;
字符串[]标题=新字符串[]{“1”、“2”、“3”、“4”、“5”、“6”、“7”、“8”};
游戏风格;
公共OthelloTable(JTable表格、GameModel GameModel、GameStyle样式){
this.table=表格;
表.setRowHeight(游戏风格、单元格大小);
this.gameModel=gameModel;
这个。风格=风格;
}
公共无效设置样式(游戏样式){
这个。风格=风格;
}
公共void updateTable(){
int colCount=table.getColumnModel().getColumnCount();
对象[][]tableVal=new