2010-11-29 6 views

답변

0

버튼 상태가 변경되면 사용자 정의 셀 렌더러를 추가하고 테이블에서 일부 이벤트의 대상을 다시 지정하고 셀을 다시 칠해야합니다. 그것은 악한 일이지만 더러운 일이지만 끝날 수 있습니다.

+0

위대한 사람 나는 그것을 발견 .... 당신의 도움을 많이 주셔서 감사합니다! – Jasra

0

Button Table Example에 표시된대로 JButton을 확장하고 TableCellRenderer을 구현하는 클래스를 만듭니다.

class ButtonRenderer extends JButton implements TableCellRenderer { 

    public ButtonRenderer() { 
    setOpaque(true); 
    } 

    public Component getTableCellRendererComponent(JTable table, Object value, 
     boolean isSelected, boolean hasFocus, int row, int column) { 
    if (isSelected) { 
     setForeground(table.getSelectionForeground()); 
     setBackground(table.getSelectionBackground()); 
    } else { 
     setForeground(table.getForeground()); 
     setBackground(UIManager.getColor("Button.background")); 
    } 
    setText((value == null) ? "" : value.toString()); 
    return this; 
    } 
} 

또한 열의 셀 편집기도 만들어야합니다.

class ButtonEditor extends DefaultCellEditor { 
    protected JButton button; 

    private String label; 

    private boolean isPushed; 

    public ButtonEditor(JCheckBox checkBox) { 
    super(checkBox); 
    button = new JButton(); 
    button.setOpaque(true); 
    button.addActionListener(new ActionListener() { 
     public void actionPerformed(ActionEvent e) { 
     fireEditingStopped(); 
     } 
    }); 
    } 

    public Component getTableCellEditorComponent(JTable table, Object value, 
     boolean isSelected, int row, int column) { 
    if (isSelected) { 
     button.setForeground(table.getSelectionForeground()); 
     button.setBackground(table.getSelectionBackground()); 
    } else { 
     button.setForeground(table.getForeground()); 
     button.setBackground(table.getBackground()); 
    } 
    label = (value == null) ? "" : value.toString(); 
    button.setText(label); 
    isPushed = true; 
    return button; 
    } 

    public Object getCellEditorValue() { 
    if (isPushed) { 
     // 
     // 
     JOptionPane.showMessageDialog(button, label + ": Ouch!"); 
     // System.out.println(label + ": Ouch!"); 
    } 
    isPushed = false; 
    return new String(label); 
    } 

    public boolean stopCellEditing() { 
    isPushed = false; 
    return super.stopCellEditing(); 
    } 

    protected void fireEditingStopped() { 
    super.fireEditingStopped(); 
    } 
} 

셀이 해당 열 및 셀 편집기로 ButtonEditor의 인스턴스에 대한 렌더링으로 우리는 다음 ButtonRender의 인스턴스를 설정합니다.

\\"Button" is the column name 
table.getColumn("Button").setCellRenderer(new ButtonRenderer()); 
table.getColumn("Button").setCellEditor(
    new ButtonEditor(new JCheckBox())); 

제공된 링크의 example에는 완전한 실행 가능한 예가 있습니다.

관련 문제