【问题标题】:Checkbox in the beginning of jTablejTable开头的复选框
【发布时间】:2015-03-01 15:59:22
【问题描述】:

我是 Swing 新手,在这里寻求帮助。我需要在 jTable 中显示来自 .xls 文件的数据。以下是我从here 遵循的代码:-

jbClick.addActionListener(new ActionListener() { 

    public void actionPerformed(ActionEvent arg0) { 
        jChooser.showOpenDialog(null); 
        File file = jChooser.getSelectedFile(); 
        if(!file.getName().endsWith("xls")){ 
            JOptionPane.showMessageDialog(null, "Please select only Excel file.", "Error",JOptionPane.ERROR_MESSAGE);
            } 
        else { 
                fillData(file); 
                model = new DefaultTableModel(data, headers); 
                tableWidth = model.getColumnCount() * 150; 
                tableHeight = model.getRowCount() * 25;
                table.setPreferredSize(new Dimension( tableWidth, tableHeight));
                table.setModel(model); 
                jbClick.setVisible(false);
                jbText.setVisible(true);
                } 
        } 
    }); 

    JPanel chooserPanel = new JPanel(); 
    JPanel filterPanlel = new JPanel();
    //filterPanlel.add(jbText,"OLa");

    final Color alternate = new Color(186,246,244);
    table = new JTable(); 
    table.setAutoCreateRowSorter(true); 
    model = new DefaultTableModel(data, headers); 
    table.setModel(model); 
    table.setBackground(alternate); 
    table.setAutoResizeMode(JTable.AUTO_RESIZE_OFF); 
    table.setEnabled(false); 
    table.setRowHeight(25); 
    table.setRowMargin(4); 
    tableWidth = model.getColumnCount() * 200;
    tableHeight = model.getRowCount() * 25;
    table.setPreferredSize(new Dimension( tableWidth, tableHeight)); 
    scroll = new JScrollPane(table); 
    scroll.setBackground(alternate); 
    scroll.setPreferredSize(new Dimension(500, 500)); 
    scroll.setHorizontalScrollBarPolicy( JScrollPane.HORIZONTAL_SCROLLBAR_AS_NEEDED); 
    scroll.setVerticalScrollBarPolicy( JScrollPane.VERTICAL_SCROLLBAR_AS_NEEDED); 
    getContentPane().add(buttonPanel, BorderLayout.NORTH); 
    getContentPane().add(scroll, BorderLayout.CENTER); 
    //setSize(600, 600); 
    setResizable(true); 
    setExtendedState(JFrame.MAXIMIZED_BOTH);
    //setUndecorated(true);
    setVisible(true); 
    } 


    /** * Fill JTable with Excel file data. * * @param file * file :contains xls file to display in jTable */ 
    @SuppressWarnings({ "unchecked", "rawtypes" })
    void fillData(File file) { 
        Workbook workbook = null; 
        try { 
            try { 
                workbook = Workbook.getWorkbook(file); 
                } 
            catch (IOException ex) { 
                Logger.getLogger( excelTojTable.class. getName()).log(Level.SEVERE, null, ex); 
                } 
            Sheet sheet = workbook.getSheet(0);
            headers.clear(); 
            for (int i = 0; i < sheet.getColumns(); i++) 
            { 
                Cell cell1 = sheet.getCell(i, 0);
                headers.add(cell1.getContents()); 
            } 
            data.clear(); 
            for (int j = 1; j < sheet.getRows(); j++) 
            { 
                Vector d = new Vector(); 
                for (int i = 0; i < sheet.getColumns(); i++) 
                { 
                    Cell cell = sheet.getCell(i, j); 
                    d.add(cell.getContents()); 
                } 
                d.add("\n");
                data.add(d); 
                } 
            } 
        catch (BiffException e) { 
            e.printStackTrace(); 
            } 
        } 

问题:- 现在我需要在表格的每一行前面添加一个可编辑的复选框。

请帮忙。

【问题讨论】:

  • 我删除了 iText 标签,因为我没有看到任何与 PDF 相关的内容。此外:PdfGraphics2D(可以将 Swing 对象渲染为 PDF 的 iText 类)不支持交互式表单字段。
  • I need to add a editable checkbox in-front of each row in the table. 我猜这个问题是关于在 Excel 文件中找不到的表中添加一个额外的列。在创建“header”和“d”向量的循环之前,您需要添加布尔信息。因此,对于标题,您可能会这样做:header.add("Select"); 和每一行:d.add( Boolean.FALSE );。然后,您需要通过使用table.getDefaultRenderer(Boolean.Class) 更新TableColumnModelTableColumn 来为表的第一列设置默认渲染器
  • @BrunoLowagie:谢谢……确实不需要 iText 标签
  • @camickr :- 感谢您的评论...但是请您提供代码 sn-p !!!
  • @camickr :我的表格中有一个新列,但它不是一个复选框......但它的所有条目都是假的......我是新来的摇摆......所以请帮助

标签: java excel swing jtable jcheckbox


【解决方案1】:

我需要在表格的每一行前面添加一个可编辑的复选框。

在创建“header”和“d”向量的循环之前,您需要添加布尔信息。

所以对于标题你可以这样做:

headers.clear(); 
header.add("Select"); 

对于每一行:

Vector d = new Vector(); 
d.add( Boolean.FALSE );. 

我的表格中有一个新列,但它不是复选框

然后,您需要使用布尔类的默认渲染器更新TableColumnModelTableColumn,为表格的第一列设置默认渲染器:

TableColumn tc = table.getColumnModel().getColumn(0);
tc.setCellRenderer( table.getDefaultRenderer( Boolean.class ) );

我是新手

从 [如何使用表格] 的 Swing 教程开始 (http://docs.oracle.com/javase/tutorial/uiswing/components/table.html) 了解渲染器的基础知识。

编辑:

演示解决方案的简单 SSCCE:

import java.awt.*;
import java.util.*;
import javax.swing.*;
import javax.swing.text.*;
import javax.swing.table.*;

public class SSCCE extends JPanel
{
    public SSCCE()
    {
        Vector<String> header = new Vector<String>();
        header.add("Select");
        header.add("Column1");
        header.add("Column2");
        header.add("Column3");

        Vector<Vector<Object>> data = new Vector<Vector<Object>>();

        for (int row = 0; row < 5; row++)
        {
            Vector<Object> d = new Vector<Object>();
            d.add( Boolean.FALSE );

            for (int column = 0; column < 3; column++)
            {
                d.add(row + " : " + column);
            }

            data.add(d);
        }

        DefaultTableModel model = new DefaultTableModel(data, header);
        JTable table = new JTable( model );
        table.setPreferredScrollableViewportSize(table.getPreferredSize());
        TableColumn tc = table.getColumnModel().getColumn(0);
        tc.setCellRenderer( table.getDefaultRenderer( Boolean.class ) );
        tc.setCellEditor( table.getDefaultEditor( Boolean.class ) );

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

    private static void createAndShowGUI()
    {
        JFrame frame = new JFrame("SSCCE");
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        frame.add( new SSCCE() );
        frame.setLocationByPlatform( true );
        frame.pack();
        frame.setVisible( true );
    }

    public static void main(String[] args)
    {
        EventQueue.invokeLater(new Runnable()
        {
            public void run()
            {
                createAndShowGUI();
            }
        });
    }
}

【讨论】:

  • :- ArrayIndexOutOfBoundsException at line "TableColumn tc = table.getColumnModel().getColumn(0);"
  • @ParthaChetry,您必须在将 TableModel 添加到表后执行此操作。只有当表知道 TableModel 中有多少列时,才能创建 TableColumns。
  • :- 谢谢你的帮助,但它似乎不起作用......我在“table.setModel(model);”之后添加了代码
  • @ParthaChetry it doesn't seem to work。当某些事情不起作用时,请发布一个正确的SSCCE 来证明问题。由于我们无权访问您的 Excel 数据,因此 SSCCE 不应包含与此相关的逻辑。相反,SSCCE 应该展示您正在尝试做的事情的“概念”。我发布了一个 SSCCE,表明这个概念确实有效。我不知道你的代码有什么不同。
  • 我会记住这一点......但是我现在可以正常工作了......谢谢你的帮助......接下来我需要使复选框可编辑:)
猜你喜欢
  • 2011-09-04
  • 1970-01-01
  • 1970-01-01
  • 2017-04-01
  • 2012-10-30
  • 1970-01-01
  • 2015-11-22
  • 2015-03-17
  • 1970-01-01
相关资源
最近更新 更多