2013-10-17 2 views
2

내 셀 렌더러를 왼쪽 정렬했는데 셀 편집기를 왼쪽 정렬하는 방법은 무엇입니까? (당신의 방법보다 유연하게됩니다TableCellEditor 객체의 정렬 변경

if(getValueAt(row, column) instanceof Boolean) 

에 의해

if (column == 1) 

: 나는 세포 첫 번째 단계는이 상태를 변경하는 등

sample

import java.awt.BorderLayout; 
import javax.swing.JButton; 
import javax.swing.JCheckBox; 
import javax.swing.JFrame; 
import javax.swing.JPanel; 
import javax.swing.JTable; 
import javax.swing.JTextField; 
import javax.swing.JTree; 
import javax.swing.SwingConstants; 
import javax.swing.table.DefaultTableModel; 
import javax.swing.table.TableCellEditor; 
import javax.swing.table.TableCellRenderer; 

public class TextPaneTest extends JFrame { 

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

    public TextPaneTest() { 

     // Main panel 
     JPanel panel = new JPanel(); 
     panel.setLayout(new BorderLayout()); 

     JTable table = new JTable() { 
      @Override 
      public TableCellEditor getCellEditor(int row, int column) { 
       if (column == 1) 
       { 
        //////////////////////// 
        // What might go here // 
        //////////////////////// 
        return getDefaultEditor(Boolean.class); 
       } 
       return super.getCellEditor(row, column); 
      } 

      @Override 
      public TableCellRenderer getCellRenderer(int row, int column) { 
       if (column == 1) 
       { 
        TableCellRenderer renderer = getDefaultRenderer(Boolean.class); 
        ((JCheckBox)renderer).setHorizontalAlignment(SwingConstants.LEFT); 
        return renderer; 
       } 
       return super.getCellRenderer(row, column); 
      } 
     }; 

     String[] columnNames = {"Name", "Value"}; 
     Object[][] data = {{"one", true}, {"two", true}}; 
     DefaultTableModel model = new DefaultTableModel(data, columnNames);  
     table.setModel(model); 

     panel.add(table); 
     // Add everything to the frame 
     this.add(panel); 
     this.setSize(300, 200); 
     setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
     setVisible(true); 
    } 
} 

답변

2

중 하나를 편집 할 때 발생 boolean이 5 열에 대해 생각하면 모든 열 번호를 다시 확인하고 싶지는 않습니다. 디폴트의 ​​렌더러/에디터를 돌려 준다).

JCheckBox에서 확장 한 자체 렌더러를 만들고 Boolean 클래스의 기본 셀 렌더러로 설정하는 것이 좋습니다. getCellRenderer() 방법으로 정렬 변경을 피할 수 있습니다.

참고 기본적으로 getDefaultRenderer(Boolean.class)JCheckBox을 반환하지만 논리가 너무 JCheckBox을 반환해야한다라고 할 때 javax.swing.JTable.BooleanEditorgetDefaultEditor(Boolean.class) 반환합니다. 따라서 기본 렌더러를 캐스팅하는 것이 어느 시점에서는 문제가 될 수 있습니다. 당신은 키가 Boolean 클래스의 디폴트의 셀 에디터로 JCheckBox에서 시작하는 DefaultCellEditor 설정되어 볼 수 있듯이

JTable table = new JTable(dtm){ 
    @Override 
    public TableCellEditor getCellEditor(int row, int column) { 
     if(getValueAt(row, column) instanceof Boolean){ 
      return super.getDefaultEditor(Boolean.class); 
     } 
     return super.getCellEditor(row, column); 
    } 

    @Override 
    public TableCellRenderer getCellRenderer(int row, int column) { 
     if(getValueAt(row, column) instanceof Boolean){ 
      JCheckBox cb = (JCheckBox) getDefaultRenderer(Boolean.class); 
      cb.setHorizontalAlignment(SwingConstants.LEFT); 
      return getDefaultRenderer(Boolean.class); 
     } 

     return super.getCellRenderer(row, column); 
    } 
}; 

JCheckBox cb = new JCheckBox(); 
cb.setHorizontalAlignment(SwingConstants.LEFT); 
TableCellEditor tce = new DefaultCellEditor(cb);   
table.setDefaultEditor(Boolean.class, tce); 

:

는 나는이 방식으로 작동했다.

스크린 샷

enter image description here

SSCCE

다음은이 테스트 할 수있는 완전한 SSCCE입니다 :

import java.awt.BorderLayout; 
import java.awt.Dimension; 
import javax.swing.DefaultCellEditor; 
import javax.swing.JCheckBox; 
import javax.swing.JFrame; 
import javax.swing.JPanel; 
import javax.swing.JScrollPane; 
import javax.swing.JTable; 
import javax.swing.SwingConstants; 
import javax.swing.SwingUtilities; 
import javax.swing.table.DefaultTableModel; 
import javax.swing.table.TableCellEditor; 
import javax.swing.table.TableCellRenderer; 

public class Demo { 

    private void initGUI(){ 

     DefaultTableModel dtm = new DefaultTableModel(new Object[]{"Property", "Value"}, 0); 
     dtm.addRow(new Object[]{"Property 1", true}); 
     dtm.addRow(new Object[]{"Property 2", false}); 

     JTable table = new JTable(dtm){ 
      @Override 
      public TableCellEditor getCellEditor(int row, int column) { 
       if(getValueAt(row, column) instanceof Boolean){ 
        return super.getDefaultEditor(Boolean.class); 
       } 
       return super.getCellEditor(row, column); 
      } 

      @Override 
      public TableCellRenderer getCellRenderer(int row, int column) { 
       if(getValueAt(row, column) instanceof Boolean){ 
        JCheckBox cb = (JCheckBox) getDefaultRenderer(Boolean.class); 
        cb.setHorizontalAlignment(SwingConstants.LEFT); 
        return getDefaultRenderer(Boolean.class); 
       } 

       return super.getCellRenderer(row, column); 
      } 
     }; 

     JCheckBox cb = new JCheckBox(); 
     cb.setHorizontalAlignment(SwingConstants.LEFT); 
     TableCellEditor tce = new DefaultCellEditor(cb);   
     table.setDefaultEditor(Boolean.class, tce); 

     JScrollPane scrollPane = new JScrollPane(table); 
     scrollPane.setPreferredSize(new Dimension(300,200)); 

     JPanel content = new JPanel(new BorderLayout()); 
     content.add(scrollPane); 

     JFrame frame = new JFrame("Demo"); 
     frame.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE); 
     frame.setContentPane(content); 
     frame.pack(); 
     frame.setLocationRelativeTo(null); 
     frame.setVisible(true);   
    } 


    public static void main(String[] args) {   
     SwingUtilities.invokeLater(new Runnable() { 
      @Override 
      public void run() { 
       new Demo().initGUI(); 
      } 
     }); 
    } 

}