【问题标题】:Java JTable ProblemsJava JTable 问题
【发布时间】:2011-02-18 21:08:40
【问题描述】:

我已经在互联网上搜索了解决我的问题的点点滴滴,但我似乎还没有想出任何东西,而且我真的一直在努力解决这个问题。

简而言之,我需要创建一个嵌入 JTable 的 JDialog。这个 JTable 的列数必须是动态的。另外,我希望 JTable 的前两行在每个单元格中都有组合框。第一行都有相同的组合框,第二行都有相同的组合框,与第一行不同。从那里,我只是为一组其他行填写静态文本数据。所以表格应该是这样的:

组合,组合,组合,组合,...
组合,组合,组合,组合,...
文字,文字,文字,文字,...

我遇到了很多麻烦 a) 使列号动态化(它将取决于传递的数组)和 b) 只制作前两行组合框 - 我能在任何地方找到的唯一方法是制作一整列组合框。

如果它有帮助的话,我正在使用 Netbeans IDE。非常感谢您抽出宝贵时间,如果需要任何进一步的知识,请告诉我。

【问题讨论】:

    标签: java swing jtable dynamic-data


    【解决方案1】:

    如何返回一个返回 JComboBox 的 TableCellEditor?

    import java.awt.*;
    import java.awt.event.*;
    import java.util.List;
    import java.util.ArrayList;
    import javax.swing.*;
    import javax.swing.border.*;
    import javax.swing.table.*;
    
    public class TableComboBoxByRow extends JFrame
    {
        List<TableCellEditor> editors = new ArrayList<TableCellEditor>(3);
    
        public TableComboBoxByRow()
        {
            // Create the editors to be used for each row
    
            String[] items1 = { "Red", "Blue", "Green" };
            JComboBox comboBox1 = new JComboBox( items1 );
            DefaultCellEditor dce1 = new DefaultCellEditor( comboBox1 );
            editors.add( dce1 );
    
            String[] items2 = { "Circle", "Square", "Triangle" };
            JComboBox comboBox2 = new JComboBox( items2 );
            DefaultCellEditor dce2 = new DefaultCellEditor( comboBox2 );
            editors.add( dce2 );
    
            String[] items3 = { "Apple", "Orange", "Banana" };
            JComboBox comboBox3 = new JComboBox( items3 );
            DefaultCellEditor dce3 = new DefaultCellEditor( comboBox3 );
            editors.add( dce3 );
    
            //  Create the table with default data
    
            Object[][] data =
            {
                {"Color", "Red"},
                {"Shape", "Square"},
                {"Fruit", "Banana"},
                {"Plain", "Text"}
            };
            String[] columnNames = {"Type","Value"};
            DefaultTableModel model = new DefaultTableModel(data, columnNames);
            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 < 3)
                        return editors.get(row);
                    else
                        return super.getCellEditor(row, column);
                }
            };
    
            JScrollPane scrollPane = new JScrollPane( table );
            getContentPane().add( scrollPane );
        }
    
        public static void main(String[] args)
        {
            TableComboBoxByRow frame = new TableComboBoxByRow();
            frame.setDefaultCloseOperation( EXIT_ON_CLOSE );
            frame.pack();
            frame.setVisible(true);
        }
    }
    

    【讨论】:

      【解决方案2】:

      对于动态列数部分,这是由 JTable 的TableModel 定义的。使用具有适当列数的DefaultTableModel,或者更好的是,通过扩展AbstractTableModel 实现您自己的表模型,并根据包含您的数据的数组实现getColumnCount()

      对于组合部分,我猜您想使用组合来编辑表中的数据。您需要扩展 JTable 并重新定义 getCellEditor() 方法,以便在行为 0 或 1 时返回返回 JComboBox 的 TableCellEditor。如果行大于 1,您可以返回 super.getCellEditor(row, column)

      您还应该阅读Java Tutorial about JTable,其中包含有关您想做的所有事情的部分。

      【讨论】:

      • 感谢您的帮助!只是一个简单的问题 - 我如何返回一个返回 JComboBox 的 TableCellEditor?我尝试了看起来像这样的代码,但无济于事......public TableCellEditor getCellEditor(int row, int column) { if (row &gt; 1) { return super.getCellEditor(row,column); } else { TableCellEditor tce = getTableCellEditorComponent(this,myComboBox,false,row,column); } }
      【解决方案3】:

      这个帖子可能会有所帮助: Transpose (Rotate) JTable

      【讨论】:

        猜你喜欢
        • 2011-01-23
        • 2011-04-27
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2017-03-06
        • 2012-07-31
        • 2012-12-30
        相关资源
        最近更新 更多