51,411
社区成员
发帖
与我相关
我的任务
分享调用的函数完全一样
演示视频,经过多方测试
第一遍只要是从public static void main去调用的,那么弹出的进度条就是可以正常显示
如果是actionPerformed进入的,那么JFrame进度条就一片空白
https://www.bilibili.com/video/BV1YL4y1t77L
不知谁能帮我调一下,可以远程协助
代码
package InitOnce;
import javax.swing.*;
import cqzg.voidMain;
import java.awt.*;
import java.awt.event.*;
import java.lang.reflect.*;
//https://www.cnblogs.com/qingxinblog/articles/3293303.html
//very thanks to this page
public class InitLoadingGauge {
public static InitLoadingGauge soloInstance=new InitLoadingGauge();
public JProgressBar progressBar=new JProgressBar(0,100);
public JLabel mjlProcess=new JLabel("");
public static void setProgress(int pnGauge,String psPhrase)
{
soloInstance.progressBar.setValue(pnGauge);
soloInstance.mjlProcess.setText(psPhrase);
soloInstance.mpWaitPop.validate();
soloInstance.mpWaitPop.requestFocus();
soloInstance.mpWaitPop.requestFocusInWindow();
}
public static void vLoadingGaugeEnd() {soloInstance.vOnInitLoadingFinished();}
int mnWidth=300,mnHeight=100;
public void init(JFrame PParentJFrame)
{
voidMain.gameInstance.setVisible(false);
this.mParentFrame=PParentJFrame;
// Initialize
//final JButton aJButton = new JButton("Start");
progressBar.setStringPainted(true); // 显示百分比字符
progressBar.setIndeterminate(false); // 不确定的进度条
//aJButton.addActionListener(actionListener);
//theFrame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
//Container contentPane = mpWaitPop.getRootPane();// getContentPane for JFrame
mpWaitPop.setLayout(new GridLayout(2,1));
//mpWaitPop.setLayout(null);
mpWaitPop.setLocationRelativeTo(null);
//mpWaitPop.getContentPane().setLayout(null);
mpWaitPop.setLocation((voidMain.jframex-mnWidth)/2,(voidMain.jframey-mnHeight)/2);
mpWaitPop.setSize(mnWidth, mnHeight);
//mpWaitPop.setBounds(200,200,500,500);
//mpWaitPop.setPreferredSize(new Dimension(22,4));
mpWaitPop.getContentPane().add(progressBar);
progressBar.setVisible(true);
progressBar.setBounds(0,0,mnWidth,100);
mjlProcess.setText("初始化");
mjlProcess.setBounds(0,100,mnWidth,200);
mpWaitPop.getContentPane().add(mjlProcess);
mjlProcess.setVisible(true);
//contentPane.add(aJButton);
mpWaitPop.pack();
mpWaitPop.validate();
mpWaitPop.setVisible(true);
}
JFrame mpWaitPop = new JFrame();
JFrame mParentFrame;
public void vOnInitLoadingFinished()
{
voidMain.gameInstance.add(voidMain.superPanel);
voidMain.superPanel.add(voidMain.gamePanel);
mpWaitPop.setVisible(false);
voidMain.gameInstance.setVisible(true);
}
}
解决方法,见
https://www.cnblogs.com/qingxinblog/articles/3293303.html
https://blog.csdn.net/sujianxin2012/article/details/45921087
我这里是按键之后,数据更新带动进度条更新,不再有其他处理,如果有后续处理,不知道行不行
start一个runnable,两层runnable,第一层改写数据,
runnalbe
```java
public void run() {
if (brunning==false)
return;
Runnable runner = new Runnable() {
public void run() {
if (!brunning)
return;
//int value = progressBar.getValue();
//progressBar.setValue(value+1);
System.out.println("repainting");
progressBar.setValue(56);
//progressBar.repaint();
//mjlProcess.repaint();
}
};
//这里改写数据用
boolean brunning=false;
}
```
第二层重画SetValue SetText
我知道了,public static void main占了主线程,和actionPerformed是不一样的,所以
我看人家用javax.swing.SwingUtilities.invokeLater
我这个软件基本就我自己用,而且对界面友好要求一向不高,现在弹出一个白框也行,setTitle请等待,还是可以的