2011-10-04 116 views
3

我有一个表来显示值,在此表中,用户可以选择一行,但无法更改其内容。我的代码是:使每个单元格不可编辑时JTable行可选

JTable tablaCurvas1 = new JTable(); 
    TableCellRenderer tableRender = new SubtractTableRenderer(); 
    tablaCurvas1.setDefaultRenderer(Object.class, tableRender); 
    tablaCurvas1.setModel(new DefaultTableModel(rowData, columnNames){ 
     private static final long serialVersionUID = 1L; 
    @Override 
     public boolean isCellEditable(int row, int column) { 
      return false; //So I make every cell non-editable 
     } 

    }); 

    JScrollPane scrollPane = new JScrollPane(tablaCurvas1); 
    tablaCurvas1.setFillsViewportHeight(true); 
    tablaCurvas1.setPreferredScrollableViewportSize(new Dimension(200,100)); 
    pane.add(scrollPane,c); 

但现在当我点击它们时表格行不会被选中。我怎么能解决这个问题?

回答

6

选择某行的能力无关,与给定行中编辑细胞的能力。

问题是你的SubractTableRenderer负责做突出显示。您需要在渲染器中使用类似以下代码:

@Override 
public Component getTableCellRendererComponent(
    JTable table, Object value, boolean isSelected, boolean hasFocus, int row, int column) 
{ 
    super.getTableCellRendererComponent(table, value, isSelected, hasFocus, row, column); 

    // add custom rendering code 

    if (isSelected) 
     setBackground(table.getSelectionBackground()); 
    else 
     setBackground(table.getBackground()); 

    return this; 
} 
3

JTable中实现

table.setRowSelectionAllowed(boolean); 
table.setColumnSelectionAllowed(boolean); 
table.setCellSelectionEnabled(boolean); 

例如

import java.awt.*; 
import java.util.*; 
import javax.swing.*; 
import javax.swing.table.*; 

public class MyTable { 

    public MyTable() { 
     JPanel panel = new JPanel(new BorderLayout()); 
     panel.add(new JScrollPane(createTable())); 
     JFrame frame = new JFrame("My Table"); 
     frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
     frame.getContentPane().add(panel); 
     frame.setSize(new Dimension(400, 130)); 
     frame.setVisible(true); 
    } 

    private JTable createTable() { 
     Object[][] data = {{"Nazli", "Shahi", new Date()}, 
      {"Nima", "Sohrabi", new Date()}, 
      {"Farsheed", "Tari", new Date()}, 
      {"Anousheh", "Modaressi", new Date()}}; 
     String[] columnNames = {"First Name", "Last Name", "DOB"}; 
     DefaultTableModel model = new DefaultTableModel(data, columnNames) { 

      private static final long serialVersionUID = 1L; 

      @Override 
      public Class<?> getColumnClass(int column) { 
       return getValueAt(0, column).getClass(); 
      } 

      @Override 
      public boolean isCellEditable(int row, int column) { 
       return false; 
      } 
     }; 
     JTable table = new JTable(model); 
     table.setAutoCreateRowSorter(true); 
     table.setRowSelectionAllowed(true); 
     table.setColumnSelectionAllowed(true); 
     table.setCellSelectionEnabled(true); 
     return table; 
    } 

    public static void main(String[] args) { 
     EventQueue.invokeLater(new Runnable() { 

      @Override 
      public void run() { 
       MyTable myTable = new MyTable(); 
      } 
     }); 
    } 
} 
+0

由于您的代码有效,因此我的问题在于渲染器,所以其他答案更适合我。无论如何感谢mKorbel :) –

相关问题