JFrame如果不是public static void main渲染的就一片空白怎么办

walkuere 2022-01-07 23:07:50

调用的函数完全一样

 

 

演示视频,经过多方测试

第一遍只要是从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);
	}



}

 

...全文
141 3 打赏 收藏 转发到动态 举报
写回复
用AI写文章
3 条回复
切换为时间正序
请发表友善的回复…
发表回复
walkuere 2022-01-08
  • 打赏
  • 举报
回复
walkuere 2022-01-08
  • 打赏
  • 举报
回复

解决方法,见
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

walkuere 2022-01-08
  • 打赏
  • 举报
回复

我知道了,public static void main占了主线程,和actionPerformed是不一样的,所以

我看人家用javax.swing.SwingUtilities.invokeLater
我这个软件基本就我自己用,而且对界面友好要求一向不高,现在弹出一个白框也行,setTitle请等待,还是可以的

51,411

社区成员

发帖
与我相关
我的任务
社区描述
Java相关技术讨论
javaspring bootspring cloud 技术论坛(原bbs)
社区管理员
  • Java相关社区
  • 小虚竹
  • 谙忆
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧