2016-04-05 1 views
0

J'essaie d'utiliser un moteur de rendu personnalisé pour définir l'arrière-plan des cellules individuelles sur une image donnée. Dans ce cas, je donne un carré en bois d'échiquier.Icône dans la cellule JTable provoquant une erreur de lecture

est ici à quoi il ressemble avant:

http://i.stack.imgur.com/i85nG.jpg

est ici à quoi il ressemble après:

http://i.stack.imgur.com/Ho4Q5.jpg

EDIT: Avec un peu d'expérimentation, il semble que chaque carré est donné l'icône en bois. Les pièces peuvent encore être déplacées, ce qui entraîne: (mettre dans les commentaires parce que je ne peux pas poster plus de 2 liens)

Dans mon code, j'ai simplement remplacé le setBackground(darkSquare) par setIcon(wood).

@SuppressWarnings("serial") 
public class BoardCellRenderer extends DefaultTableCellRenderer { 

    private ArrayList<Coordinate> possibleMoves = new ArrayList<Coordinate>(); 
    private ImageIcon wood = new ImageIcon("resources/images/light_square.png"); 

    @Override 
    public Component getTableCellRendererComponent(JTable table, Object value, boolean isSelected, boolean hasFocus, int row, int column) { 

     super.getTableCellRendererComponent(table, value, isSelected, hasFocus, row, column); 

     setHorizontalAlignment(SwingConstants.CENTER); 

     Color darkSquare = new Color(125, 125, 125); 

     //pattern for the chessboard look 
     if(row % 2 == 0 && column % 2 == 1) 
      setBackground(darkSquare); 
      //setIcon(wood); 
     else if(row % 2 == 1 && column % 2 == 0) 
      setBackground(darkSquare); 
      //setIcon(wood); 
     else 
      setBackground(Color.WHITE); 

     for(Coordinate move : possibleMoves) 
      if(column == move.getX() && row == move.getY()){ 
       setBackground(new Color(255, 51, 51, 50)); 
       System.out.println("Highlighting (" + row + ", " + column + ")"); 
      } 

     if(hasFocus){ 
      setBorder(new MatteBorder(2, 2, 2, 2, Color.RED)); 
      System.out.println("hasFocus [array]: " + row + ", " + column); 
      System.out.println("hasFocus [coordinate]: " + column + ", " + row); 
     } 
     if(isSelected) 
      setBorder(new MatteBorder(2, 2, 2, 2, Color.BLUE)); 


     return this; 
    } 

    public void setPossibleMoves(ArrayList<Coordinate> possibleMoves){ 
     this.possibleMoves = possibleMoves; 
    } 
} 
+0

http://i.stack.imgur.com/ZZw7r.jpg – user5705019

+0

ne pas utiliser de moteur de rendu pour ce travail, Icon/ImageIcon doit être stocké dans le XxxTableModel, puis XxxRenderer est responsable de la peinture de l'image à partir du modèle et de backgroung de l'échiquier – mKorbel

Répondre

0

il semble que chaque carré est donnée sur l'icône du bois.

Le moteur de rendu se souvient de son dernier état.

Alors peut-être quelque chose comme:

// set the default values 

setBackground(Color.WHITE); 
setIcon(null); 

if(row % 2 == 0 && column % 2 == 1) 
    //setBackground(darkSquare); 
    setIcon(wood); 
else if(row % 2 == 1 && column % 2 == 0) 
    //setBackground(darkSquare); 
    setIcon(wood); 

Bien sûr, vous aurez toujours un problème lorsque vous souhaitez afficher une pièce d'échecs sur le dessus du bois que vous voulez rendre deux icônes, une pour l'arrière-plan et un pour la pièce d'échecs.

Je ne suis pas sûr si un JTable est le meilleur composant à utiliser pour cela. Il pourrait être plus facile d'utiliser un JPanel avec une grille de JPanel/JLabel pour représenter le carré de bois. Ensuite, vous ajoutez un JLabel avec une icône de la pièce d'échecs au carré. Cette publication d'un simple Chess Board pourrait vous donner quelques idées.

Edit:

Serait-ce la raison pour laquelle la cellule ressemble à c'est l'impression ...?

Probablement. La valeur par défaut pour un JLabel est d'afficher l'icône suivie du texte.

Vous pouvez modifier ce comportement en utilisant:

setHorizontalTextPosition(JLabel.CENTER); 
setVerticalTextPosition(JLabel.CENTER); 

dans le constructeur de votre moteur de rendu. Ensuite, le texte sera centré sur l'icône.

+0

Est-il possible de simplement peindre l'image sur le fond de la cellule plutôt que de la remplir avec une image désignée? Je peux voir comment la grille de JLabels fonctionnerait mieux (et j'ai même envisagé de le faire avant), mais je ne suis pas sûr de savoir comment le rendre aussi facile à utiliser que le JTable est déjà. – Zulfe

+0

C'est le travail du moteur de rendu de peindre la cellule de la table. La table appelle le rendu chaque fois que la cellule doit être peinte. – camickr

+0

Donc, en réglant l'icône, j'écrase le texte stocké dans la cellule? Serait-ce la raison pour laquelle la cellule a l'air d'imprimer? ... '? Est-ce que la représentation textuelle de l'image est concaténée au caractère utilisé pour représenter la pièce et remplit ainsi la cellule avec une longue chaîne qui est abrégée par '...'? – user5705019