java - 如何在Java表格中显示进度列

标签 java swing jtable progress-bar renderer

所以我正在创建一个包含三列的项目;第一个是复选框列,第二个是字符串(形成 Neo4j 数据库的单词),第三个是进度条。

所有列都显示并且工作正常,但进度栏列看起来不可见。这是一些代码:

    //CONSTRUCTOR
        public BiogramTableJSedit2Jan9()
        {   
            //*************************************************
            //* SETTING UP THE FORM                      *                                          
            //*************************************************
            setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
            setBounds(200,200,800,300);
            setTitle("Netword Data Table");
            getContentPane().setLayout(null);

            //*************************************************


        //********************************************
                //CREATING TABLE BLOCK                       *
                //********************************************

                //ADD SCROLLPANE
                JScrollPane scroll=new JScrollPane();
                scroll.setBounds(70,80,600,200);
                getContentPane().add(scroll);

                //THE TABLE
                final JTable table=new JTable();
                scroll.setViewportView(table);


                //THE MODEL OF THE TABLE
                DefaultTableModel model=new DefaultTableModel()  
                {
                    //****************************************
                    //* SETTING TABLE COLUMNS BLOCK          * 
                    //****************************************
                    public Class<?> getColumnClass(int column)  
                    {
                        switch(column)
                        {
                        case 0:                             // |This is the first column
                            return Boolean.class;           // |First column is set to Boolean as it will contain check boxes
                        case 1:                             // |This is the second column
                            return String.class;            // |Second column set to String as it will contain strings
                        case 2:
                            return JProgressBar.class;      // |This is for the progress bar column (IN PROGRESS - NOT DISPLAYED YET...) 

                        default:
                            return String.class;            // |The table is set to String as default 
                        }
                    }
                };


                //Create and run the query in the table         
                neoQuery= Q1();
                resultVariable = session.run(neoQuery.get());   



                //ASSIGN THE MODEL TO TABLE 
                table.setModel(model);

                model.addColumn("Select");                  // |Column for check boxes
                model.addColumn("Bigrams");                 // |Column for Bigrams

                table.getColumn("Status").setCellRenderer(new ProgressCellRender());

                //**********************************************
ProgressWorker worker = new ProgressWorker(model); //HAVE AN ERROR HERE
worker.execute();

这是进度渲染器类:

//a table cell renderer that displays a JProgressBar
public class ProgressCellRender extends JProgressBar implements TableCellRenderer {

  @Override
  public Component getTableCellRendererComponent(JTable table, Object value, boolean isSelected, boolean hasFocus, int row, int column) {
      int progress = 0;
      if (value instanceof Float) {
          progress = Math.round(((Float) value) * 100f);
      } else if (value instanceof Integer) {
          progress = (int) value;
      }
      setValue(progress);
      return this;
  }
}

现在您可以看到我正在使用 getColumn 来显示此列,但是当我运行它时,您可以看到第一个和第二个列,但看不到进度栏列。我希望它看起来与此类似:

JTable with progress bar column example

我还有一个未完全实现的进度 worker 类。

private static class ProgressWorker extends SwingWorker<Void, Integer> 
    { //Swing worker class for updating the progress bar

        private BiogramTableJSedit2Jan9 model;

        private final JProgressBar progress; //declaration for progress bar

        public ProgressWorker(JProgressBar model)
        { 
            this.progress = model;

        }

        @Override
        protected Void doInBackground() throws Exception {

            return null;
        }

如果有人能向我解释为什么口渴栏没有显示,我将不胜感激。感谢您提前回复。

最佳答案

因为您发布的代码不是独立的,所以我一起设置了一个最小的测试 与您已经发布的 ProgressCellRender 类一起使用。

重要的错误修复位于 DefaultTableModel 的方法 getColumnClass 中。 它需要返回 Integer.classFloat.class 因为只有那些可以 由您的 ProgressCellRender 处理。

当然,该列中的实际数据需要是IntegerFloat

public class Main {

    public static void main(String[] args) {
        SwingUtilities.invokeLater(Main::initGUI);
    }

    private static void initGUI() {
        JFrame frame = new JFrame("TableModel JProgressBar Demo");
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

        JScrollPane scroll = new JScrollPane();
        frame.getContentPane().add(scroll);

        final JTable table = new JTable();
        scroll.setViewportView(table);

        DefaultTableModel model = new DefaultTableModel() {
            public Class<?> getColumnClass(int column) {
                switch (column) {
                case 0:
                    return Boolean.class;
                case 1:
                    return String.class;
                case 2:
                    return Integer.class;  // !!!!
                default:
                    return String.class;
                }
            }
        };
        table.setModel(model);

        model.addColumn("Active");
        model.addColumn("Name");
        model.addColumn("Progress");

        table.getColumn("Progress").setCellRenderer(new ProgressCellRender());

        model.addRow(new Object[] { true, "aaaa", 14 });
        model.addRow(new Object[] { false, "bbbbbbbb", 0 });
        model.addRow(new Object[] { true, "ccccc", 2 });

        frame.pack();
        frame.setVisible(true);
    }
}

然后 JProgressBar 在表中正确呈现:

enter image description here

ProgessCellRender 中,您可能需要添加 setStringPainted(true); 以获取也呈现为文本的百分比。

关于java - 如何在Java表格中显示进度列,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48704786/

相关文章:

c# - 如何从同一个 XLIFF 翻译文件生成 .resx 和 .properties 文件

java - 从项目(ActionBar)启动 Activity ?

java - Java 中的监视器类

java - 同时关闭两个 JDialog

java - 使用 Regex 和 DefaultTableModel 将值插入到 JTable 中

java - 如何在 ImageView 中使用触摸获取实际图像坐标?

java repaint() 的不稳定行为(JPanel、JFrame)

java - 有什么方法可以屏蔽运行时进入 jText 区域的值

Java JTable AttributiveCellTableModel 添加行

java - 如何突出显示 jtable 单元格的文本?