【问题标题】:Creating thread java swing创建线程java swing
【发布时间】:2014-05-21 20:24:16
【问题描述】:

作为一个更大项目的一部分,我正在尝试创建一个线程,在 Java swing 中创建一个新的 Jframa,然后执行从一个文件夹到另一个文件夹的文件复制。为此,我创建了一个线程,并在其构造函数中构建了 GUI,并从它们的主线程开始执行线程。我的问题是新的 JFrame 在复制完成之前是空白的,它会显示标签、文本框等。如果我做错了什么,我无法理解,所以小脑袋将不胜感激

框架类:

public class FileCopyFrame extends JFrame{
    private void BuildGUI(final String sourcePath,final String targetPath) {
        setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        setBounds(100, 100, 665, 382);
        contentPane = new JPanel();
        contentPane.setBorder(new EmptyBorder(5, 5, 5, 5));
        setContentPane(contentPane);
        contentPane.setLayout(null);

        progressBar = new JProgressBar();
        progressBar.setBounds(10, 268, 631, 14);
        contentPane.add(progressBar);

        progressBar_all = new JProgressBar();
        progressBar_all.setBounds(10, 293, 631, 14);
        contentPane.add(progressBar_all);

        JScrollPane scrollPane = new JScrollPane();
        scrollPane.setBounds(10, 88, 631, 166);
        contentPane.add(scrollPane);

        textAreaAnnouncements = new JTextArea();
        scrollPane.setViewportView(textAreaAnnouncements);

        btnCancel = new JButton("Cancel");
        btnCancel.addMouseListener(new MouseAdapter() {
            @Override
            public void mouseClicked(MouseEvent arg0) {

            }
        });
        btnCancel.setBounds(267, 318, 89, 23);
        contentPane.add(btnCancel);

        final JLabel lblSourcePath = new JLabel("Source Path:");
        lblSourcePath.setFont(new Font("Tahoma", Font.PLAIN, 13));
        lblSourcePath.setBounds(10, 35, 78, 14);
        contentPane.add(lblSourcePath);

        final JLabel lblTargetPath = new JLabel("Target Path:");
        lblTargetPath.setFont(new Font("Tahoma", Font.PLAIN, 13));
        lblTargetPath.setBounds(10, 60, 78, 17);
        contentPane.add(lblTargetPath);

        textFieldSrcPth = new JTextField();
        textFieldSrcPth.setBounds(96, 32, 545, 20);
        contentPane.add(textFieldSrcPth);
        textFieldSrcPth.setText(sourcePath);
        textFieldSrcPth.setColumns(10);

        textFieldTrgPth = new JTextField();
        textFieldTrgPth.setBounds(96, 57, 545, 20);
        contentPane.add(textFieldTrgPth);
        textFieldTrgPth.setText(targetPath);
        textFieldTrgPth.setColumns(10);

    }

    public FileCopyFrame(String source,String path) {
           BuildGUI(source,path);
    }
}

线程类:

public class CopyThread extends Thread {
FileCopyFrame frame;
public CopyThread(ThreadOptions options){
        frame=new FileCopyFrame(destinationPath, destinationPath);
        frame.setVisible(true);
        current=frame.getProgressBarCurrent();
        All=frame.getProgressBarCurrentAll();
        this.textPane = frame.getTextAreaAnnouncements();
        setOptions(options);


    }


         public void run() {    
        try {
            Copy();     
        } catch (Exception e) {
            e.printStackTrace();
        }
    }

在主线程:

CopyThread thread=new CopyThread(options);
thread.run();

【问题讨论】:

  • 请参阅Concurrency in SwingHow to use Swing Worker。不要使用空布局,不要在按钮上使用 MouseListener,使用 ActionListener。不要使用 Thread.run,使用 Thread.start
  • @MadProgrammer 在发帖之前我已经阅读了这些内容。我更喜欢使用线程而不是 Swing Worker,因为一次只能运行一个 SwingWorker,而我希望同时使用多个线程。
  • @JmRag,你可以从 SwingWorker 运行多个线程。
  • 不,实际上您最多可以同时运行 10 个 SwingWorker,这就是重点。你现在做的事情违反了 Swing 的单线程特性,因此建议使用 SwibgWorker
  • 对于一个不错的复杂example

标签: java multithreading swing


【解决方案1】:

thread.run();

这不会启动一个新线程。这只是执行run() 方法。由于您可能是从事件调度线程 (EDT) 调用此代码,因此创建 GUI 和执行复制的代码也在 EDT 上执行,这意味着 GUI 在复制完成之前无法重新绘制自身。

要创建一个新线程,您应该这样做:

thread.start();

【讨论】:

  • 它成功了,我自己不会发现很多差异!
猜你喜欢
  • 2011-02-03
  • 1970-01-01
  • 2014-06-05
  • 1970-01-01
  • 2012-05-21
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多