2016-04-15 3 views
1

JTableの列にチェックボックスを追加すると成功しました。私は私のカスタムチェックボックスを使用したい、私は私のカスタムチェックボックスを拡張するためにBooleanRenderを変更し、それはworks.the問題は私がデフォルトjCheckboxデザインを表示するチェックボックスを選択し、私のcoustomチェックボックスを表示するとき、チェックボックス。 here is the question I asked beforeJTableの列でチェックボックスレンダラーが正しくありません

class BooleanRenderer extends TriCheckBox implements TableCellRenderer, UIResource { 

private static final long serialVersionUID = 1L; 
private final Border noFocusBorder = new EmptyBorder(1, 1, 1, 1); 

BooleanRenderer() { 
    super(); 
    setHorizontalAlignment(JLabel.CENTER); 
    setBorderPainted(true); 
} 

@Override 
public Component getTableCellRendererComponent(JTable table, Object value, boolean isSelected, boolean hasFocus, int row, int column) { 
    if (isSelected) { 
     setForeground(table.getSelectionForeground()); 
     super.setBackground(table.getSelectionBackground()); 
    } else { 
     setForeground(table.getForeground()); 
     setBackground(table.getBackground()); 
    } 
    setSelected(value != null && ((Boolean) value).booleanValue()); 
    if (hasFocus) { 
     setBorder(UIManager.getBorder("Table.focusCellHighlightBorder")); 
    } else { 
     setBorder(noFocusBorder); 
    } 
    return this; 
} 

}

public class TriCheckBox extends JCheckBox { 
public static ImageIcon icon =new ImageIcon("src/checkbox_off.png"); 
public static ImageIcon smallIcon = new ImageIcon(icon.getImage().getScaledInstance (12, -1, Image.SCALE_SMOOTH)); 
public static ImageIcon iconDark =new ImageIcon("src/logo.png"); 
public static ImageIcon smallIconDark = new ImageIcon(iconDark.getImage().getScaledInstance (12, -1, Image.SCALE_SMOOTH)); 
public static ImageIcon iconBrown =new ImageIcon("src/checkbox_on.png"); 
public static ImageIcon smallIconBrown = new ImageIcon(iconBrown.getImage().getScaledInstance (12, -1, Image.SCALE_SMOOTH)); 
private boolean indeterminate; 
@Override 
public void paint(Graphics g) { 
    if (isSelected()) { 
     indeterminate = false; 
    } 
    if(indeterminate){ 
     setIcon(smallIconDark); 
    }else if(isSelected()){ 
     setIcon(smallIconBrown); 
    }else{ 
     setIcon(smallIcon); 
    } 
    super.paint(g); 
} 
public boolean isIndetermainate() { 
    return indeterminate; 
} 
public void setIndetermainate(boolean indetermainate) { 
    this.indeterminate = indetermainate; 
    if (indetermainate) { 
     setSelected(false); 
     repaint(); 
    } 
} 

}

+0

1)Iがもはや気にすることができなかった問題のために[検出/ Aコードブロックの吊り近いブラケットのために固定(http://meta.stackexchange.com/q/251795/155831)参照します固定する。 2)すぐに助けを得るために、[MCVE]または[短く、自己完結型の正しい例](http://www.sscce.org/)を投稿してください。 –

+0

'public static ImageIcon icon = new ImageIcon(" src/checkbox_off.png ");' 3)アプリケーションリソースは、デプロイメント時に埋め込まれたリソースになるので、今のようにアクセスすることをお勧めします。 [タグ:埋め込みリソース]は、ファイルではなくURLでアクセスする必要があります。 [info。埋め込みリソースのページ](http://stackoverflow.com/tags/embedded-resource/info)を参照してください。 4) 'static'を使うと問題を引き起こすことがよくあります。そのMCVEを掲示する前にすべての 'static'修飾子を削除してください(上でリンク&リンク)。 –

答えて

2

まず、あなたには、いくつかの絵をしたい場合は、代わりにpaintComponent(...)メソッドをオーバーライドし、paint(...)メソッドをオーバーライドすることは良い考えではありません。

カスタムペイントをしていないので、これらの方法をオーバーライドする必要はありません。ここでは、代わりに何ができるかです:私は、チェックボックスを選択解除するとき、それは現時点ではデフォルトJCheckBoxの設計を示し、私のcoustomチェックボックスが表示されますチェックボックスは、それがまた起こるの選択時に

public class TriCheckBox extends JCheckBox { 
    .... 

    public void updateState() { 
     if (isSelected()) { 
      indeterminate = false; 
     } 
     if(indeterminate){ 
      setIcon(smallIconDark); 
     }else if(isSelected()){ 
      setIcon(smallIconBrown); 
     }else{ 
      setIcon(smallIcon); 
     } 
    } 

    public void setIndetermainate(boolean indetermainate) { 
     this.indeterminate = indetermainate; 
     if (indetermainate) { 
      setSelected(false);   
     }else{ 
      updateState(); 
     } 
    } 

    @Override 
    public void setSelected(boolean selected){ 
     updateState(); 
    } 
} 
+1

あなたは 'public void updateState(Graphics g){'を見ているかもしれませんが、それはあなたが意味するものではないと確信しています;) – MadProgrammer

+0

@MadProgrammer私はOPの 'paint(....) 'メソッドを呼び出し、そのパラメータを削除するのを忘れてしまいました。 – Titus

1

問題があります。ちょうどあなたがカスタムTableCellRendererを提供しなければならなかったという事実のようにConcepts: Editors and RenderersUsing Other Editors

を見てとることによって

スタート、あなたが追加次に、カスタムにTableCellEditor

を提供する必要があるとしています@Titusを示唆しているものを、あなたのパスにBECへ

public static ImageIcon icon =new ImageIcon("src/checkbox_off.png"); 

ニーズをsrcを参照すべきではありませんOME

public static ImageIcon icon =new ImageIcon(TriCheckBox.class.getResource("/checkbox_off.png")); 
関連する問題