2015-05-05 48 views
1

我想要做的是在过程发生时显示带有进度栏的新面板。JPanel直到代码后才显示

我的代码如下:

case "GoButton": 
    cards.show(this, "pp"); 
    this.test(); 
    cards.show(this, "panel1"); 
    break; 

这是一个actionPerformed方法

但是当我运行它只是忽略了第一cards.show程序,它执行test代码,然后它执行秒cards.show

我还会为你提供其余的代码,以防你需要它

public CreatePanel(JFrame frame) { 
     ext = new ArrayList<>(); 
     files = new ArrayList<>(); 

     this.mainWindow = frame; 
     this.setSize(256, 256); 
     cards = new CardLayout(); 
     this.setLayout(cards); 

     panel1 = new JPanel(null); 
     createPanel1(panel1); 
     this.add(panel1, "panel1"); 

     panel2 = new JPanel(null); 
     createPanel2(panel2); 
     this.add(panel2, "panel2"); 

     panel3 = new JPanel(null); 
     createPanel3(panel3); 
     this.add(panel3, "pp"); 

     cards.show(this, "panel1"); 
    } 

public class ProgressPanel { 
    private static JPanel panel; 
    private static JProgressBar progressBar; 
    private static int progress; 

    public static JPanel createProgressPanel(){ 
     ProgressPanel.panel = new JPanel(null); 
     ProgressPanel.initPanel(); 
     return ProgressPanel.panel; 
    } 

    private static void initPanel(){ 
     panel.setLayout(new GridBagLayout()); 
     GridBagConstraints c = new GridBagConstraints(); 

     progressBar = new JProgressBar(0, 100); 
     progressBar.setValue(progress); 
     progressBar.setStringPainted(true); 
     panel.add(progressBar, c); 
    } 

    public static void updateProgress(int x){ 
     ProgressPanel.progress += x; 
    } 

    public void resetProgress(){ 
     this.progress = 0; 
    } 
} 
+0

'panel3 = new JPanel(null);'Java GUIs必须在不同的操作系统上工作',屏幕大小,屏幕分辨率等使用不同语言环境中的不同PLAF。因此,它们不利于像素的完美布局。请使用布局管理器或[它们的组合](http://stackoverflow.com/a/5630271/418556)以及[white space]的布局填充和边框(http://stackoverflow.com/a/17874718/ 418556)。 –

回答

5

你可能喜欢这里的问题:this.test();。我敢打赌,这种方法会调用长时间运行的代码,并且由于它在Swing事件线程上被调用,所以它将阻止您的GUI自动更新并实际上完全冻结GUI。解决方案:为长时间运行的任务使用SwingWorker或其他后台线程。请看Concurrency in Swing

请注意,如果你使用的SwingWorker,你需要使用时,后台线程已经完成,并通知任何一个PropertyChangeListener或done()方法,它的时间打电话cards.show(this, "panel1");。我自己,我会为我的SwingWorker添加一个PropertyChangeListener,既然这样,我既可以监听监听器的完成,也可以监听worker的progress属性中的更改,然后使用该值设置我的JProgressBar的值。

+0

嗯,我会研究它,我会明天应用更改,让你知道。感谢您的快速回复! –

相关问题