首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >如何使JTable具有多个编辑器类型在一行?

如何使JTable具有多个编辑器类型在一行?
EN

Stack Overflow用户
提问于 2016-04-29 17:00:51
回答 1查看 380关注 0票数 1

我正在呈现一个包含某些单元格的JTable,这些单元格是普通的文本输入或ComboBox。

当我像这样尝试时:

代码语言:javascript
运行
复制
package sandbox.jtablegui;

import java.awt.*;
import java.awt.event.*;
import java.util.List;
import java.util.ArrayList;
import java.util.Hashtable;

import javax.swing.*;
import javax.swing.table.*;

public class App extends JFrame
{
    List<TableCellEditor> editors = new ArrayList<TableCellEditor>(3);

    public App()
    {
        String[] colNames = { "Name", "Value" };
        final String[] propertyNames = { "Val1", "Val2" };
        DefaultTableModel model = new DefaultTableModel(colNames, 2) {

            // set setting names
            public Object getValueAt(int row, int col) {
                if (col == 0)
                    return propertyNames[row];
                return super.getValueAt(row, col);
            }

            public boolean isCellEditable(int row, int col) {
                if (col == 0)
                    return false;
                return true;
            }
        };

        JComboBox<String> comboBox = new JComboBox<String>(new String[] { "Option1", "Option2" });
        final DefaultCellEditor comboBoxEditor = new DefaultCellEditor(comboBox)    {
            @Override
            public Component getTableCellEditorComponent(JTable table, Object value, boolean isSelected, int row, int column) {
                Object val = value;
                System.out.println(val);
                if (val == null) {
                    val = ((JComboBox<?>) getComponent()).getItemAt(0);
                    System.out.println(val);
                }
                return super.getTableCellEditorComponent(table, val, isSelected, row, column);
            }
        };

        JTable table = new JTable(model)
        {
            //  Determine editor to be used by row
            public TableCellEditor getCellEditor(int row, int column)
            {
                int modelColumn = convertColumnIndexToModel( column );

                if (modelColumn == 1 && row == 1)
                    return comboBoxEditor;
                else
                    return super.getCellEditor(row, column);
            }
        };
        RowEditorModel rowEditorModel = new RowEditorModel();



        JScrollPane scrollPane = new JScrollPane( table );
        getContentPane().add( scrollPane );
    }

    public static void main(String[] args)
    {
        App frame = new App();
        frame.setDefaultCloseOperation( EXIT_ON_CLOSE );
        frame.pack();
        frame.setVisible(true);
    }

    public class RowEditorModel {
        private Hashtable data;

        public RowEditorModel() {
            data = new Hashtable();
        }

        public void addEditorForRow(int row, TableCellEditor editor) {
            data.put(new Integer(row), editor);
        }

        public void removeEditorForRow(int row) {
            data.remove(new Integer(row));
        }

        public TableCellEditor getEditor(int row) {
            return (TableCellEditor) data.get(new Integer(row));
        }
    }
}

但是,正如您在屏幕截图中看到的那样,JTable中没有显示默认值。

EN

回答 1

Stack Overflow用户

发布于 2016-04-29 17:39:22

在创建组合框时设置选定的索引无能为力。每次使用编辑器时,您都需要设置它。如下所示:

代码语言:javascript
运行
复制
DefaultCellEditor comboBoxEditor = new DefaultCellEditor(comboBox) {
    @Override
    public Component getTableCellEditorComponent(JTable table, Object value, boolean isSelected, int row, int column) {
        Object val = value;
        if (val == null) {
            val = ((JComboBox<?>) getComponent()).getItemAt(0);
        }
        return super.getTableCellEditorComponent(table, val, isSelected, row, column);
    }

}
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/36934003

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档