如何在JTable中将JRadioButton添加到组中 [英] How to add JRadioButton to group in JTable

查看:142
本文介绍了如何在JTable中将JRadioButton添加到组中的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我已使用渲染器和编辑器将单选按钮添加到 JTable 。我也创建了同样的组。我无法使用此原则实现排他性(只应选择1个单选按钮)。请参阅下面的代码并感谢您的回复。



渲染器和编辑器类:

  class RadioButtonRenderer实现TableCellRenderer {

public Component getTableCellRendererComponent(JTable table,Object value,
boolean isSelected,boolean hasFocus,int row,int column){
if(
if( value == null)
返回null;
返回(组件)值;
}
}

类RadioButtonEditor扩展DefaultCellEditor实现ItemListener {
private JRadioButton button;

public RadioButtonEditor(JCheckBox checkBox){
super(checkBox);
}

public Component getTableCellEditorComponent(JTable table,Object value,
boolean isSelected,int row,int column){
if(value == null)
返回null;
button =(JRadioButton)值;
button.addItemListener(this);
返回(组件)值;
}

public Object getCellEditorValue(){
button.removeItemListener(this);
返回按钮;
}

public void itemStateChanged(ItemEvent e){
super.fireEditingStopped();
}
}

这是准备数据和分组的地方完成:

  private void displayPhoneListShow(Person person){

DefaultTableModel dm = new DefaultTableModel(){
@Override
public boolean isCellEditable(int row,int column){
return true;
}
};

Object [] objects = new Object [3];
Object [] tableColumnNamesPhone = new Object [3];

tableColumnNamesPhone [0] =选择;
tableColumnNamesPhone [1] =电话号码;
tableColumnNamesPhone [2] =首选;

dm.setColumnIdentifiers(tableColumnNamesPhone);
ListIterator< Phone> phoneList = person.getPhoneList()。listIterator();
while(phoneList.hasNext()){
Phone phone = phoneList.next();
objects [0] = new JRadioButton((^));
objects [1] = phone.getPhoneNumber();
objects [2] = phone.getPreferred();
dm.addRow(objects);
}
this.phoneTable.setModel(dm);

ButtonGroup group = new ButtonGroup();
for(int row = 0; row< dm.getRowCount(); row ++){
JRadioButton radio =(JRadioButton)dm.getValueAt(row,0);
group.add(电台);
}

phoneTable.getColumn(Select)。setCellRenderer(
new RadioButtonRenderer());
phoneTable.getColumn(Select)。setCellEditor(
new RadioButtonEditor(new JCheckBox()));
}

我仍然无法达到结果。我还尝试添加 ButtonGroup group = new ButtonGroup()作为类变量,也是 RadioButtonRenderer 类的一部分为此组添加了按钮。但结果却无动于衷。



请建议。

解决方案

替代方案,使用 JComboBox 作为的图,Mac OS X:




  • 图来自@ mKorbel的 StatusRenderer StatusEditor ,Windows:




  • 图使用 DefaultTableCellRenderer DefaultCellEditor ,Windows(见评论):




  • C.颂歌:

      import java.awt。*; 
    import java.awt.event。*;
    import java.text.DateFormat;
    import java.text.SimpleDateFormat;
    import java.util.Date;
    import java.util.Vector;
    import javax.swing.AbstractAction;
    import javax.swing.AbstractCellEditor;
    import javax.swing.BorderFactory;
    import javax.swing.ButtonGroup;
    import javax.swing.JFrame;
    import javax.swing.JPanel;
    import javax.swing.JRadioButton;
    import javax.swing.JScrollPane;
    import javax.swing.JSpinner;
    import javax.swing.JTable;
    import javax.swing.JToolBar;
    import javax.swing.SpinnerDateModel;
    import javax.swing.SwingUtilities;
    import javax.swing.table.AbstractTableModel;
    import javax.swing.table.DefaultTableCellRenderer;
    import javax.swing.table.TableCellEditor;
    import javax.swing.table.TableCellRenderer;
    import javax.swing.table.TableColumnModel;

    公共类JRadioAsRendererEditor扩展JPanel {

    private static final String [] COLUMN_NAMES = {
    List ID,Expiration Date,Status,创建日期};
    private static final DateFormat DATE_FORMAT = new SimpleDateFormat(dd / MM / yyyy);
    private static final DateFormat TIME_FORMAT_LONG = new SimpleDateFormat(HH:mm:ss,SSS);
    private MyTableModel tableModel;
    私有JTable表;
    private JFrame frame = new JFrame(TestRadioButtonRenderer);

    public JRadioAsRendererEditor(){
    super(new BorderLayout(0,5));
    setBorder(BorderFactory.createEmptyBorder(5,5,5,5));
    tableModel = new MyTableModel();
    table = new JTable(tableModel);
    table.setDefaultEditor(Date.class,new DateEditor());
    table.setDefaultRenderer(Date.class,new DateRenderer());
    table.setDefaultEditor(Status.class,new StatusEditor());
    table.setDefaultRenderer(Status.class,new StatusRenderer());
    //注释前两行并取消注释以下标准编辑器
    // table.setDefaultEditor(Status.class,new DefaultCellEditor(
    // new JComboBox(new Status [] { Status.Single,Status.Married,Status.Divorced})));

    add(new JScrollPane(table),BorderLayout.CENTER);
    JToolBar toolBar = new JToolBar();
    toolBar.setFloatable(false);
    toolBar.add(new AbstractAction(Add new){

    @Override
    public void actionPerformed(ActionEvent e){
    tableModel.add(new TableEntry( ));
    packTable();
    }
    });
    toolBar.add(new AbstractAction(Remove){

    @Override
    public void actionPerformed(ActionEvent e){
    tableModel.remove(table.getSelectedRow( ));
    }
    });
    frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    frame.add(new JScrollPane(table),BorderLayout.CENTER);
    frame.add(toolBar,BorderLayout.NORTH);
    frame.pack();
    SwingUtilities.invokeLater(new Runnable(){

    @Override
    public void run(){
    frame.setVisible(true);
    }
    });
    }

    private void packTable(){
    TableColumnModel columnModel = table.getColumnModel();
    int columnCount = table.getColumnCount();
    int rowCount = table.getRowCount();
    int [] [] preferredHeights = new int [columnCount] [rowCount];
    TableCellRenderer渲染器;
    组件补偿;
    for(int col = 0; col< columnCount; col ++){
    renderer = columnModel.getColumn(col).getCellRenderer();
    if(renderer == null){
    renderer = table.getDefaultRenderer(tableModel.getColumnClass(col));
    }
    for(int row = 0; row< rowCount; row ++){
    comp = renderer.getTableCellRendererComponent(table,
    tableModel.getValueAt(row,col),false ,false,row,col);
    preferredHeights [col] [row] =(int)comp.getPreferredSize()。getHeight();
    }
    }
    for(int row = 0; row< rowCount; row ++){
    int pref = 0;
    for(int col = 0; col< columnCount; col ++){
    pref = Math.max(pref,preferredHeights [col] [row]);
    }
    table.setRowHeight(row,pref);
    }
    }

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

    @Override
    public void run(){
    JRadioAsRendererEditor tableTestPanel = new JRadioAsRendererEditor();
    }
    });
    }

    私人enum状态{

    单身,已婚,离婚;
    }

    私有类StatusPanel扩展JPanel {

    私有JRadioButton theSingleOption;
    私人JRadioButton theMarriedOption;
    私人JRadioButton theDivorcedOption;
    private ButtonGroup buttonGroup = new ButtonGroup();

    StatusPanel(){
    super(new GridLayout(0,1));
    setOpaque(true);
    theSingleOption = createRadio(Status.Single);
    theMarriedOption = createRadio(Status.Married);
    theDivorcedOption = createRadio(Status.Divorced);
    }

    私有JRadioButton createRadio(状态){
    JRadioButton jrb = new JRadioButton(status.toString());
    jrb.setOpaque(false);
    add(jrb);
    buttonGroup.add(jrb);
    return jrb;
    }

    public Status getStatus(){
    if(theMarriedOption.isSelected()){
    return Status.Married;
    } else if(theDivorcedOption.isSelected()){
    返回Status.Divorced;
    } else {
    返回Status.Single;
    }
    }

    public void setStatus(状态){
    if(status == Status.Married){
    theMarriedOption.setSelected(true) ;
    } else if(status == Status.Divorced){
    theDivorcedOption.setSelected(true);
    } else {
    theSingleOption.setSelected(true);
    }
    }
    }

    私有类TableEntry {

    private int instanceNumber;
    private Long theId;
    private Date theExpirationDate;
    private状态theStatus;
    private Date theCreationDate;

    TableEntry(){
    instanceNumber ++;
    theId = new Long(instanceNumber);
    theExpirationDate = new Date();
    theStatus = Status.Single;
    theCreationDate = new Date();
    }

    TableEntry(Long anId,Date anExpirationDate,Status aStatus,Date aCreationDate){
    theId = anId;
    theExpirationDate = anExpirationDate;
    theStatus = aStatus;
    theCreationDate = aCreationDate;
    }

    public Long getId(){
    return theId;
    }

    public Date getExpirationDate(){
    return theExpirationDate;
    }

    public Status getStatus(){
    return theStatus;
    }

    public Date getCreationDate(){
    return theCreationDate;
    }

    public void setId(Long anId){
    theId = anId;
    }

    public void setExpirationDate(Date anExpirationDate){
    theExpirationDate = anExpirationDate;
    }

    public void setStatus(Status aStatus){
    theStatus = aStatus;
    }

    public void setCreationDate(Date aCreationDate){
    theCreationDate = aCreationDate;
    }
    }

    私有类MyTableModel扩展AbstractTableModel {

    private Vector< Object> theEntries;

    MyTableModel(){
    theEntries = new Vector< Object>();
    }

    @SuppressWarnings(unchecked)
    public void add(TableEntry anEntry){
    int index = theEntries.size();
    theEntries.add(anEntry);
    fireTableRowsInserted(index,index);
    }

    public void remove(int aRowIndex){
    if(aRowIndex< 0 || aRowIndex> = theEntries.size()){
    return;
    }
    theEntries.removeElementAt(aRowIndex);
    fireTableRowsDeleted(aRowIndex,aRowIndex);

    }

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

    @Override
    public String getColumnName(int column){
    return COLUMN_NAMES [column];
    }

    @Override
    public Class<?> getColumnClass(int columnIndex){
    switch(columnIndex){
    case 0:
    return Long.class;
    case 1:
    return Date.class;
    案例2:
    返回Status.class;
    案例3:
    返回Date.class;
    }
    返回Object.class;
    }

    @Override
    public void setValueAt(Object aValue,int rowIndex,int columnIndex){
    TableEntry entry =(TableEntry)theEntries.elementAt(rowIndex);
    switch(columnIndex){
    case 0:
    try {
    entry.setId(new Long(Long.parseLong(aValue.toString())));
    } catch(NumberFormatException nfe){
    return;
    }
    休息;
    案例1:
    entry.setExpirationDate((Date)aValue);
    休息;
    案例2:
    entry.setStatus((Status)aValue);
    休息;
    案例3:
    entry.setCreationDate((Date)aValue);
    休息;
    默认值:
    return;
    }
    fireTableCellUpdated(rowIndex,columnIndex);
    }

    @Override
    public boolean isCellEditable(int rowIndex,int columnIndex){
    return true;
    }

    @Override
    public int getColumnCount(){
    return 4;
    }

    @Override
    public Object getValueAt(int rowIndex,int columnIndex){
    TableEntry entry =(TableEntry)theEntries.elementAt(rowIndex);
    switch(columnIndex){
    case 0:
    return entry.getId();
    case 1:
    return entry.getExpirationDate();
    case 2:
    return entry.getStatus();
    案例3:
    返回entry.getCreationDate();
    }
    返回null;
    }
    }

    私有类DateRenderer extends DefaultTableCellRenderer {

    @Override
    public Component getTableCellRendererComponent(JTable table,Object value,
    boolean isSelected,boolean hasFocus,int row,int column){
    super.getTableCellRendererComponent(table,value,isSelected,hasFocus,row,column);
    if(!(value instanceof Date)){
    返回此;
    }
    setText(DATE_FORMAT.format((Date)value));
    返回此;
    }
    }

    私有类TimeRenderer extends DefaultTableCellRenderer {

    @Override
    public Component getTableCellRendererComponent(JTable table,Object value,
    boolean isSelected,boolean hasFocus,int row,int column){
    super.getTableCellRendererComponent(table,value,isSelected,hasFocus,row,column);
    if(!(value instanceof Date)){
    返回此;
    }
    setText(TIME_FORMAT_LONG.format((Date)value));
    返回此;
    }
    }

    私有类DateEditor扩展AbstractCellEditor实现TableCellEditor {

    private JSpinner theSpinner;

    DateEditor(){
    theSpinner = new JSpinner(new SpinnerDateModel());
    theSpinner.setOpaque(true);
    theSpinner.setEditor(new JSpinner.DateEditor(theSpinner,dd / MM / yyyy));
    }

    @Override
    public Object getCellEditorValue(){
    return theSpinner.getValue();
    }

    @Override
    public Component getTableCellEditorComponent(JTable table,Object value,
    boolean isSelected,int row,int column){
    theSpinner.setValue (值);
    if(isSelected){
    theSpinner.setBackground(table.getSelectionBackground());
    } else {
    theSpinner.setBackground(table.getBackground());
    }
    返回theSpinner;
    }
    }

    私有类TimeEditor扩展AbstractCellEditor实现TableCellEditor {

    private JSpinner theSpinner;
    私有对象值;

    TimeEditor(){
    theSpinner = new JSpinner(new SpinnerDateModel());
    theSpinner.setOpaque(true);
    theSpinner.setEditor(new JSpinner.DateEditor(theSpinner,HH:mm:ss,SSS));
    }

    @Override
    public Object getCellEditorValue(){
    return theSpinner.getValue();
    }

    @Override
    public Component getTableCellEditorComponent(JTable table,Object value,
    boolean isSelected,int row,int column){
    theSpinner.setValue (值);
    if(isSelected){
    theSpinner.setBackground(table.getSelectionBackground());
    } else {
    theSpinner.setBackground(table.getBackground());
    }
    返回theSpinner;
    }
    }

    私有类StatusEditor扩展AbstractCellEditor实现TableCellEditor {

    private StatusPanel theStatusPanel;

    StatusEditor(){
    theStatusPanel = new StatusPanel();
    }

    @Override
    public Object getCellEditorValue(){
    return theStatusPanel.getStatus();
    }

    @Override
    public Component getTableCellEditorComponent(JTable table,Object value,
    boolean isSelected,int row,int column){
    theStatusPanel.setStatus ((状态)值);
    if(isSelected){
    theStatusPanel.setBackground(table.getSelectionBackground());
    } else {
    theStatusPanel.setBackground(table.getBackground());
    }
    返回theStatusPanel;
    }
    }

    私有类StatusRenderer扩展StatusPanel实现TableCellRenderer {

    @Override
    public Component getTableCellRendererComponent(JTable table,Object value,
    boolean isSelected,boolean hasFocus,int row,int column){
    setStatus((Status)value);
    if(isSelected){
    setBackground(table.getSelectionBackground());
    } else {
    setBackground(table.getBackground());
    }
    返回此;
    }
    }
    }


    I have added radio buttons to a JTable using renderer and editor. I have also created group for the same. I'm unable to achieve the exclusiveness (only 1 radio button should be selected) using this principle. Please see my code below and appreciate your response.

    Renderer and Editor classes:

    class RadioButtonRenderer implements TableCellRenderer {
    
        public Component getTableCellRendererComponent(JTable table, Object value,
                boolean isSelected, boolean hasFocus, int row, int column) {
            if (value == null)
                return null;
            return (Component) value;
        }
    }
    
    class RadioButtonEditor extends DefaultCellEditor implements ItemListener {
        private JRadioButton button;
    
        public RadioButtonEditor(JCheckBox checkBox) {
            super(checkBox);
        }
    
        public Component getTableCellEditorComponent(JTable table, Object value,
                boolean isSelected, int row, int column) {
            if (value == null)
                return null;
            button = (JRadioButton) value;
            button.addItemListener(this);
            return (Component) value;
        }
    
        public Object getCellEditorValue() {
            button.removeItemListener(this);
            return button;
        }
    
        public void itemStateChanged(ItemEvent e) {
            super.fireEditingStopped();
        }
    }
    

    This is where the data is prepared and the grouping is done:

    private void displayPhoneListShow(Person person) {
    
        DefaultTableModel dm = new DefaultTableModel() {
            @Override
            public boolean isCellEditable(int row, int column) {
                return true;
            }
        };
    
        Object[] objects = new Object[3];
        Object[] tableColumnNamesPhone = new Object[3];
    
        tableColumnNamesPhone[0] = "Select";
        tableColumnNamesPhone[1] = "Phone Number";
        tableColumnNamesPhone[2] = "Preferred";
    
        dm.setColumnIdentifiers(tableColumnNamesPhone);
        ListIterator<Phone> phoneList = person.getPhoneList().listIterator();
        while (phoneList.hasNext()) {
            Phone phone = phoneList.next();
            objects[0] = new JRadioButton(("^"));
            objects[1] = phone.getPhoneNumber();
            objects[2] = phone.getPreferred();
            dm.addRow(objects);
        }
        this.phoneTable.setModel(dm);
    
        ButtonGroup group = new ButtonGroup();
        for (int row = 0; row < dm.getRowCount(); row++) {
            JRadioButton radio = (JRadioButton) dm.getValueAt(row, 0);
            group.add(radio);
        }
    
        phoneTable.getColumn("Select").setCellRenderer(
                new RadioButtonRenderer());
        phoneTable.getColumn("Select").setCellEditor(
                new RadioButtonEditor(new JCheckBox()));
    }
    

    I am still unable to achieve the result. I have also tried adding ButtonGroup group = new ButtonGroup() as a class variable and also part of the RadioButtonRenderer class and added buttons to this group. But results were indifferent.

    Please suggest.

    解决方案

    As an alternative, use a JComboBox as an editor for mutually exclusive choices within a row. For convenience, DefaultCellEditor offers a constructor especially for this. The result also makes more efficient use of horizontal space in the row. DependentColumn is an example, shown below. See also these other alternatives.

    1. Figure from @mKorbel's StatusRenderer and StatusEditor, Mac OS X:

    2. Figure from a related example, Mac OS X:

    3. Figure from @mKorbel's StatusRenderer and StatusEditor, Windows:

    4. Figure using DefaultTableCellRenderer and DefaultCellEditor, Windows (see comments):

    Code:

    import java.awt.*;
    import java.awt.event.*;
    import java.text.DateFormat;
    import java.text.SimpleDateFormat;
    import java.util.Date;
    import java.util.Vector;
    import javax.swing.AbstractAction;
    import javax.swing.AbstractCellEditor;
    import javax.swing.BorderFactory;
    import javax.swing.ButtonGroup;
    import javax.swing.JFrame;
    import javax.swing.JPanel;
    import javax.swing.JRadioButton;
    import javax.swing.JScrollPane;
    import javax.swing.JSpinner;
    import javax.swing.JTable;
    import javax.swing.JToolBar;
    import javax.swing.SpinnerDateModel;
    import javax.swing.SwingUtilities;
    import javax.swing.table.AbstractTableModel;
    import javax.swing.table.DefaultTableCellRenderer;
    import javax.swing.table.TableCellEditor;
    import javax.swing.table.TableCellRenderer;
    import javax.swing.table.TableColumnModel;
    
    public class JRadioAsRendererEditor extends JPanel {
    
        private static final String[] COLUMN_NAMES = {
            "List ID", "Expiration Date", "Status", "Date Created"};
        private static final DateFormat DATE_FORMAT = new SimpleDateFormat("dd/MM/yyyy");
        private static final DateFormat TIME_FORMAT_LONG = new SimpleDateFormat("HH:mm:ss,SSS");
        private MyTableModel tableModel;
        private JTable table;
        private JFrame frame = new JFrame("TestRadioButtonRenderer");
    
        public JRadioAsRendererEditor() {
            super(new BorderLayout(0, 5));
            setBorder(BorderFactory.createEmptyBorder(5, 5, 5, 5));
            tableModel = new MyTableModel();
            table = new JTable(tableModel);
            table.setDefaultEditor(Date.class, new DateEditor());
            table.setDefaultRenderer(Date.class, new DateRenderer());
            table.setDefaultEditor(Status.class, new StatusEditor());
            table.setDefaultRenderer(Status.class, new StatusRenderer());
    // comment the two preceding lines and uncomment the following for a standard editor
    // table.setDefaultEditor(Status.class, new DefaultCellEditor(
    // new JComboBox(new Status[]{Status.Single, Status.Married, Status.Divorced})));
    
            add(new JScrollPane(table), BorderLayout.CENTER);
            JToolBar toolBar = new JToolBar();
            toolBar.setFloatable(false);
            toolBar.add(new AbstractAction("Add new") {
    
                @Override
                public void actionPerformed(ActionEvent e) {
                    tableModel.add(new TableEntry());
                    packTable();
                }
            });
            toolBar.add(new AbstractAction("Remove") {
    
                @Override
                public void actionPerformed(ActionEvent e) {
                    tableModel.remove(table.getSelectedRow());
                }
            });
            frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
            frame.add(new JScrollPane(table), BorderLayout.CENTER);
            frame.add(toolBar, BorderLayout.NORTH);
            frame.pack();
            SwingUtilities.invokeLater(new Runnable() {
    
                @Override
                public void run() {
                    frame.setVisible(true);
                }
            });
        }
    
        private void packTable() {
            TableColumnModel columnModel = table.getColumnModel();
            int columnCount = table.getColumnCount();
            int rowCount = table.getRowCount();
            int[][] preferredHeights = new int[columnCount][rowCount];
            TableCellRenderer renderer;
            Component comp;
            for (int col = 0; col < columnCount; col++) {
                renderer = columnModel.getColumn(col).getCellRenderer();
                if (renderer == null) {
                    renderer = table.getDefaultRenderer(tableModel.getColumnClass(col));
                }
                for (int row = 0; row < rowCount; row++) {
                    comp = renderer.getTableCellRendererComponent(table,
                        tableModel.getValueAt(row, col), false, false, row, col);
                    preferredHeights[col][row] = (int) comp.getPreferredSize().getHeight();
                }
            }
            for (int row = 0; row < rowCount; row++) {
                int pref = 0;
                for (int col = 0; col < columnCount; col++) {
                    pref = Math.max(pref, preferredHeights[col][row]);
                }
                table.setRowHeight(row, pref);
            }
        }
    
        public static void main(String[] args) {
            SwingUtilities.invokeLater(new Runnable() {
    
                @Override
                public void run() {
                    JRadioAsRendererEditor tableTestPanel = new JRadioAsRendererEditor();
                }
            });
        }
    
        private enum Status {
    
            Single, Married, Divorced;
        }
    
        private class StatusPanel extends JPanel {
    
            private JRadioButton theSingleOption;
            private JRadioButton theMarriedOption;
            private JRadioButton theDivorcedOption;
            private ButtonGroup buttonGroup = new ButtonGroup();
    
            StatusPanel() {
                super(new GridLayout(0, 1));
                setOpaque(true);
                theSingleOption = createRadio(Status.Single);
                theMarriedOption = createRadio(Status.Married);
                theDivorcedOption = createRadio(Status.Divorced);
            }
    
            private JRadioButton createRadio(Status status) {
                JRadioButton jrb = new JRadioButton(status.toString());
                jrb.setOpaque(false);
                add(jrb);
                buttonGroup.add(jrb);
                return jrb;
            }
    
            public Status getStatus() {
                if (theMarriedOption.isSelected()) {
                    return Status.Married;
                } else if (theDivorcedOption.isSelected()) {
                    return Status.Divorced;
                } else {
                    return Status.Single;
                }
            }
    
            public void setStatus(Status status) {
                if (status == Status.Married) {
                    theMarriedOption.setSelected(true);
                } else if (status == Status.Divorced) {
                    theDivorcedOption.setSelected(true);
                } else {
                    theSingleOption.setSelected(true);
                }
            }
        }
    
        private class TableEntry {
    
            private int instanceNumber;
            private Long theId;
            private Date theExpirationDate;
            private Status theStatus;
            private Date theCreationDate;
    
            TableEntry() {
                instanceNumber++;
                theId = new Long(instanceNumber);
                theExpirationDate = new Date();
                theStatus = Status.Single;
                theCreationDate = new Date();
            }
    
            TableEntry(Long anId, Date anExpirationDate, Status aStatus, Date aCreationDate) {
                theId = anId;
                theExpirationDate = anExpirationDate;
                theStatus = aStatus;
                theCreationDate = aCreationDate;
            }
    
            public Long getId() {
                return theId;
            }
    
            public Date getExpirationDate() {
                return theExpirationDate;
            }
    
            public Status getStatus() {
                return theStatus;
            }
    
            public Date getCreationDate() {
                return theCreationDate;
            }
    
            public void setId(Long anId) {
                theId = anId;
            }
    
            public void setExpirationDate(Date anExpirationDate) {
                theExpirationDate = anExpirationDate;
            }
    
            public void setStatus(Status aStatus) {
                theStatus = aStatus;
            }
    
            public void setCreationDate(Date aCreationDate) {
                theCreationDate = aCreationDate;
            }
        }
    
        private class MyTableModel extends AbstractTableModel {
    
            private Vector<Object> theEntries;
    
            MyTableModel() {
                theEntries = new Vector<Object>();
            }
    
            @SuppressWarnings("unchecked")
            public void add(TableEntry anEntry) {
                int index = theEntries.size();
                theEntries.add(anEntry);
                fireTableRowsInserted(index, index);
            }
    
            public void remove(int aRowIndex) {
                if (aRowIndex < 0 || aRowIndex >= theEntries.size()) {
                    return;
                }
                theEntries.removeElementAt(aRowIndex);
                fireTableRowsDeleted(aRowIndex, aRowIndex);
    
            }
    
            public int getRowCount() {
                return theEntries.size();
            }
    
            @Override
            public String getColumnName(int column) {
                return COLUMN_NAMES[column];
            }
    
            @Override
            public Class<?> getColumnClass(int columnIndex) {
                switch (columnIndex) {
                    case 0:
                        return Long.class;
                    case 1:
                        return Date.class;
                    case 2:
                        return Status.class;
                    case 3:
                        return Date.class;
                }
                return Object.class;
            }
    
            @Override
            public void setValueAt(Object aValue, int rowIndex, int columnIndex) {
                TableEntry entry = (TableEntry) theEntries.elementAt(rowIndex);
                switch (columnIndex) {
                    case 0:
                        try {
                            entry.setId(new Long(Long.parseLong(aValue.toString())));
                        } catch (NumberFormatException nfe) {
                            return;
                        }
                        break;
                    case 1:
                        entry.setExpirationDate((Date) aValue);
                        break;
                    case 2:
                        entry.setStatus((Status) aValue);
                        break;
                    case 3:
                        entry.setCreationDate((Date) aValue);
                        break;
                    default:
                        return;
                }
                fireTableCellUpdated(rowIndex, columnIndex);
            }
    
            @Override
            public boolean isCellEditable(int rowIndex, int columnIndex) {
                return true;
            }
    
            @Override
            public int getColumnCount() {
                return 4;
            }
    
            @Override
            public Object getValueAt(int rowIndex, int columnIndex) {
                TableEntry entry = (TableEntry) theEntries.elementAt(rowIndex);
                switch (columnIndex) {
                    case 0:
                        return entry.getId();
                    case 1:
                        return entry.getExpirationDate();
                    case 2:
                        return entry.getStatus();
                    case 3:
                        return entry.getCreationDate();
                }
                return null;
            }
        }
    
        private class DateRenderer extends DefaultTableCellRenderer {
    
            @Override
            public Component getTableCellRendererComponent(JTable table, Object value,
            boolean isSelected, boolean hasFocus, int row, int column) {
                super.getTableCellRendererComponent(table, value, isSelected, hasFocus, row, column);
                if (!(value instanceof Date)) {
                    return this;
                }
                setText(DATE_FORMAT.format((Date) value));
                return this;
            }
        }
    
        private class TimeRenderer extends DefaultTableCellRenderer {
    
            @Override
            public Component getTableCellRendererComponent(JTable table, Object value,
            boolean isSelected, boolean hasFocus, int row, int column) {
                super.getTableCellRendererComponent(table, value, isSelected, hasFocus, row, column);
                if (!(value instanceof Date)) {
                    return this;
                }
                setText(TIME_FORMAT_LONG.format((Date) value));
                return this;
            }
        }
    
        private class DateEditor extends AbstractCellEditor implements TableCellEditor {
    
            private JSpinner theSpinner;
    
            DateEditor() {
                theSpinner = new JSpinner(new SpinnerDateModel());
                theSpinner.setOpaque(true);
                theSpinner.setEditor(new JSpinner.DateEditor(theSpinner, "dd/MM/yyyy"));
            }
    
            @Override
            public Object getCellEditorValue() {
                return theSpinner.getValue();
            }
    
            @Override
            public Component getTableCellEditorComponent(JTable table, Object value,
            boolean isSelected, int row, int column) {
                theSpinner.setValue(value);
                if (isSelected) {
                    theSpinner.setBackground(table.getSelectionBackground());
                } else {
                    theSpinner.setBackground(table.getBackground());
                }
                return theSpinner;
            }
        }
    
        private class TimeEditor extends AbstractCellEditor implements TableCellEditor {
    
            private JSpinner theSpinner;
            private Object value;
    
            TimeEditor() {
                theSpinner = new JSpinner(new SpinnerDateModel());
                theSpinner.setOpaque(true);
                theSpinner.setEditor(new JSpinner.DateEditor(theSpinner, "HH:mm:ss,SSS"));
            }
    
            @Override
            public Object getCellEditorValue() {
                return theSpinner.getValue();
            }
    
            @Override
            public Component getTableCellEditorComponent(JTable table, Object value,
            boolean isSelected, int row, int column) {
                theSpinner.setValue(value);
                if (isSelected) {
                    theSpinner.setBackground(table.getSelectionBackground());
                } else {
                    theSpinner.setBackground(table.getBackground());
                }
                return theSpinner;
            }
        }
    
        private class StatusEditor extends AbstractCellEditor implements TableCellEditor {
    
            private StatusPanel theStatusPanel;
    
            StatusEditor() {
                theStatusPanel = new StatusPanel();
            }
    
            @Override
            public Object getCellEditorValue() {
                return theStatusPanel.getStatus();
            }
    
            @Override
            public Component getTableCellEditorComponent(JTable table, Object value,
                boolean isSelected, int row, int column) {
                theStatusPanel.setStatus((Status) value);
                if (isSelected) {
                    theStatusPanel.setBackground(table.getSelectionBackground());
                } else {
                    theStatusPanel.setBackground(table.getBackground());
                }
                return theStatusPanel;
            }
        }
    
        private class StatusRenderer extends StatusPanel implements TableCellRenderer {
    
            @Override
            public Component getTableCellRendererComponent(JTable table, Object value,
                boolean isSelected, boolean hasFocus, int row, int column) {
                setStatus((Status) value);
                if (isSelected) {
                    setBackground(table.getSelectionBackground());
                } else {
                    setBackground(table.getBackground());
                }
                return this;
            }
        }
    }
    

    这篇关于如何在JTable中将JRadioButton添加到组中的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

    查看全文
    登录 关闭
    扫码关注1秒登录
    发送“验证码”获取 | 15天全站免登陆