在Java Swing中,我正在将一个JavaFX UI回退至Swing。
在我的UI中,有一个包含进度条的任务表格。当某个任务的长度不确定时,我希望使用一个不确定进度条。但遗憾的是,我无法在表格内部使不确定进度条动画化。
GPT-4已经在这个网站上搜索了许多示例,但都没有奏效。
我已经构建了一个示例。它绘制了一个带有动画不确定进度条的UI。每隔5秒,它会向表格添加一个进度条——在新进度条和顶部动画进度条之间交替添加。
然而,表格中的进度条均未动画化。更奇怪的是,如果我把顶部的进度条添加到表格中,那么该进度条在顶部也会停止动画。
这是怎么回事?
import java.awt.BorderLayout;
import java.awt.Component;
import java.awt.Dimension;
import java.awt.EventQueue;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.JProgressBar;
import javax.swing.JScrollPane;
import javax.swing.JTable;
import javax.swing.UIManager;
import javax.swing.table.DefaultTableModel;
import javax.swing.table.TableCellRenderer;
import javax.swing.table.TableColumnModel;
@SuppressWarnings("serial")
public class TestSwing extends JPanel implements TableCellRenderer {
String[] header = {"进度"};
DefaultTableModel tableModel = new DefaultTableModel(null, header) {
@Override
public Class<?> getColumnClass(int col) {
return getValueAt(0, col).getClass();
}
};
JTable table = new JTable(tableModel);
JProgressBar bar = new JProgressBar();
public TestSwing() {
bar.setIndeterminate(true);
TableColumnModel columnModel = table.getColumnModel();
columnModel.getColumn(0).setCellRenderer(this);
setLayout(new BorderLayout());
add(bar, BorderLayout.NORTH);
JScrollPane scroll = new JScrollPane(table);
scroll.setVerticalScrollBarPolicy(JScrollPane.VERTICAL_SCROLLBAR_AS_NEEDED);
add(scroll, BorderLayout.CENTER);
}
@Override
public Component getTableCellRendererComponent(JTable table, Object value, boolean isSelected, boolean hasFocus, int row, int column) {
return bar;
}
protected void update() {
while (true) {
try {
Thread.sleep(5000);
} catch (Exception e) {}
EventQueue.invokeLater(() -> {
tableModel.addRow(new Object[] {Boolean.TRUE});
});
}
}
public static void main(String[] args) throws Exception {
UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName());
EventQueue.invokeLater(new Runnable() {
@Override
public void run() {
JFrame f = new JFrame();
f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
TestSwing list = new TestSwing();
f.add(list);
f.setSize(new Dimension(300, 500));
f.setLocationRelativeTo(null);
f.setVisible(true);
Thread updater = new Thread(() -> list.update(), "List Updater");
updater.setDaemon(true);
updater.start();
}
});
}
}
这个问题在这个网站上出现过几次:
我尝试按照一个被接受的答案更新表格模型。
我也尝试了按照另一个答案重绘表格。
甚至尝试根据第三个问题的被接受答案,在TableCellRenderer中为不确定进度行返回不同的进度条。
最后,在构建这个简化问题时,我发现一旦进度条被添加到表格中,即使是正常工作的不确定进度条也会停止动画。
如果这个代码在你的虚拟机(VM)上可以正常工作,请告知你使用的环境。因为它在我的所有环境中都无法正常运行。