我想在新的JDialog中制作JProgressBar,女巫将与主逻辑分开.因此,只需创建新的JDialog并完成处理JDialog的进度,我就可以开始不确定的进步.但它让我很难实现这一点,因为在JDialog出现之后它不会显示任何组件(包括JProgressBar),直到主线程(SwingUtilities)中的逻辑完成.
线程包括JDialog:
package gui.progress;
public class ProgressThread extends Thread {
private ProgressBar progressBar = null;
public ProgressThread() {
super();
}
@Override
public void run() {
progressBar = new ProgressBar(null);
progressBar.setVisible(true);
}
public void stopThread() {
progressBar.dispose();
}
}
Run Code Online (Sandbox Code Playgroud)
JProgressBar切换方法:
private static ProgressThread progressThread = null;
...
public static void toggleProcessBar() {
if(progressThread == null) {
progressThread = new ProgressThread();
progressThread.start();
} else {
progressThread.stopThread();
progressThread = null;
}
}
Run Code Online (Sandbox Code Playgroud) 我只是尝试迭代循环并更新循环JProgressBar内部的值,启动SwingUtilities.invokeLater..但它只在完成后更新.下面是我的简单代码:
import java.awt.Color;
import java.awt.Rectangle;
import javax.swing.JApplet;
import javax.swing.JButton;
import javax.swing.JPanel;
import javax.swing.JProgressBar;
import javax.swing.SwingUtilities;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
public class ProgressBar extends JApplet {
JProgressBar pg = null;
JPanel panel = null;
JButton start = null;
int i;
public void init() {
pg = new JProgressBar(0, 100);
pg.setStringPainted(true);
this.setSize(1200, 600);
this.setLayout(null);
panel = new JPanel();
panel.setLayout(null);
panel.setBackground(Color.white);
this.setContentPane(panel);
this.setVisible(true);
pg.setBounds(new Rectangle(630, 20, 150, 30));
add(pg);
start = new JButton("start");
start.setBounds(new Rectangle(330, 20, 200, 30));
start.setBackground(Color.lightGray); …Run Code Online (Sandbox Code Playgroud) 我想让用户了解I/O操作的进度.目前我有一个内部课程,在我启动I/O之前启动,并在完成后停止.它看起来像这样:
class ProgressUpdater implements Runnable {
private Thread thread;
private long last = 0;
private boolean update = true;
private long size;
public ProgressUpdater(long size) {
this.size = size;
thread = new Thread(this);
}
@Override
public void run() {
while (update) {
if (position > last) {
last = position;
double progress = (double) position / (double) size * 100d;
parent.setProgress((int) progress);
}
}
}
public void start() {
thread.start();
}
public void stop() {
update = false;
parent.setProgress(100);
} …Run Code Online (Sandbox Code Playgroud) java swing multithreading jprogressbar event-dispatch-thread
我已经制作了一个非常简单的代码来显示它,我有一个按钮,应该显示一个JDialog来检查进度状态,我使用调用后期通过EDT而我的循环不在run方法中,所以为什么不是我的酒吧更新?这是代码
import javax.swing.JButton;
import javax.swing.JDialog;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.JProgressBar;
import javax.swing.JTextField;
import javax.swing.SwingUtilities;
import java.awt.BorderLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
public class JBarEx extends JFrame {
private JTextField progStatus = new JTextField("Undefined");
private JButton dialogBtn = new JButton("Show Progression dialog");
final JDialog dlg = new JDialog((JFrame) null, "prog Title", false);
final JProgressBar dpb = new JProgressBar(0, 100);
public JBarEx() {
JPanel pan = new JPanel();
dialogBtn.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
// TODO Auto-generated …Run Code Online (Sandbox Code Playgroud) 我正在尝试将JProgressBar添加到一个简单的程序中以便学习.到目前为止,我可以显示它,但它添加了多个实例,而我只想一个显示.
这是代码:
package package1;
import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.Font;
import java.awt.Graphics;
import javax.swing.JPanel;
import javax.swing.JProgressBar;
public class Opening extends JPanel {
private JProgressBar loadingBar;
private Thread t;
public void paintComponent(Graphics g)
{
super.paintComponent(g);
//Loading bar
bar();
}
private void bar()
{
loadingBar = new JProgressBar();
t = new Thread(new LoadMyBar());
this.add(loadingBar).setLocation(25, 600);
loadingBar.setSize(625, 25);
loadingBar.setStringPainted(true);
loadingBar.setValue(0);
loadingBar.setMinimum(0);
loadingBar.setMaximum(100);
t.start();
}
class LoadMyBar implements Runnable
{
public void run(){
for(int i = loadingBar.getMinimum(); i <= loadingBar.getMaximum(); i++)
{
loadingBar.setValue(i);
try …Run Code Online (Sandbox Code Playgroud) 我正在练习Swing,当用户按下"开始下载"按钮时,我编写了一个下载进度条来下载图像.下载工作.问题是在我的终端中,我可以看到同一个事件(propertyChange)被多次触发,每次后续下载的次数都会增加.我用检查点调试了我的代码,但我仍然不确定为什么会发生这种情况.
更具体地说,在我的终端我看到了类似的东西
...100% completed
...100% completed
...100% completed
...100% completed
...100% completed
...100% completed
...100% completed
Run Code Online (Sandbox Code Playgroud)
当我希望看到"...... 100%完成"只有一次.每次下载时,显示的"... 100%已完成"的数量会累积.我不确定这是否会影响我的下载性能,但我想知道为什么会发生这种情况.
ProgressBar.java:
package download_progress_bar;
import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
public class ProgressBar {
private JFrame frame;
private JPanel gui;
private JButton button;
private JProgressBar progressBar;
public ProgressBar() {
customizeFrame();
createMainPanel();
createProgressBar();
createButton();
addComponentsToFrame();
frame.setVisible(true);
}
private void customizeFrame() {
// Set the look and feel to the cross-platform look and feel
try {
UIManager.setLookAndFeel(UIManager.getCrossPlatformLookAndFeelClassName());
} catch (Exception e) { …Run Code Online (Sandbox Code Playgroud) 我正在jframe中运行AudioInputStream.我在jframe上有一个进度条.我将jproggressbar命名为"bar".我正在尝试获取进度条以跟踪AudioInputStream通过一首歌的距离.我尝试了一个循环,但是我尝试的每一种方式,循环最终使jframe冻结.然后,我无法完成其他任务,如关闭窗口或暂停AudioInputStream直到歌曲结束.有人可以帮帮我吗?
我一直JProgressBars在java中工作的时间不长,而且我所看到的将其设置为漂亮的每个资源都不起作用.我想要的是应用程序,您将看到整个进度条从上到下填充,当值增加时,动画随着大小的增加而播放.我现在拥有的是JProgressBar当它增加值时,它没有动画,当它有一个偏移到右上角时,如下所示:

如你所见,它很难看.我怎样才能看到完整的边框,整个填充和动画JProgressBar?
所以我的JProgressBar设置不按我想要的方式工作.因此,每当我运行程序时,它立即从0变为100.我尝试使用一个ProgressMonitor任务,并尝试了一个SwingWorker但我没有尝试过的工作.
这是我的计划:
int max = 10;
for (int i = 0; i <= max; i++) {
final int progress = (int)Math.round(
100.0 * ((double)i / (double)max)
);
EventQueue.invokeLater(new Runnable() {
@Override
public void run() {
try {
Thread.sleep(1000);
} catch (InterruptedException ex) {
Logger.getLogger(BandListGenerator.class.getName()).log(Level.SEVERE, null, ex);
}
jProgressBar2.setValue(progress);
}
});
}
Run Code Online (Sandbox Code Playgroud)
@MadProgrammer这是我尝试制作一个摇摆工作者并将每个名字写入文档并更新进度条.程序达到86%左右并停止,从不创建完成的文档.该程序创建一个空白文档.以下是两种方法,首先是我制作的SwingWorker对象:
public class GreenWorker extends SwingWorker<Object, Object> {
@Override
protected Object doInBackground() throws Exception {
int max = greenList.size();
XWPFParagraph tmpParagraph;
XWPFRun tmpRun; …Run Code Online (Sandbox Code Playgroud) 我有一个使用JPA的项目J2SE.在一些JDialogs中,我会getResultList()在类的构造函数中返回并填充JTable,JComboBox,JList等.
因此,当我为这些对话框创建任何实例时,有时会很慢.
我认为使用SwingWorker和JProgressbar创建一个(加载)打开JDialogs是一个很好的解决方案,但我不知道该怎么做.
我正在尝试这个.
//
JProgressbar progress = new JProgressBar();
//custommer dialog
JDialog custommer = new JDialog(); //here slow because I have List<Customer> and others lists
custommer.setModal(true);
private void openDialogs(JDialog dialog){
progress.setVisible(true);
progress.setIndeterminate(true);
SwingWorker sw = new SwingWorker(){
protected Object doInBackground(){
//opening dialog
dialog.setVisible(true);
return null;
}
}
//after opened
protected void done(){
progress.setVisible(false);
}
}
Run Code Online (Sandbox Code Playgroud)
如何打开JDialog并创建一个用SwingWorker和JProgressbar打开的加载?
java ×10
jprogressbar ×10
swing ×10
swingworker ×2
animation ×1
applet ×1
concurrency ×1
invokelater ×1
java-2d ×1
jdialog ×1
jframe ×1
thread-sleep ×1