2016-05-11 7 views
1

Ich habe ein Problem mit meiner Aufgabe. Und nach dem Problem, ich meine, ich habe keine Ahnung, wie es geht. Ich muss ein Fenster von Feldern machen, wie auf dem Bild. Die Anzahl der Felder (X x Y) sollte vom Benutzer festgelegt werden. Jedes Feld sollte in der Lage sein zu klicken (sie sollten wie eine Schaltfläche funktionieren) und nach dem Klick sollte der Benutzer einige Auswahlmöglichkeiten haben (z. B. die Farbe des Feldes, seinen Namen usw. ändern).Spielfeld mit Swing

Irgendwelche Ratschläge, welche Komponenten von Swing sollte ich verwenden, irgendwelche Tutorials? Ich habe bisher nichts gefunden.

enter image description here

Antwort

3

benutze ich nicht mehr schwingen. Ich würde stattdessen JavaFX dringend empfehlen. Aber ich habe eine ähnliche Sache gemacht (machte ein Othello-Spiel für meinen Sohn), und dann habe ich einfach ein JTable benutzt. Sie können fast jedes Objekt als ein Tabellenzellenobjekt mit etwas Fiedeln, wie ein Bild mit einer bestimmten Farbe, einstellen, und es wird mit einem Listener zum Klicken auf Zellen geliefert.

Die gleiche Lösung funktioniert für JavaFX mit einer Tabelle zur Anzeige Ihrer anklickbaren Bilder.

Probe meiner Tabellenklasse in Swing:

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

Es sieht genauso aus wie etwas, das ich gesucht habe! – Ravo

+0

Ich habe meine Tischklasse für das Othello-Spiel hinzugefügt, für den Fall, dass Sie Teile daraus verwenden können. – Razumain

2

Ich habe ein Fenster von Feldern zu machen, wie auf dem Bild.

Verwenden Sie ein GridLayout

Jedes Feld sollte

ein JButton verwenden klicken können. Fügen Sie eine ActionListener hinzu, um Mausklicks und Tastaturaktivierung der Schaltfläche zu erkennen.

Hier ist ein Beispiel, das die Verwendung eines Rasterlayouts und von Schaltflächen zeigt: Making a robust, resizable Swing Chess GUI.