java - 选择 JRadioButton 时如何设置不可编辑的 JTable 单元格?

标签 java swing jtable jradiobutton

我有一个包含一些行的 JTable。当选择单选按钮解锁时,如何阻止编辑行?下面是一个小项目作为工作示例

更新
ElencoPersonFrame 类

package test;
import java.awt.*;
import java.util.*;

import javax.swing.*;

public class ElencoPersoneFrame extends JFrame {
    private PersonaTableModel tableModel;
    private JTable table;
    private JScrollPane scrollPane;

    JRadioButton rdbtnFilm = new JRadioButton("Editable");
    JRadioButton rdbtnSerieTv = new JRadioButton("Not editable");
    public ElencoPersoneFrame()
    {
        super ("Elenco Persone");

        setDefaultCloseOperation (JFrame.EXIT_ON_CLOSE);
        setSize(400, 250);

        ArrayList<Persona> listaPersone = new ArrayList<Persona>();
        listaPersone.add(new Persona("Mario", "Rossi", 1972, false));
        listaPersone.add(new Persona("Giacomo", "Bianchi", 1946, false));
        listaPersone.add(new Persona("Roberto", "Verdi", 1985, true));
        tableModel = new PersonaTableModel(listaPersone);
        table = new JTable(tableModel);
        scrollPane = new JScrollPane(table);

        JPanel rdpnl=new radioPanel();

        getContentPane().add(rdpnl, BorderLayout.NORTH);
        getContentPane().add(scrollPane, BorderLayout.CENTER);

    }

    public static void main(String[] args) {
        SwingUtilities.invokeLater(new Runnable() {
            public void run() {
                ElencoPersoneFrame f = new ElencoPersoneFrame();
                f.setVisible(true);
            }
        });
    }
}

角色类别

package test;
public class Persona 
{
        private String nome;
        private String cognome;
        private int annoNascita;
        private boolean disoccupato;

        /*costruttore*/
        public Persona(String nome, String cognome, int annoNascita, boolean disoccupato) {
            this.nome = nome;
            this.cognome = cognome;
            this.annoNascita = annoNascita;
            this.disoccupato = disoccupato;
        }

        public String getNome() { return nome; }
        public String getCognome() { return cognome; }
        public int getAnnoNascita() { return annoNascita; }
        public boolean isDisoccupato() { return disoccupato; }

        public void setNome(String nome) { this.nome = nome; }
        public void setCognome(String cognome) { this.cognome = cognome; }
        public void setAnnoNascita(int annoNascita) { this.annoNascita = annoNascita; }
        public void setDisoccupato(boolean disoccupato) { this.disoccupato = disoccupato; }
}

PersonaTableModel 类

package test;
import java.util.ArrayList;
import javax.swing.table.AbstractTableModel;

public class PersonaTableModel extends AbstractTableModel 
{
    private ArrayList<Persona> listaPersone;

    public PersonaTableModel(ArrayList<Persona> listaPersone) {
        this.listaPersone = listaPersone;
    }

    public int getRowCount() {
        return listaPersone.size();
    }

    public int getColumnCount() {
        return 4;
    }

    public String getColumnName(int column) {
        switch (column) {
            case 0: return "Nome";
            case 1: return "Cognome";
            case 2: return "Anno nascita";
            case 3: return "Disoccupato?";
        }

        return "";
    }

    public Class getColumnClass(int column) {
        switch (column) {
            case 0: return String.class;
            case 1: return String.class;
            case 2: return Number.class;    
            case 3: return Boolean.class;  
        }
        return Object.class;
    }

    public boolean isCellEditable(int row, int column) {
        return true;
    }

    public Object getValueAt(int row, int column) {
        Persona p = listaPersone.get(row);

        switch (column) {
            case 0: return p.getNome();
            case 1: return p.getCognome();
            case 2: return p.getAnnoNascita();   
            case 3: return p.isDisoccupato();   
        }

        return null;
    }

   public void setValueAt(Object value, int row, int column) 
   {
        Persona p = listaPersone.get(row);

        switch (column) 
        {
            case 0: p.setNome((String) value); break;
            case 1: p.setCognome((String) value); break;
            case 2: p.setAnnoNascita((Integer) value); break;   
            case 3: p.setDisoccupato((Boolean) value); break;   
        }
    }

    public void aggiungiPersona(Persona p) {
        listaPersone.add(p);
        int row = listaPersone.size() - 1;
        fireTableRowsInserted(row, row);
    }
}

radioPanel类

package test;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;

import javax.swing.ButtonGroup;
import javax.swing.JPanel;
import javax.swing.JRadioButton;


public class radioPanel extends JPanel implements ActionListener 
{
    private JRadioButton unlock;
    private JRadioButton lock;
    private ButtonGroup rdgroup;

    public radioPanel()
    {
        rdgroup=new ButtonGroup();
        unlock = new JRadioButton("Editable");
        lock = new JRadioButton("Not editable");

        rdgroup.add(unlock);
        rdgroup.add(lock);
        rdgroup.setSelected(unlock.getModel(), true);

        this.add(unlock);   
        this.add(lock);

        lock.addActionListener(this);
        unlock.addActionListener(this);
    }

    @Override
    public void actionPerformed(ActionEvent e) 
    {
        if(e.getSource() == this.lock)
        {

        }

        if(e.getSource() == this.unlock)
        {

        }   
    }
}

最佳答案

所以似乎没有(据我所知)某种神奇的方法可以将表格设置为不可编辑。不过,您可以做的是在模型中创建一个方法,例如setEditable(boolean),您可以在其中设置类成员boolean editable。对 isCellEditable 使用相同的字段。更改状态后,您应该触发表更改。类似的东西

class PersonaTableModel extends AbstractTableModel {
    ...
    private boolean editable = true;

    public boolean isEditable() {
        return editable;
    }

    public boolean isCellEditable(int row, int column) {
        return editable;
    }

    public void setEditable(boolean editable) {
        this.editable = editable;
        fireTableDataChanged();
    }
    ...
}

您还需要让 ActionListener 获取表模型。所以你可以将你的 radio 面板重构为类似的东西

class radioPanel extends JPanel {
    private JRadioButton unlock;
    private JRadioButton lock;
    private ButtonGroup rdgroup;

    ...

    public ButtonGroup getButtonGroup() {
        return rdgroup;
    }

    public AbstractButton getUnlock() {
        return unlock;
    }

    public AbstractButton getLock() {
        return lock;
    }
}

这样您就可以从任何地方获取单选按钮并添加ActionListener。因此,您可以将主类代码更改为:

radioPanel rdpnl = new radioPanel();
rdpnl.getUnlock().addActionListener(new ActionListener(){
    public void actionPerformed(ActionEvent e) {
        tableModel.setEditable(true);
    }
});
rdpnl.getLock().addActionListener(new ActionListener(){
    public void actionPerformed(ActionEvent e) {
        tableModel.setEditable(false);
    }
});

getContentPane().add(rdpnl, BorderLayout.NORTH);

经过测试,似乎按预期工作。

<小时/>

旁白:请注意 Java 命名约定。类名称应以大写字母开头,即 radioPanelRadioPanel

关于java - 选择 JRadioButton 时如何设置不可编辑的 JTable 单元格?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25825060/

相关文章:

java - 用截击发送对象

Java 事件队列。我什么时候应该考虑使用它?

java - 图像未在 JTable (Java Swing) 中显示

java - 编写一个java程序来读取长字符串(使用流)并将输出写入文件?

java - 如何更快地处理 BufferedImage

java - 我可以在 Java 中设置一个窗口,使其具有统一的大小调整(即正方形)吗?

java - 重用Java定时器timertask

java - 通过Jtable修改记录到数据库

java - 如何在 JTable 中控制字体样式、颜色和大小?

java - Recyclerview在软键盘出现或消失时向下滚动