【问题标题】:How to display progress column in Java Table如何在 Java Table 中显示进度列
【发布时间】:2018-02-09 11:25:40
【问题描述】:

所以我正在创建一个包含三列的项目;一个是复选框列,第二个是字符串(单词形成 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 来显示此列,但是当我运行它时,您可以看到第一个和第二个,但看不到进度条列。我希望它看起来像这样:

我还有一个没有完全实现的进度工作者类。

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;
        }

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

【问题讨论】:

  • 您的示例已损坏,我们没有您的数据库,并且您填充DefaultTableModel 的方法对我们不起作用。您提供的代码似乎根本没有用数据填充模型。如果我使用虚拟数据创建虚拟TableModel 并将ProgressCellRender 设置为单元格渲染器,它会正确显示。
  • 抱歉我不能提供一些代码,因为它包含机密数据
  • 我不介意随机数据的例子
  • 在您的 DefaultTableModel.getColumnClass 方法中,您不应返回 JProgressBar.class,而应返回 Integer.classFloat.class。否则,在您的ProgressCellRenderer.getTableCellRendererComponent 方法中,您的if 子句都不会被激活,progress 将保持0
  • 谢谢,我试试这个。这是我不太确定的一件事。

标签: java swing jtable progress-bar renderer


【解决方案1】:

因为您发布的代码不是独立的,所以我一起设置了一个最小测试 与您已经发布的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);
    }
}

然后JProgressBars 在表格中正确呈现:

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

【讨论】:

  • 谢谢,这很有用,但我还有另一个问题。所以基本上我在这个框架中有一个按钮,但是通过使用 initGUI 和 swing 实用程序,按钮没有显示出来。有没有办法将表格向下移动一点并在其上方添加一个按钮?
  • @DavidGardener 如果您还有其他问题,请打开一个新问题。
猜你喜欢
  • 1970-01-01
  • 2011-09-18
  • 1970-01-01
  • 2022-12-09
  • 2018-01-23
  • 2023-04-09
  • 1970-01-01
  • 1970-01-01
  • 2018-11-27
相关资源
最近更新 更多