如何在 Java Table 中显示进度栏

How to display progress column in Java Table

所以我正在创建一个包含三列的项目;一个是复选框列,第二个是字符串(单词形成一个 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();

这是进度渲染器class:

//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 来显示此列,但是当我 运行 它时您可以看到第一列和第二列,但看不到进度条列。我希望它看起来像这样:

我还有一个进度条class没有完全实现

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 class.

重要的错误修复在 DefaultTableModel 的方法 getColumnClass 中。 它需要 return 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);
    }
}

然后 JProgressBars 在 table 中正确呈现:

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