Java 如何使JTable单元格在运行时可编辑或不可编辑?

Java 如何使JTable单元格在运行时可编辑或不可编辑?,java,swing,jtable,tablemodel,Java,Swing,Jtable,Tablemodel,我使用的是一个JTable,表中的参数通过哈希映射传递。 哈希映射包含2个参数。1是键(字符串),另一个是值(即向量)。 向量包含两个内容:第一个值(对应于键),另一个是字符(R/W)。(读/写) 我已经通过这个HashMap创建了一个表。但是我不能在运行时使用“R/W”值。 如果特定单元格包含“R”,则表示特定单元格仅可用于读取(不可编辑单元格)。 如果特定单元格包含“W”,则表示该特定单元格仅可用于写入新值(可编辑单元格) SSCCE: import java.awt.*; import j

我使用的是一个JTable,表中的参数通过哈希映射传递。 哈希映射包含2个参数。1是键(字符串),另一个是值(即向量)。 向量包含两个内容:第一个值(对应于键),另一个是字符(R/W)。(读/写)

我已经通过这个HashMap创建了一个表。但是我不能在运行时使用“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) {
}
import java.awt.*;
导入java.util.*;
导入java.awt.event.*;
导入javax.swing.*;
导入java.util.HashMap;
导入java.util.Iterator;
导入java.util.Enumeration;
导入java.util.Vector;
导入java.util.List;
导入javax.swing.table.TableModel;
导入javax.swing.table.DefaultTableModel;
导入javax.swing.table.JTableHeader;
导入javax.swing.table.TableCellRenderer;
公共类DataTable扩展JTable实现ActionListener、ItemListener、MouseListener
{
字符串读写[];
JTable表;
公共数据表()
{
尝试
{
HashMap-HMap;
字符串数组[];
整数计数=0;
向量Val;
JFrame=新JFrame(“表格”);
JPanel面板=新的JPanel();
HMap=getMetaData();
数组=新字符串[HMap.size()][2];
ReadOrWrite=新字符串[HMap.size()][2];
对于(Map.Entry:HMap.entrySet())
{
数组[count][0]=(字符串)项。getKey();
Val=(Vector)entry.getValue();
数组[count][1]=(字符串)Val.elementAt(0);
字符串s1=(字符串)Val.elementAt(1);
ReadOrWrite[count][1]=s1;
计数++;
}
字符串TableLabels[]={“字段”,“值”};
table=新的JTable(数组、TableLabels);
表.addMouseListener(新的MouseAdapter()
{
公共无效mouseClicked(MouseEvent e)
{
}
}
JTableHeader=table.getTableHeader();
JScrollPane scrollPane=新的JScrollPane(表);
panel.add(滚动窗格);
框架。添加(面板);
frame.add(滚动窗格,BorderLayout.CENTER);
框架。设置尺寸(300400);
frame.setresizeable(true);
frame.setVisible(true);
}
捕获(例外e)
{
e、 printStackTrace();
}
}
HashMap getMetaData()
{
HashMap ta=新的HashMap();
向量vec1=新向量();
vec1.添加(“1”);
vec1.添加(“R”);
向量vec2=新向量();
2.添加(“2”);
vec2.添加(“W”);
ta.put(“A”,vec1);
ta.put(“B”,向量2);
返回ta;
}
公共无效itemStateChanged(ItemEvent e)
{
}
已执行的公共无效操作(操作事件e)
{
}
公共无效mouseClicked(MouseEvent e){
}
公共无效鼠标按下(MouseEvent e){
}
公共无效MouseEvent(MouseEvent e){
}
公共无效鼠标事件(鼠标事件e){
}
公共无效mouseExited(MouseEvent e){
}
}
这是我表格的完整代码。

如果您已经实现了自己的,那么只有当第二列等于'W'时,您才能定义返回true的方法。如果您已经实现了自己的,那么只有当第二列等于'W'

时,您才能定义返回true的方法为了有选择地使某些单元格成为只读,请重写JTable的方法,并在实现中提供所需的逻辑

如果您有一个自定义,您可以替代它


在任何一种情况下,isCellEditable()的实现都应该返回
true
当且仅当行和列参数指定的单元格包含“W”时。

为了有选择地使某些单元格成为只读,请重写JTable的方法,并在实现中提供所需的逻辑

如果您有一个自定义,您可以替代它


在这两种情况下,您的isCellEditable()的实现应返回
true
当且仅当行和列参数指定的单元格包含“W”时。

那么,您将R/W存储在何处?如果它们不在显示的表中,但在数据结构中,您仍然可以根据当前行的R/W返回true,而不考虑作为参数给定的列。是否可以关于散列映射是如何传递到表中的,您需要更具体一点吗?如果我记得,默认模型使用向量向量,因此需要进行一些转换。那么,您究竟将R/W存储在哪里?如果它们不在显示的表中,但在数据结构中,您仍然可以根据当前ro的R/W返回truew、 不管作为参数给出的列是什么。能否更具体地说明哈希映射是如何传递到表的?如果我记得,默认模型使用向量向量,因此需要进行一些转换。为了更快地获得更好的帮助,请发布一个.PLZ来查看链接,这不是SSCCE。另外,请努力完全拼写单词。(这是‘请’而不是‘plz’)“我不明白如何创建此SSCCE。”你不明白什么?你明白缩写词的意思吗?我猜“post”的意思是“create”,因为发布SSCCE的过程与发布代码片段的过程完全相同。这让我回到了关于创建SSCCE的你不明白的地方。具体点,而不是重复你不知道怎么做。不是吗这不会导致进展。“上面写下了整个代码。”导入的
HashMap
在哪里?类名是什么?如果是“整个代码”,这两件事都会很明显。为我做这个测试:1)启动一个新的代码项目。2) 复制/粘贴上述问题中的内容,如cod