Как сделать ячейки JTable редактируемыми или нередактируемыми во время выполнения?

Я использую JTable, и параметры в таблице проходят через Hash Map. Hash Map содержит 2 параметра. 1 - это ключ (строка), а другой - значение (то есть вектор). Вектор содержит 2 вещи: первое значение (соответствует ключу), а другое - символ (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) {
}

} Это полный код моей таблицы.


person MIT    schedule 17.10.2011    source источник
comment
Чтобы быстрее получить помощь, опубликуйте SSCCE.   -  person Andrew Thompson    schedule 17.10.2011
comment
Пожалуйста, посмотрите на ссылку, которая НЕ является SSCCE. Также, пожалуйста, постарайтесь писать слова полностью. (это "пожалуйста", а не "пожалуйста")   -  person Andrew Thompson    schedule 17.10.2011
comment
Я не понимаю, как создать этот SSCCE. Что вы не понимаете? Вы понимаете слова аббревиатуры?   -  person Andrew Thompson    schedule 17.10.2011
comment
Я предполагаю, что под «публикацией» вы подразумеваете «создание», поскольку процесс публикации SSCCE точно такой же, как и публикация фрагментов кода. И это возвращает меня к Что вы не понимаете в создании SSCCE? Будьте конкретны, а не повторяйте, что вы не знаете, как это сделать. Это не приведет к прогрессу.   -  person Andrew Thompson    schedule 17.10.2011
comment
Весь код указан выше. Куда импортируется HashMap? Как называется класс? Если бы это был «весь код», обе эти вещи были бы очевидны. Сделайте этот тест для меня: 1) Начните новый проект кода. 2) Скопируйте/вставьте в точности то, что указано в вопросе выше, в качестве кода. 3) Скомпилируйте его. 4) сообщить об ошибках. 5) Повторите этот точный эксперимент с любым из вопросов, которые я задавал, которые содержат код. Эти образцы кода являются SSCCE.   -  person Andrew Thompson    schedule 17.10.2011
comment
Попробуйте эксперимент в моем последнем комментарии с вашим текущим кодом, чтобы увидеть.. I:\...\DataTable.java:49: ')' expected. SSCCE задачи во время выполнения должен компилироваться без ошибок. Почему это так трудно понять?   -  person Andrew Thompson    schedule 17.10.2011
comment
При компиляции кода (новый проект) ошибок нет. Итак, что мне делать дальше?   -  person MIT    schedule 17.10.2011
comment
Я сдаюсь. За то время, пока вы занимались этим, я побудил других людей опубликовать SSCCE. Они опубликовали SSCCE. Я исправил проблему и отправил ответ. Они увидели ответ и отметили его правильным. У меня больше нет времени кормить тебя с ложечки.   -  person Andrew Thompson    schedule 17.10.2011
comment
Уважаемый сэр... Спасибо, что дали мне ответ. Я дал вам полный код, сэр. С помощью этого кода будет сгенерирована таблица, и по умолчанию она доступна для редактирования... Я просто хочу знать, как я могу сделать свою таблицу редактируемые и нередактируемые во время выполнения (со значениями R/W)......   -  person MIT    schedule 17.10.2011


Ответы (2)


Если вы внедрили собственную TableModel можно определить isCellEditable возвращает true только тогда, когда, например, второй столбец равен 'W'.

person Vlad    schedule 17.10.2011
comment
Так где именно вы храните R/W? Если их нет в отображаемой таблице, но они есть в структуре данных, вы все равно можете вернуть true в зависимости от R/W для текущей строки, независимо от столбца, указанного в качестве аргумента. - person Vlad; 17.10.2011
comment
Не могли бы вы уточнить, как хеш-карта передается в таблицу? Насколько я помню, модель по умолчанию использует вектор векторов, поэтому требуется некоторое преобразование. - person Vlad; 17.10.2011

Чтобы выборочно сделать некоторые ячейки в вашем JTable только для чтения, переопределите ссылку isCellEditable() вашего JTable и предоставьте желаемую логику в реализации.

Если у вас есть собственная TableModel, вы можете переопределить isCellEditable() вместо этого.

В любом случае ваша реализация isCellEditable() должна возвращать true тогда и только тогда, когда ячейка, заданная параметрами строки и столбца, содержит 'W'.

person Brandon E Taylor    schedule 17.10.2011