如何在JTable中将JRadioButton添加到组中

编程入门 行业动态 更新时间:2024-10-24 19:15:58
本文介绍了如何在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.

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

  • Figure from a related example, Mac OS X:

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

  • 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添加到组中

    本文发布于:2023-11-22 19:14:34,感谢您对本站的认可!
    本文链接:https://www.elefans.com/category/jswz/34/1618666.html
    版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。
    本文标签:中将   组中   如何在   JTable   JRadioButton

    发布评论

    评论列表 (有 0 条评论)
    草根站长

    >www.elefans.com

    编程频道|电子爱好者 - 技术资讯及电子产品介绍!