2016-04-05 4 views
0

Я пытаюсь использовать собственный рендерер для установки фона отдельных ячеек на заданное изображение. В этом случае я даю шахматные доски деревянными квадратами.Значок в JTable Cell, вызывающем Misrendering

Вот что это выглядит как раньше:

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

Вот что он выглядит как впоследствии:

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

EDIT: С небольшим количеством экспериментов, кажется, что каждый квадрат дана деревянная икона. Pieces все еще можно перемещать, в результате чего: (помещайте его в комментарии, потому что я не могу разместить более двух ссылок)

В моем коде я просто заменил setBackground(darkSquare) на 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

не следует использовать средство визуализации для этого задания, Icon/ImageIcon следует хранить в XxxTableModel, тогда XxxRenderer несет ответственность за рисование изображения из модели и backgroung шахматной доски – mKorbel

ответ

0

, кажется, что каждый квадратный получает значок дерева.

Средство визуализации запоминает свое последнее состояние.

Так что, может быть что-то вроде:

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

Конечно, вы все еще есть проблема, когда вы хотите, чтобы отобразить шахматную фигуру на вершине дерева, как вы хотите, чтобы сделать две иконки, один для фона и один для шахматной фигуры.

Я не уверен, что JTable - лучший компонент для этого. Возможно, было бы проще использовать JPanel с сеткой JPanel/JLabel для представления деревянного квадрата. Затем вы добавляете JLabel с иконкой шахматной фигуры на квадрат. Это сообщение простой Chess Board может дать вам некоторые идеи.

Edit:

бы, что именно поэтому клетка выглядит как это печать ...?

Возможно. По умолчанию для JLabel отображается значок, за которым следует текст.

Вы можете изменить это поведение с помощью:

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

в конструкторе видеообработки. Затем текст будет центрирован над значком.

+0

Можно ли просто нарисовать изображение на фоне ячейки или заполнить его определенным изображением? Я вижу, как сетка JLabels будет работать лучше (и я даже подумал о том, чтобы делать это раньше), но я не уверен, как сделать ее такой же простой в использовании, как и JTable. – Zulfe

+0

Это задача рендеринга рисовать ячейку таблицы. Таблица вызывает средство визуализации всякий раз, когда ячейка должна быть окрашена. – camickr

+0

Итак, установив значок, я переписываю текст, хранящийся в ячейке? По этой причине ячейка выглядит так, как будто она печатает '...'? Является ли текстовое представление изображения конкатенированным символом, используемым для представления фрагмента, и тем самым заполняя ячейку длинной строкой, сокращенно «...»? – user5705019