2016-04-05 14 views
0

カスタムレンダラーを使用して、個々のセルの背景を指定の画像に設定しようとしています。この場合、私はチェス盤の木製の四角形を与えています。ここでJTableセルのアイコンが誤って表示される

は、それが前のようになります。

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

ここでは、その後、次のようになります。

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

EDIT:少しの実験では、それはすべての正方形のようです木のアイコンが与えられます。作品はまだ、この結果として、移動することができます。私のコードでは

を(私は2つの以上のリンクを投稿することができないため、コメントに入れて)、私は単にsetIcon(wood)setBackground(darkSquare)を交換しました。

@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

このジョブにレンダラーを使用しないで、アイコン/ ImageIconをXxxTableModelに格納し、次にXxxRendererがモデルおよびバックグラウンドから画像をペイントする必要がありますチェス盤の – mKorbel

答えて

0

すべての正方形が木材のアイコンを与えているようです。

レンダラは最後の状態を記憶しています。

ので、多分何かのように:あなたは、バックグラウンドのために2個のアイコン、1をレンダリングしたいと思うでしょうとして木の上のチェスの駒を表示したいときあなたはまだ問題を抱えているだろうもちろん

// 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/JLabelのグリッドでJPanelを使用して木の四角形を表す方が簡単かもしれません。次に、チェスのアイコンのアイコンが付いたJLabelを四角に追加します。この簡単な投稿Chess Boardはあなたにいくつかのアイデアを提供するかもしれません。

編集:それは印刷だようにセルに見える理由

それは次のようになり...?

おそらく。 JLabelのデフォルトは、アイコンの後ろにテキストを表示することです。

あなたは使用して、この動作を変更することができます

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

をあなたのレンダラのコンストラクタで。次に、テキストがアイコンの中央に配置されます。

+0

イメージをセルの背景にペイントする代わりに、指定されたイメージで塗りつぶすことは可能ですか? JLabelのグリッドがどのようにうまく機能するかを見ることができます(以前はこれまでと同じように考えていました)。しかし、JTableがすでに使用しているように使いやすくする方法がわかりません。 – Zulfe

+0

テーブルのセルをペイントするのはレンダラーの仕事です。セルをペイントする必要があるときはいつでも、テーブルはレンダラーを呼び出します。 – camickr

+0

アイコンを設定すると、セルに保存されているテキストが上書きされますか?それはなぜ細胞がそれが '...'のように見えるのでしょうか?イメージのテキスト表現は、ピースを表現するために使用される文字に連結されているので、 '... 'で省略された長い文字列でセルを埋めますか? – user5705019

関連する問題