2013-04-12 111 views
2

因此,我有一个带有复选框的JTable。我希望复选框在“检查”时包含一个图像,在“未选中”时显示另一个图像(即,显示图像而不是选中或未选中的框)。有没有办法做到这一点?我试图用TableCellRenderer与一个ImageIcon返回一个JLabel,但它不是非常有效。Java Swing,试图用图像图标复选框替换JTable中的布尔值复选框

更具体地,当箱被选中还是未选中的右图像是有的,但是当用户正在改变的复选框的状态(当鼠标向下)核对原件/未选中的图像出现

这是我试过的TableCellRenderer(我也有JPanels尝试过,但,这是无效的,以及

public class CrassusEventTableCellEyeRenderer extends JCheckBox implements TableCellRenderer { 

    static Icon greyEye; 
    static Icon blackEye; 

    {//STATIC CODE BLOCK 
     try { 
      greyEye = new ImageIcon(ImageIO.read(new File("icons/shittyTest.png"))); 

      blackEye = new ImageIcon(ImageIO.read(new File("icons/blackEye.png"))); 
     } catch (IOException e) { 
      greyEye = null; 
      blackEye = null; 
     } 
    } 

    public CrassusEventTableCellEyeRenderer(){ 
     super(); 
     this.addItemListener(new IsCheckedItemListener()); 
     setIcon(greyEye); 
    } 

//commented out code that I have tried in place of the IsCheckedItemListener 
    /* 
    @Override 
    public void setSelected(boolean sel){ 
     super.isSelected(); 
     if(sel) 
      setIcon(blackEye); 
     else 
      setIcon(greyEye); 
    } 
    */ 

    public class IsCheckedItemListener implements ItemListener{ 

     @Override 
     public void itemStateChanged(ItemEvent e) { 
      if(isSelected()) 
       setIcon(blackEye); 
      else 
       setIcon(greyEye); 
     } 

    } 

    @Override 
    public Component getTableCellRendererComponent(JTable table, Object value, boolean isSelected, boolean hasFocus, int row, int column) { 
     System.out.println("value: "+value+", row: "+row+", column: "+column); 
     if(value instanceof Boolean){ 
      setSelected(((Boolean) value).booleanValue()); 
     } 
     return this; 
    } 

} 
+0

*“我试过。” *为了更好地帮助越早,张贴[SSCCE] (http://sscce.org/)。 –

+0

'当他们被“检查”时有一个图像,而当他们“未被检查”时有另一个图像'在实现这个之后你做了什么?它只是为了好玩,或者你正在努力实现某些目标? B'coz通过查看图像,最终用户将无法识别它的含义。 – Amarnath

+0

@Che在我们的界面中没有足够的空间用于复选框的描述;我还会尝试在鼠标悬停的光标旁边获取说明。认为在照相馆层接口的“眼睛”和“锁定” –

回答

2

你需要提供你自己的自定义TableCellRenderer能够提供你想要的功能......

enter image description here

:使用以下资源

问题answeared

import java.awt.BorderLayout; 
import java.awt.Component; 
import java.awt.Dimension; 
import java.awt.EventQueue; 
import java.io.IOException; 
import java.util.logging.Level; 
import java.util.logging.Logger; 
import javax.imageio.ImageIO; 
import javax.swing.ImageIcon; 
import javax.swing.JCheckBox; 
import javax.swing.JFrame; 
import javax.swing.JPanel; 
import javax.swing.JScrollPane; 
import javax.swing.JTable; 
import javax.swing.UIManager; 
import javax.swing.UnsupportedLookAndFeelException; 
import javax.swing.table.AbstractTableModel; 
import javax.swing.table.TableCellRenderer; 
import javax.swing.table.TableModel; 

public class TestTableRenderer { 

    public static void main(String[] args) { 
     new TestTableRenderer(); 
    } 

    public TestTableRenderer() { 
     EventQueue.invokeLater(new Runnable() { 
      @Override 
      public void run() { 
       try { 
        UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName()); 
       } catch (ClassNotFoundException | InstantiationException | IllegalAccessException | UnsupportedLookAndFeelException ex) { 
       } 

       JFrame frame = new JFrame("Testing"); 
       frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
       frame.setLayout(new BorderLayout()); 
       frame.add(new TestPane()); 
       frame.pack(); 
       frame.setLocationRelativeTo(null); 
       frame.setVisible(true); 
      } 
     }); 
    } 

    public class TestPane extends JPanel { 

     public TestPane() { 
      TableModel model = new AbstractTableModel() { 

       @Override 
       public int getRowCount() { 
        return 2; 
       } 

       @Override 
       public int getColumnCount() { 
        return 1; 
       } 

       @Override 
       public Object getValueAt(int rowIndex, int columnIndex) { 
        return rowIndex == 0 ? true : false; 
       } 

       @Override 
       public Class<?> getColumnClass(int columnIndex) { 
        return Boolean.class; 
       } 

      }; 
      JTable table = new JTable(model); 
      table.setDefaultRenderer(Boolean.class, new CustomBooleanCellRenderer()); 
      setLayout(new BorderLayout()); 
      add(new JScrollPane(table)); 
     } 

     @Override 
     public Dimension getPreferredSize() { 
      return new Dimension(200, 200); 
     } 
    } 

    public class CustomBooleanCellRenderer extends JCheckBox implements TableCellRenderer { 

     private ImageIcon sad; 
     private ImageIcon happy; 

     public CustomBooleanCellRenderer() { 
      try { 
       happy = new ImageIcon(ImageIO.read(getClass().getResource("/Happy.png"))); 
       sad = new ImageIcon(ImageIO.read(getClass().getResource("/Sad.png"))); 
      } catch (IOException ex) { 
       Logger.getLogger(TestTableRenderer.class.getName()).log(Level.SEVERE, null, ex); 
      } 
     } 

     @Override 
     public void setSelected(boolean selected) { 
      super.setSelected(selected); 
      if (selected) { 
       setIcon(happy); 
      } else { 
       setIcon(sad); 
      } 
     } 

     @Override 
     public Component getTableCellRendererComponent(JTable table, Object value, boolean isSelected, boolean hasFocus, int row, int column) { 
      if (value instanceof Boolean) { 
       boolean selected = (boolean) value; 
       setSelected(selected); 
      } 
      return this; 
     } 
    } 
} 

现在,你可以很容易地使用JLabelDefaultTableCellRenderer,检查Objecttrue/false并设置相应的图标...但哪来的乐趣是在;)

更新,包括编辑器...

我已经重新安排了代码稍微包括格编辑器...

public class CustomCheckBox extends JCheckBox { 

    private ImageIcon sad; 
    private ImageIcon happy; 

    public CustomCheckBox() { 
     try { 
      happy = new ImageIcon(ImageIO.read(getClass().getResource("/Happy.png"))); 
      sad = new ImageIcon(ImageIO.read(getClass().getResource("/Sad.png"))); 
     } catch (IOException ex) { 
      ex.printStackTrace(); 
     } 
    } 

    @Override 
    public void setSelected(boolean selected) { 
     super.setSelected(selected); 
     if (selected) { 
      setIcon(happy); 
     } else { 
      setIcon(sad); 
     } 
    } 

} 

public class CustomBooleanCellRenderer extends CustomCheckBox implements TableCellRenderer { 

    @Override 
    public Component getTableCellRendererComponent(JTable table, Object value, boolean isSelected, boolean hasFocus, int row, int column) { 
     if (value instanceof Boolean) { 
      boolean selected = (boolean) value; 
      setSelected(selected); 
     } 
     return this; 
    } 

} 

public class CustomBooleanCellEditor extends AbstractCellEditor implements TableCellEditor { 

    private CustomCheckBox editor; 

    public CustomBooleanCellEditor() { 
     editor = new CustomCheckBox(); 
    } 

    @Override 
    public Component getTableCellEditorComponent(JTable table, Object value, boolean isSelected, int row, int column) { 
     if (value instanceof Boolean) { 
      boolean selected = (boolean) value; 
      editor.setSelected(selected); 
     } 
     return editor; 
    } 

    @Override 
    public Object getCellEditorValue() { 
     return editor.isSelected(); 
    } 

} 

可以应用在你没有渲染器类似的方式...

table.setDefaultEditor(Boolean.class, new CustomBooleanCellEditor()); 
+0

我试过了,它和我以前一样好,但也有同样的问题。当鼠标停在复选框上时,会显示原始的已选中/未选中的框图像,尽管在选中该框后它仍能正常工作。 我很抱歉没有第一次明确说明我的问题;我编辑了问题 –

+0

问题不在于渲染器,它与编辑器 – MadProgrammer

1

你将不得不使用

isSelected 
看到

的方法如果复选框被选中或不和,你可以用一个if语句,如果它被选中你使用

checkBox.setIcon(myIcon); 

注意,ü还可以ü一个ItemListener的知道,如果任务该框是否被选中。 http://www.roseindia.net/java/example/java/swing/CustomizedCheckBox.shtml

How to check that a JCheckBox is checked?

+1

我试过了,它和我之前的一样好,但也有同样的问题。当鼠标停在复选框上时,会显示原始的已选中/未选中的框图像,尽管在选中该框后它仍能正常工作。我很抱歉没有第一次明确说明我的问题;我编辑了这个问题。 **也**,请注意,这是在TableCellRenderer中,而不仅仅是一个JCheckBox。这可能是问题的根源,我不确定 –

0

假设你有只是一个普通的JTable你可以通过设置在渲染和编辑相应的图标:

public void setIcons(Jtable table, int column, Icon icon, Icon selectedIcon) { 
    JCheckBox cellRenderer = (JCheckBox) table.getCellRenderer(0, column); 
    cellRenderer.setSelectedIcon(selectedIcon); 
    cellRenderer.setIcon(icon); 

    DefaultCellEditor cellEditor = (DefaultCellEditor) table.getCellEditor(0, column); 
    JCheckBox editorComponent = (JCheckBox) cellEditor.getComponent(); 
    editorComponent.setSelectedIcon(selectedIcon); 
    editorComponent.setIcon(icon); 
}