2011-10-17 125 views
0

我正在使用JTable,表中的参数正在通过哈希映射。 散列图包含2个参数。 1是关键字(字符串)&另一个是Value(即Vector)。 向量包含2个东西:第一个值(与Key对应),另一个是Character(R/W)。(读/写)。如何使JTable单元在运行时可编辑或不可编辑?

我已经通过这个HashMap.But制作了一个表格,但是我无法在运行时使用“R/W”值。 如果特定单元格包含“R”这意味着特定单元格仅可用于读取(不可编辑单元格)。 如果特定单元格包含“W”,则表示特定单元格仅可用于写入新值(可编辑单元格)。

SSCCE:

import java.awt.*; 
import java.util.*; 
import java.awt.event.*; 
import javax.swing.*; 
import java.util.HashMap; 
import java.util.Iterator; 
import java.util.Enumeration; 
import java.util.Vector; 
import java.util.List; 
import javax.swing.table.TableModel; 
import javax.swing.table.DefaultTableModel; 
import javax.swing.table.JTableHeader; 
import javax.swing.table.TableCellRenderer; 
public class DataTable extends JTable implements ActionListener,ItemListener,MouseListener 
{ 
String ReadOrWrite[][]; 
JTable table; 
public DataTable() 
{ 
    try 
    { 
     HashMap<String,String> HMap; 
     String array[][]; 
     int count = 0; 
     Vector Val; 
     JFrame frame = new JFrame("Table"); 
     JPanel panel = new JPanel(); 
     HMap = getMetaData(); 
     array = new String[HMap.size()][2]; 
     ReadOrWrite = new String[HMap.size()][2]; 
     for (Map.Entry entry : HMap.entrySet()) 
     { 
      array[count][0] = (String) entry.getKey(); 
      Val = (Vector) entry.getValue(); 
      array[count][1] = (String) Val.elementAt(0); 
      String s1 = (String) Val.elementAt(1); 
      ReadOrWrite[count][1] = s1; 
      count++; 
     } 
      String TableLabels[] = {"Field", "Values"}; 
      table = new JTable(array, TableLabels); 
      table.addMouseListener(new MouseAdapter() 
      { 
       public void mouseClicked(MouseEvent e) 
       { 
       } 
      } 
      JTableHeader header = table.getTableHeader(); 
      JScrollPane scrollPane = new JScrollPane(table); 
      panel.add(scrollPane); 
      frame.add(panel); 
      frame.add(scrollPane, BorderLayout.CENTER); 
      frame.setSize(300, 400); 
      frame.setResizable(true); 
      frame.setVisible(true); 
    } 
    catch(Exception e) 
    { 
     e.printStackTrace(); 
    } 
} 
HashMap getMetaData() 
{ 
    HashMap ta=new HashMap(); 

    Vector vec1 =new Vector(); 
    vec1.add("1"); 
    vec1.add("R"); 
    Vector vec2 =new Vector(); 
    vec2.add("2"); 
    vec2.add("W"); 
    ta.put("A",vec1); 
    ta.put("B",vec2); 
    return ta; 
} 
public void itemStateChanged(ItemEvent e) 
{ 
} 
public void actionPerformed(ActionEvent e) 
{ 
} 
public void mouseClicked(MouseEvent e) { 
} 
public void mousePressed(MouseEvent e) { 
} 
public void mouseReleased(MouseEvent e) { 
} 
public void mouseEntered(MouseEvent e) { 
} 
public void mouseExited(MouseEvent e) { 
} 

} 这是我的表的完整代码。

+0

为了更好地提供帮助,请发布[SSCCE](http://pscode.org/sscce.html)。 –

+0

PLZ查看链接,即** NOT ** SSCCE。此外,请尽力拼写单词。 (这是'请',而不是'plz') –

+0

*“我不明白如何创建这个SSCCE。”*你不明白什么?你明白这个缩写词吗? –

回答

3

如果您已经实施了自己的TableModel,则可以将isCellEditable方法定义为仅当例如返回true时才返回。第二列等于'W'

+0

那么你究竟在哪里存储R/W?如果它们不在显示的表中,但它们在数据结构中,则无论列中给出的参数是什么,仍然可以根据当前行的R/W返回true。 – Vlad

+0

您可以更具体地了解哈希映射如何传递给表?如果我记得,默认模型使用矢量矢量,所以有一些转换涉及。 – Vlad

2

为了选择性地使JTable中的某些单元格为只读,请覆盖JTable的isCellEditable()方法,并在实现中提供所需的逻辑。

如果您有自定义TableModel,那么您可以覆盖isCellEditable()

无论哪种情况,当且仅当由行和列参数指定的单元格包含'W'时,您的isCellEditable()实现才会返回true

相关问题