GUI添加了组件,但显示时显示为空白

时间:2015-12-06 15:47:20

标签: java swing user-interface

出于某种原因,当我在main中运行代码时它可以工作,但是目前我只有在JButton

时运行代码

enter link description here

import java.awt.Color;
import java.util.Random;

import javax.swing.JFrame;
import javax.swing.JProgressBar;


public class JavaCompilingJOP {

    private JFrame framed = new JFrame();
    private JProgressBar bar = new JProgressBar(0,100); //0 through 100 is the compiling until reaches that number
    private Color startProgress = Color.RED;
    private int loadingPercent = 0;

    public JavaCompilingJOP(){
        framed.setLayout(null);
        framed.setSize(500, 200);
        framed.setTitle("Compiling JOptionPane...");
        framed.setLocationRelativeTo(null);
        //Ok now lets make the GUI happen boys!
        framed.getContentPane().setBackground(Color.BLACK); //Because startProgress is ze theme of ze game!

        bar.setForeground(startProgress);
        bar.setStringPainted(true);
        bar.setValue(loadingPercent);
        bar.setString(loadingPercent + "%");
        bar.setBounds(50, 50, 400, 100);
        framed.add(bar);

        System.out.println("Make visible an run!");

        framed.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);
        framed.setResizable(false);

        framed.setVisible(true);

        doTimer();
    }

    private void doTimer(){
        Random obj = new Random();
        for(int i = 0; i < 100; i++){
            loadingPercent++;
            bar.setValue(loadingPercent); //Updates counter
            bar.setString(loadingPercent + "%"); //Updates progressbar
            startProgress = new Color(startProgress.getRed()-2,startProgress.getGreen()+2,startProgress.getBlue());
            bar.setForeground(startProgress);
            try{Thread.sleep(100 + obj.nextInt(200));}catch(Exception E){}

        }
        System.out.println("Java compiled!");
        framed.setVisible(false);
    }
}

出于某种原因,我所得到的只是一个白色的屏幕似乎忽略了处理关闭,因为当我点击它关闭它时......它也没有。 请记住,当我在main中运行它时它可以工作,但是当在按钮的ActionListener内部时,它会给我一个空白屏幕,它仍然执行它的进度条。 我坚持这个。

1 个答案:

答案 0 :(得分:1)

您的JButton的 actionPerformed()代码在Java event dispatch thread (EDT)上执行,这就是GUI“冻结”并且您看到黑屏的原因。 这样做也会阻止执行“关闭”事件以及任何其他挥杆事件 重要:
EDT是一个特殊的线程,应该非常小心处理 请花点时间阅读 EDT 以及如何正确使用它here

正确的方法:
doTimer()应该从不在Java事件调度线程(EDT)上运行,因为它模拟(我希望)一些长期运行的任务。
为确保我们正确处理EDT,我们使用SwingWorker SwingWorkers是一种特殊的构造,旨在在后台线程中执行冗长的GUI交互任务 由于这是第一次处理有点棘手,我为您添加了以下代码:

@Override
public void actionPerformed(ActionEvent e) {
    SwingWorker<Object, Object> sw = new SwingWorker<Object, Object>() {
        @Override
        protected Object doInBackground() throws Exception {
            // Code here will be executed in a background thread
            // This is where all background activities should happen.
            doTimer();
            return null;
        }
    };
    sw.execute();
    //  doTimer(); Bad Idea as this will execute on EDT!
}