java - 在 JFrame 上每个方法完成后写一个字符串

标签 java swing jframe jlabel

最近我制作了一个控制台程序,可以为我更新插件。我认为如果将它从控制台程序转换为 JFrame/UI 会更好看。我几乎是一个初学者,但我似乎在任何地方都找不到如何在每个方法完成后将文本添加到 JFrame/Panel。有点像进度条,但只是描述“幕后”发生的事情的文字。没什么特别的,但至少比我运行我的 jar 时更直观一点,我所看到的只是一个窗口加载环旋转了几秒钟。

public static void main(String[] args) {
    JFrame frame = new JFrame("Updater");

    JLabel label1=new JLabel("Testprogram 1",JLabel.LEFT);
    JLabel label2=new JLabel("Method 1..",JLabel.LEFT);
    JLabel label3=new JLabel("Method 3..",JLabel.LEFT);
    JLabel label4=new JLabel("Method 4...",JLabel.LEFT);
    JLabel label5=new JLabel("Done!",JLabel.LEFT);

    JPanel panel=new JPanel();

    panel.setLayout(new GridLayout(5,1));

    frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    frame.setSize(300,300);
    frame.setLocationRelativeTo(null);
    frame.add(panel,BorderLayout.CENTER);
    panel.setBackground(Color.WHITE);
    frame.setResizable(false);
    frame.setVisible(true);

    panel.add(label1);
    panel.add(label2);
    panel.add(label3);
    panel.add(label4);
    panel.add(label5);

    CreateFrame();
    Start();
    CreateDir();
    LinkList();
    Download();
    unzip();
    DeleteZip();

}

我尝试在每个方法之后添加标签,但我猜它不会那样工作,除非它实时“更新”。我希望有人理解我想要实现的目标。

最佳答案

我怀疑您有一大堆长时间运行的代码占用了您的 GUI,阻止它绘制和与用户交互。如果是这样,您需要阅读 Concurrency in Swing看看为什么你的程序没有像你期望的那样运行。


请注意,dani-h 的示例将面临 Swing 线程问题的风险,因为他在调用他的 Swing 代码的同一线程上调用 Thread.sleep(...)。如果他在 Swing 事件线程上正确启动了他的 Swing GUI,或者如果您尝试在任何其他 Swing 程序中使用他的代码,它将锁定,并且您最终会遇到与开始时相同的问题。

下面是使用 dani-h 示例的更正代码,但使用 SwingWorker 更正了他的线程问题:

import java.awt.Dimension;
import java.awt.Window;
import java.beans.PropertyChangeEvent;
import java.beans.PropertyChangeListener;
import javax.swing.*;

@SuppressWarnings("serial")
public class Example2 extends JPanel {
   private static final int PREF_W = 400;
   private static final int PREF_H = 200;
   private JLabel label = new JLabel();

   public Example2() {
      add(label);
      final MySwingWorker mySwingWorker = new MySwingWorker();
      mySwingWorker.addPropertyChangeListener(new PropertyChangeListener() {

         @Override
         public void propertyChange(PropertyChangeEvent pcEvt) {
            if (MySwingWorker.STEP_PERFORMING.equals(pcEvt.getPropertyName())) {
               label.setText(mySwingWorker.getStepPerforming());
            } else if (pcEvt.getNewValue() == SwingWorker.StateValue.DONE) {
               Window win = SwingUtilities.getWindowAncestor(Example2.this);
               win.dispose();
            }
         }
      });
      mySwingWorker.execute();
   }

   public Dimension getPreferredSize() {
      return new Dimension(PREF_W, PREF_H);
   }

   private static void createAndShowGUI() {
      Example2 example = new Example2();

      JFrame frame = new JFrame("Example 2");
      frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
      frame.getContentPane().add(example);
      frame.pack();
      frame.setLocationRelativeTo(null);
      frame.setVisible(true);
   }

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

class MySwingWorker extends SwingWorker<Void, Void> { 
   public static final String STEP_PERFORMING = "step performing";
   private static final long SLEEP_DELAY = 1500;
   private String stepPerforming = "";

   @Override
   protected Void doInBackground() throws Exception {
      start();
      createDir();
      linkList();
      download();
      unzip();
      deletezip();
      return null;
   }


   public String getStepPerforming() {
      return stepPerforming;
   }


   public void setStepPerforming(String stepPerforming) {
      String oldValue = this.stepPerforming;
      String newValue = stepPerforming;
      this.stepPerforming = stepPerforming;
      firePropertyChange(STEP_PERFORMING, oldValue, newValue);
   }

   private void start() {
      setStepPerforming("Starting...");
      // Start();
      try {
         Thread.sleep(SLEEP_DELAY);
      } catch (InterruptedException e) {}
   }

   private void createDir() {
      setStepPerforming("Executing Create Directory");
      // CreateDir();
      try {
         Thread.sleep(SLEEP_DELAY);
      } catch (InterruptedException e) {}
   }

   private void linkList() {
      setStepPerforming("Executing Link List");
      // LinkList();
      try {
         Thread.sleep(SLEEP_DELAY);
      } catch (InterruptedException e) {}
   }

   private void download() {
      setStepPerforming("Executing Download");
      // Download();
      try {
         Thread.sleep(SLEEP_DELAY);
      } catch (InterruptedException e) {}
   }

   private void unzip() {
      setStepPerforming("Executing Unzip");
      // unzip();
      try {
         Thread.sleep(SLEEP_DELAY);
      } catch (InterruptedException e) {}
   }

   private void deletezip() {
      setStepPerforming("Executing Delete zip");
      // DeleteZip();
      try {
         Thread.sleep(SLEEP_DELAY);
      } catch (InterruptedException e) {}
   }

}

关于java - 在 JFrame 上每个方法完成后写一个字符串,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20980975/

相关文章:

java - 使用 GridLayout 时如何将组件的大小锁定在可调整大小的框架中?

java - 打印 JFrame 及其组件

java - JPA 认为我正在删除一个分离的对象

java - 没有滚动条的可滚动区域

java - 当使用 lambda 并抛出覆盖异常时,“覆盖方法不会抛出异常”

java - JFrame 不显示红色背景

java - 我尝试使用的 JPanel 的令人困惑的属性

java - 如何从 Java 中的 JFrame 中删除所有组件?

java - 检查一个数组的所有元素是否与另一个数组的所有元素具有相同的值

java - 如何使用 NetBeans IDE 控制 Java/Swing GUI 组件对齐?