2016-04-05 11 views
0

Ich versuche, einen benutzerdefinierten Renderer zu verwenden, um den Hintergrund einzelner Zellen für ein bestimmtes Bild festzulegen. In diesem Fall gebe ich einem Schachbrett Holzquadrate.Symbol in JTable-Zelle, die Fehlausgabe verursacht

Hier ist, wie es aussieht vor:

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

Hier ist, wie es danach aussieht:

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

EDIT: Mit ein wenig Experimentieren, scheint es, dass jeder Platz ist das Holz-Symbol gegeben. Stücke können noch verschoben werden, resultierend in diesem: (setzen Sie es in die Anmerkungen, weil ich mehr als 2 Verbindungen nicht bekannt geben kann)

In meinem Code, ich habe nur die setBackground(darkSquare) durch setIcon(wood) ersetzt.

@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

Verwenden Sie den Renderer nicht für diesen Job, Icon/ImageIcon sollte im XxxTableModel gespeichert werden, dann ist XxxRenderer dafür verantwortlich, das Image vom Modell und Backgroung zu malen des Schachbretts – mKorbel

Antwort

0

es scheint, dass jedes Quadrat das Holz Symbol gegeben wird.

Der Renderer merkt sich seinen letzten Status.

Also vielleicht so etwas wie:

// 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); 

Natürlich können Sie immer noch ein Problem haben, wenn Sie eine Schachfigur auf dem Holz anzeigen möchten, wie Sie zwei Symbole machen wollen, eine für den Hintergrund und eins für die Schachfigur.

Ich bin mir nicht sicher, ob eine JTable die beste Komponente dafür ist. Es könnte einfacher sein, ein JPanel mit einem Raster von JPanel/JLabel zu verwenden, um das Holzquadrat darzustellen. Dann fügen Sie ein JLabel mit einem Symbol der Schachfigur zum Quadrat hinzu. Dieser Beitrag von einem einfachen Chess Board könnte Ihnen einige Ideen geben.

Edit:

Wäre das, warum die Zelle sieht aus wie es Druck ist ...?

Wahrscheinlich. Der Standardwert für ein JLabel ist das Symbol, gefolgt vom Text.

können Sie dieses Verhalten ändern, indem Sie:

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

im Konstruktor Ihrer Renderer. Dann wird der Text über dem Symbol zentriert.

+0

Ist es möglich, das Bild einfach auf den Hintergrund der Zelle zu malen, anstatt es mit einem bestimmten Bild zu füllen? Ich kann sehen, wie das Raster von JLabels besser funktionieren würde (und ich habe sogar darüber nachgedacht, es vorher zu tun), aber ich bin mir nicht sicher, wie es so einfach zu verwenden ist wie das JTable bereits ist. – Zulfe

+0

Es ist die Aufgabe des Renderers, die Zelle der Tabelle zu zeichnen. Die Tabelle ruft den Renderer immer dann auf, wenn die Zelle neu gezeichnet werden muss. – camickr

+0

Also durch das Setzen des Symbols überschreibe ich den Text in der Zelle gespeichert? Wäre das der Grund, warum die Zelle aussieht, als würde sie "..." drucken? Wird die Textdarstellung des Bildes mit dem Zeichen verkettet, das zur Darstellung des Stücks verwendet wurde, und so die Zelle mit einer langen Zeichenfolge gefüllt, die mit "..." abgekürzt wird? – user5705019