- iOS/Objective-C 元类和类别
- objective-c - -1001 错误,当 NSURLSession 通过 httpproxy 和/etc/hosts
- java - 使用网络类获取 url 地址
- ios - 推送通知中不播放声音
我已将多个 JProgressBar
添加到 JTable
的 TableColumn
中。
我在进行某些计算后用数据更新所有 JProgressBar,但只有最后一个 ProgressBar
(在本例中为 ProgressBar
progressObj4
)已添加正在更新。
如何更新所有 ProgressBar
?
基本要求是我在上传时在进度条中显示文件的状态。目前我正在对 4 个进度条进行硬编码以测试是否所有进度条都根据文件的状态进行更新,但我需要动态创建它们。进度条总数与正在上传的文件数有关。另外,如何获取进度条的各个实例并更新它们的状态?
我附上添加到表格列的进度条的源代码。
//tc = object of TableColumn
progressObj1 = new ProgressBarRenderer("Progress1");
progressObj1.setValue(0);
progressObj1.setStringPainted(true);
progressObj1.setBackground(Color.WHITE);
progressObj1.setBorderPainted(true);
tc.setCellRenderer(progressObj1);
progressObj2 = new ProgressBarRenderer("Progress2");
progressObj2.setValue(0);
progressObj2.setStringPainted(true);
progressObj2.setBackground(Color.WHITE);
progressObj2.setBorderPainted(true);
tc.setCellRenderer(progressObj2);
progressObj3 = new ProgressBarRenderer("Progress3");
progressObj3.setValue(0);
progressObj3.setStringPainted(true);
progressObj3.setBackground(Color.WHITE);
progressObj3.setBorderPainted(true);
tc.setCellRenderer(progressObj3);
progressObj4 = new ProgressBarRenderer("Progress4");
progressObj4.setValue(0);
progressObj4.setStringPainted(true);
progressObj4.setBackground(Color.WHITE);
progressObj4.setBorderPainted(true);
tc.setCellRenderer(progressObj4);
最佳答案
基本上有两种方法可以通过使用 SwingWorker 来移动 JProgressBar
和 Runnable#Thread,SwingWorker
import java.awt.*;
import java.util.*;
import javax.swing.*;
import javax.swing.table.*;
public class TableCellProgressBar {
private String[] columnNames = {"String", "ProgressBar"};
private Object[][] data = {{"dummy", 100}};
private DefaultTableModel model = new DefaultTableModel(data, columnNames) {
private static final long serialVersionUID = 1L;
@Override
public Class<?> getColumnClass(int column) {
return getValueAt(0, column).getClass();
}
@Override
public boolean isCellEditable(int row, int col) {
return false;
}
};
private JTable table = new JTable(model);
public JComponent makeUI() {
TableColumn column = table.getColumnModel().getColumn(1);
column.setCellRenderer(new ProgressRenderer());
EventQueue.invokeLater(new Runnable() {
@Override
public void run() {
startTask("test");
startTask("error test");
startTask("test");
}
});
JPanel p = new JPanel(new BorderLayout());
p.add(new JScrollPane(table));
return p;
}
//http://java-swing-tips.blogspot.com/2008/03/jprogressbar-in-jtable-cell.html
private void startTask(String str) {
final int key = model.getRowCount();
SwingWorker<Integer, Integer> worker = new SwingWorker<Integer, Integer>() {
private int sleepDummy = new Random().nextInt(100) + 1;
private int lengthOfTask = 120;
@Override
protected Integer doInBackground() {
int current = 0;
while (current < lengthOfTask && !isCancelled()) {
if (!table.isDisplayable()) {
break;
}
if (key == 2 && current > 60) { //Error Test
cancel(true);
publish(-1);
return -1;
}
current++;
try {
Thread.sleep(sleepDummy);
} catch (InterruptedException ie) {
break;
}
publish(100 * current / lengthOfTask);
}
return sleepDummy * lengthOfTask;
}
@Override
protected void process(java.util.List<Integer> c) {
model.setValueAt(c.get(c.size() - 1), key, 1);
}
@Override
protected void done() {
String text;
int i = -1;
if (isCancelled()) {
text = "Cancelled";
} else {
try {
i = get();
text = (i >= 0) ? "Done" : "Disposed";
} catch (Exception ignore) {
ignore.printStackTrace();
text = ignore.getMessage();
}
}
System.out.println(key + ":" + text + "(" + i + "ms)");
}
};
model.addRow(new Object[]{str, 0});
worker.execute();
}
public static void main(String[] args) {
EventQueue.invokeLater(new Runnable() {
@Override
public void run() {
createAndShowGUI();
}
});
}
public static void createAndShowGUI() {
JFrame frame = new JFrame();
frame.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);
frame.getContentPane().add(new TableCellProgressBar().makeUI());
frame.setSize(320, 240);
frame.setLocationRelativeTo(null);
frame.setVisible(true);
}
}
class ProgressRenderer extends DefaultTableCellRenderer {
private final JProgressBar b = new JProgressBar(0, 100);
public ProgressRenderer() {
super();
setOpaque(true);
b.setBorder(BorderFactory.createEmptyBorder(1, 1, 1, 1));
}
@Override
public Component getTableCellRendererComponent(JTable table, Object value, boolean isSelected, boolean hasFocus, int row, int column) {
Integer i = (Integer) value;
String text = "Completed";
if (i < 0) {
text = "Error";
} else if (i < 100) {
b.setValue(i);
return b;
}
super.getTableCellRendererComponent(table, text, isSelected, hasFocus, row, column);
return this;
}
}
关于java - 将多个 JProgressBar 添加到 JTable 的 TableColumn,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7036036/
String[] titles = {"System Code","Domain Name","Organizational Unit","Organization Name"}; f
我在填充 javafx tableview 时遇到问题。 我目前正在开发基于 GUI 的事件管理工具(适用于大学),但我一直在尝试填充 Tableview 列表,该列表应该位于边框 Pane 布局的中
当我在 JavaFX 中生成表格时,列太大,我想在它出现在我的应用程序上时调整它们的大小以减少它们。我读了 stackOverflow 上的那些文章,这些文章很有用,但对我没有帮助:javafx co
我有一个账单表,我想在其中列出账单上的所有产品。我保存了ProductInBill ArrayList 内的对象在账单上。 当我创建TableView时我的常用方法是创建 JavaFX 字段。在 Co
我正在尝试使用 javaFX Scene builder 获取可编辑表的值,但无法获取更新的值。 我的表有 2 列:名称列和值列。每当用户更改 value 列的值时,我想使用react。 但是当我打印
我正在使用 JavaFX 制作表格。每行都有文字。一行有一个图形,因为该单元格的文本有多种颜色。 该代码仅在特定条件为真时才适用(该部分有效): departTimeCol.setCellFactor
我有一个包含三列的表,我想确保列的总宽度等于表的宽度,因此我使用 CONSTRAINED_RESIZE_POLICY。 我希望列以我指定的宽度开始,但用户可以修改。 如果我这样做: albumTabl
我正在制作一个使用表格 View 的程序。一切都很顺利,除了由于某种原因我无法将整数值填充到表中。下面是我在主程序中的代码,当我运行程序时,字符串和 double 会填充,但整数不会。在我的 Prod
我正在为我的 TableColumns 创建一个自定义标题,它是列的标签加上一个允许用户执行搜索的 TextField。我正在像这样设置列标题: getColumns().addListener(ne
我在调整包含环绕 TableCell 项目的文本项目的 TableView 大小时遇到问题。调整大小时,隐藏值会调整大小,但可见项不会重新计算文本换行。 红色框中的推文在调整大小时被隐藏,并按预期
要点 在 JavaFX TableColumn 中,右侧有一个排序箭头。 如何设置此箭头的对齐方式? 我的用例 我问是因为我正在尝试申请 Material Design到 JavaFX 并且箭头需要在
在 OpenJFX 11.0.2 & 12.0.1 SDK (Windows 10, x64) 中复制,不能在 JavaFX 8 中复制 右键单击表列,然后尝试调整列的大小。不会显示调整大小光标,并且
这是我的问题: 为 TableColumn 的默认排序设置自定义排序算法。 背景:作为示例列,我想使用将 IPv4 地址表示为 String 的列。因此默认排序是字典顺序(1.1.1.1、1.1.1.
有没有办法阻止用户调整TableView中的任何或至少所有JavaFX TableColumn的大小,同时仍然允许调整大小策略起作用? 存在 TableColumn::setResizing,但在阻止
我正在替换表列的 javafx 上下文菜单。上下文菜单将使用户能够访问 excel,例如表格 View 的过滤。一切正常,但我现在不想在列标题上的任何鼠标单击事件上打开上下文菜单。不仅仅是标准的右键单
以下场景:下表/列中有一些行具有长字符串值。我想出了如何通过手动调用“setCellFactory”并将“text.wrappingWidthProperty()”绑定(bind)到列的宽度来解决包装
我有追随者 http://code.makery.ch/library/javafx-8-tutorial/part2/并且在 TableColumn 中有一个使用 lambdas 的代码设置值: f
有人可以解释我的代码有什么问题吗? 我想创建一个简单的 swt 表。 Eclipse 注意到 TableColumn 是未定义的: TableColumn column = new Table
private float[] cwidth = { 0.1f, 0.3f, 0.3f, 0.2f, 0.1f }; setAutoResizeMode(JTable.AUTO_RESIZE_OFF)
我正在 Gluon Scene Builder 中构建一个 TableView。我想为每列中的单元格设置不同的背景颜色。我能否仅通过 FXML 文件和 CSS 来完成此操作? 使用 CSS 样式类 .
我是一名优秀的程序员,十分优秀!