为什么我的相框没有任何显示?

尤金

我要在关闭主框架时显示进度栏窗口。但是,进度条窗口将什么也不显示,我对此一无所知。这是代码。

import java.awt.BorderLayout;
import java.awt.EventQueue;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;

import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.border.EmptyBorder;

public class MainFrame {
    public static void main(String[] args) {
        EventQueue.invokeLater(new Runnable() {

            @Override
            public void run() {
                // TODO Auto-generated method stub
                MainFrame mainFrame = new MainFrame();
                mainFrame.createUI();
            }
        });
    }
    public void createUI(){
        JFrame frame = new JFrame();
        JPanel mainPanel = new JPanel(new BorderLayout());
        JButton button = new JButton("Close");
        button.setBorder(new EmptyBorder(20, 20, 20, 20));
        button.addActionListener(new ButtonListener());
        mainPanel.add(button,BorderLayout.CENTER);
        frame.add(mainPanel,BorderLayout.CENTER);
        frame.setLocationRelativeTo(null);
        frame.pack();
        frame.setVisible(true);
    }

    class ButtonListener implements ActionListener{

        @Override
        public void actionPerformed(ActionEvent arg0) {
            // TODO Auto-generated method stub
            FeedbackBox feedbackBox = new FeedbackBox();
            feedbackBox.createUI();
            feedbackBox.increment(0, 100);
            try {
                feedbackBox.getThread().join();
            } catch (InterruptedException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }
            feedbackBox.closeBox();
        }

    }
}

进度栏窗口为:

import java.awt.BorderLayout;
import java.awt.Color;

import javax.swing.BorderFactory;
import javax.swing.Box;
import javax.swing.BoxLayout;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.JProgressBar;

public class FeedbackBox {
    private JFrame frame;
    private JProgressBar progressBar;

    Thread thread;

    public void createUI(){
        frame = new JFrame("Reminder");
        MainPanel mainPanel = new MainPanel();
        frame.add(mainPanel,BorderLayout.CENTER);
        frame.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);
        frame.setResizable(false);
        frame.setLocationRelativeTo(null);
        frame.pack();
        frame.setVisible(true);
    }

    public JProgressBar getProgressBar(){
        return progressBar;
    }

    public void closeBox(){
        frame.dispose();
    }

    public void increment(final int minimum,final int maximum){
        thread = new Thread(new Runnable() {

            @Override
            public void run() {
                // TODO Auto-generated method stub
                for (int i = minimum; i <= maximum; i++) {
                    getProgressBar().setValue(i);
                    try {
                        Thread.sleep(30);
                    } catch (InterruptedException e) {
                        // TODO Auto-generated catch block
                        e.printStackTrace();
                    }
                }
            }
        });

        thread.start();
    }

    public Thread getThread(){
        return thread;
    }

    @SuppressWarnings("serial")
    class MainPanel extends JPanel{
        public MainPanel(){
            setLayout(new BoxLayout(this, BoxLayout.Y_AXIS));
            setBorder(BorderFactory.createEmptyBorder(15, 15, 15, 15));

            progressBar = new JProgressBar();
            progressBar.setStringPainted(true);
            progressBar.setIndeterminate(true);
            progressBar.setBackground(Color.white);
            progressBar.setForeground(Color.blue);
            JPanel topPanel = new JPanel();
            topPanel.add(progressBar);

            JLabel label = new JLabel("It is closing. ");
            label.setForeground(Color.blue);
            label.setBackground(Color.WHITE); 
            JPanel bottomPanel = new JPanel();
            bottomPanel.add(label);

            add(topPanel);
            add(Box.createVerticalStrut(10));
            add(bottomPanel);
        }
    }
}

如果我删除

try {
        feedbackBox.getThread().join();
    } catch (InterruptedException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
}
feedbackBox.closeBox();

然后一切都会好起来的。为什么?感谢您的帮助。

基于@Hovercraft鳗鱼的帮助。我已经修改了我的代码。但是,有线的东西仍然在这里。除非我手动关闭进度栏窗口,否则不会调用void propertyChange。

import java.awt.BorderLayout;
import java.awt.EventQueue;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;

import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.border.EmptyBorder;

public class MainFrame {
    private JFrame frame;

    public static void main(String[] args) {
        EventQueue.invokeLater(new Runnable() {

            @Override
            public void run() {
                // TODO Auto-generated method stub
                MainFrame mainFrame = new MainFrame();
                mainFrame.createUI();
            }
        });
    }
    public void createUI(){
        frame = new JFrame();
        JPanel mainPanel = new JPanel(new BorderLayout());
        JButton button = new JButton("Close");
        button.addActionListener(new ButtonListener());
        button.setBorder(new EmptyBorder(20, 20, 20, 20));
        mainPanel.add(button,BorderLayout.CENTER);
        frame.add(mainPanel,BorderLayout.CENTER);
        frame.setLocationRelativeTo(null);
        frame.pack();
        frame.setVisible(true);
    }

    class ButtonListener implements ActionListener{

        @Override
        public void actionPerformed(ActionEvent arg0) {
            // TODO Auto-generated method stub
            FeedbackBox feedbackBox = new FeedbackBox(frame,0,100,"It is closing");
            feedbackBox.displayDialog();
        }

    }
}


import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.Window;
import java.awt.Dialog.ModalityType;
import java.beans.PropertyChangeEvent;
import java.beans.PropertyChangeListener;

import javax.swing.BorderFactory;
import javax.swing.Box;
import javax.swing.BoxLayout;
import javax.swing.JDialog;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.JProgressBar;
import javax.swing.SwingWorker;


public class FeedbackBox {
    private JDialog dialog;
    private MyWorker myWorker;
    private JProgressBar progressBar = new JProgressBar();

    public FeedbackBox(Window win,int minimum,int maximum,String title){
        myWorker = new MyWorker(minimum, maximum);
        MainPanel mainPanel = new MainPanel(minimum,maximum);
        myWorker.addPropertyChangeListener(new MyWorkerListener());
        dialog = new JDialog(win,title,ModalityType.APPLICATION_MODAL);
        dialog.add(mainPanel,BorderLayout.CENTER);
        dialog.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);
        dialog.setResizable(false);
        dialog.setLocationRelativeTo(win);
        dialog.pack();
    }

    public void displayDialog(){
        dialog.setVisible(true);
        myWorker.execute();
    }

    public void closeBox(){
        dialog.dispose();
    }

    @SuppressWarnings("serial")
    class MainPanel extends JPanel{
        public MainPanel(int minimum,int maximum){
            setLayout(new BoxLayout(this, BoxLayout.Y_AXIS));
            setBorder(BorderFactory.createEmptyBorder(15, 15, 15, 15));

            progressBar.setMinimum(minimum);
            progressBar.setMaximum(maximum);
            progressBar.setStringPainted(true);
            progressBar.setIndeterminate(true);
            progressBar.setBackground(Color.white);
            progressBar.setForeground(Color.blue);
            JPanel topPanel = new JPanel();
            topPanel.add(progressBar);

            JLabel label = new JLabel("It is closing.");
            label.setForeground(Color.blue);
            label.setBackground(Color.WHITE); 
            JPanel bottomPanel = new JPanel();
            bottomPanel.add(label);

            add(topPanel);
            add(Box.createVerticalStrut(10));
            add(bottomPanel);
        }
    }

    class MyWorkerListener implements PropertyChangeListener{

        @Override
        public void propertyChange(PropertyChangeEvent evt) {
            // TODO Auto-generated method stub
            if (evt.getPropertyName().equals(MyWorker.VALUE)) {
                System.out.println("myWorker.getValue()" + myWorker.getValue());
                progressBar.setValue(myWorker.getValue());
            }
            if (evt.getNewValue() == SwingWorker.StateValue.DONE && dialog != null) {
                closeBox();
            }
        }
    }
}

    class MyWorker extends SwingWorker<Void, Void>{
        public static final String VALUE = "value";
        private int value;
        private int minimum;
        private int maximum;

        public MyWorker(int minimum,int maximum){
            this.minimum = minimum;
            this.maximum = maximum;
            value = minimum;
        }

        @Override
        protected Void doInBackground() throws Exception {
            // TODO Auto-generated method stub
            for (int i = minimum; i <= maximum; i++) {
                setValue(i);
                Thread.sleep(30);
            }
            return null;
        }

        public void setValue(int i){
            int oldValue = this.value;
            int newValue = i;
            this.value = i;
            firePropertyChange(VALUE, oldValue, newValue);
        }

        public int getValue(){
            return value;
        }
    }
充满鳗鱼的气垫船

通过将线程与Swing事件线程连接在一起,您可以将该线程设为非后台线程,从而绑住Swing事件线程,从而阻止其完成工作-绘制GUI并与用户进行交互,这将冻结您的线程对话框窗口(顺便说一句,它应该是一个JDialog而不是一个单独的JFrame)。解决方案:不要加入线程。另外,您的后台线程不应像当前那样更改Swing组件的状态。最好使用SwingWorker允许您将Swing事物保留在事件线程中,将背景事物保留在后台线程中。

有关详细信息,请阅读课程:Swing中的并发-Oracle文档

例如:

import java.awt.Window;
import java.awt.Dialog.ModalityType;
import java.awt.event.ActionEvent;
import java.beans.PropertyChangeEvent;
import java.beans.PropertyChangeListener;
import java.util.concurrent.ExecutionException;

import javax.swing.*;

@SuppressWarnings("serial")
public class ClosingDialogPanel {
   private JPanel mainPanel = new JPanel();
   private JProgressBar progressBar = new JProgressBar();
   private JDialog dialog;
   private MyWorker myWorker;

   public ClosingDialogPanel(Window win, int minimum, int maximum, String title) {
      myWorker = new MyWorker(minimum, maximum);
      progressBar.setMinimum(minimum);
      progressBar.setMaximum(maximum);
      myWorker.addPropertyChangeListener(new WorkerListener());
      progressBar.setStringPainted(true);
      mainPanel.add(progressBar);
      dialog = new JDialog(win, title, ModalityType.APPLICATION_MODAL);
      dialog.add(mainPanel);
      dialog.pack();
      dialog.setLocationRelativeTo(win);
   }

   public void displayDialog() {
      myWorker.execute();
      dialog.setVisible(true);
   }

   private class WorkerListener implements PropertyChangeListener {
      @Override
      public void propertyChange(PropertyChangeEvent evt) {
         if (MyWorker.VALUE.equals(evt.getPropertyName())) {
            progressBar.setValue(myWorker.getValue());
         }
         if (evt.getNewValue() == SwingWorker.StateValue.DONE) {
            if (dialog != null && dialog.isVisible()) {
               dialog.dispose();
            }
            try {
               myWorker.get();
            } catch (InterruptedException e) {
               e.printStackTrace();
            } catch (ExecutionException e) {
               e.printStackTrace();
            }
         }
      }
   }

   private static void createAndShowGui() {
      final JFrame frame = new JFrame("Closing Frame");

      JButton closeBtn = new JButton(new AbstractAction("Close") {

         @Override
         public void actionPerformed(ActionEvent e) {
            final ClosingDialogPanel closingDlg = new ClosingDialogPanel(frame, 0,
                  200, "Closing");
            closingDlg.displayDialog();
         }
      });

      JPanel panel = new JPanel();
      panel.add(closeBtn);

      frame.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);
      frame.getContentPane().add(panel);
      frame.pack();
      frame.setLocationByPlatform(true);
      frame.setVisible(true);
   }

   public static void main(String[] args) {
      SwingUtilities.invokeLater(new Runnable() {
         public void run() {
            createAndShowGui();
         }
      });
   }

}

class MyWorker extends SwingWorker<Void, Void> {
   public static final String VALUE = "value";
   private int value;
   private int minimum;
   private int maximum;

   public MyWorker(int minimum, int maximum) {
      this.minimum = minimum;
      this.maximum = maximum;
      value = minimum;
   }

   @Override
   protected Void doInBackground() throws Exception {
      for (int i = minimum; i <= maximum; i++) {
         setValue(i);
         Thread.sleep(30);
      }
      return null;
   }

   private void setValue(int i) {
      int oldValue = this.value;
      int newValue = i;
      this.value = i;
      firePropertyChange(VALUE, oldValue, newValue);
   }

   public int getValue() {
      return value;
   }
}

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

为什么即使没有显示错误,我的模拟器也没有显示任何内容?

为什么我的conntrack的输出中没有任何内容?

为什么我的spanable没有显示?

为什么反转arraylist没有显示任何结果?

为什么我的窗口没有显示?

为什么我的Salt奴才没有显示任何支柱属性?

谁能说为什么我的代码不返回输出,但是代码没有显示任何错误

为什么我没有任何数据?Ngrx

为什么我的gh页的未卷曲'og:image'没有在任何平台上显示?

为什么我的盒子没有显示?

为什么我的墙纸没有显示

为什么我的机器在启动时没有显示任何内容?

为什么我的数据没有显示?

为什么我的Listview没有显示?

为什么程序没有显示任何AssertionError?

为什么我的活动没有显示?

为什么我的datePicker没有显示?

为什么我的列表没有显示?

为什么我的工具栏即使显示正确并正确放置也没有显示任何内容?

为什么我的 indexOf 没有显示除 -1 之外的任何值?

为什么我的 Django 表单没有引发任何错误?

为什么 uicollectionview 没有显示任何内容

为什么我的领域回收视图没有显示任何数据?

为什么 Django 模板没有显示任何输出?

为什么我的 return 语句没有显示任何输出?

我正在为我的 ASP.NET MVC 程序使用 DataTables 插件。表格显示没有任何 CSS。为什么?

有人可以向我解释为什么我的 UITextView 没有显示任何内容

为什么我的日期计算没有显示任何内容?

为什么我的 Tkinter GUI 窗口没有打开并且菜单栏没有显示任何错误