【发布时间】: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.class或Float.class。否则,在您的ProgressCellRenderer.getTableCellRendererComponent方法中,您的if子句都不会被激活,progress将保持0。 -
谢谢,我试试这个。这是我不太确定的一件事。
标签: java swing jtable progress-bar renderer