Java 在JFrame上完成每个方法后编写一个字符串

Java 在JFrame上完成每个方法后编写一个字符串,java,swing,jframe,jlabel,Java,Swing,Jframe,Jlabel,最近我制作了一个控制台程序,为我更新了一个插件。我认为如果我将它从控制台程序转换为JFrame/UI,它看起来会更好。我几乎是一个初学者,但我似乎找不到任何地方可以在每个方法完成后向JFrame/Panel添加文本。有点像进度条,但只是描述“引擎盖下”发生的事情的文本。没有什么特别的,但至少比我运行我的罐子时更直观一些,我看到的只是一个windows加载环旋转了几秒钟 public static void main(String[] args) { JFrame frame = new

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

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,阻止它绘制和与用户交互。如果是这样的话,您需要仔细阅读,看看为什么您的程序没有按预期运行


请注意,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.awt.Dimension;
导入java.awt.Window;
导入java.beans.PropertyChangeEvent;
导入java.beans.PropertyChangeListener;
导入javax.swing.*;
@抑制警告(“串行”)
公共类示例2扩展了JPanel{
专用静态最终整型预加值W=400;
专用静态最终整型参数PREF_H=200;
专用JLabel标签=新JLabel();
公共示例2(){
添加(标签);
最终MySwingWorker MySwingWorker=新MySwingWorker();
mySwingWorker.addPropertyChangeListener(新的PropertyChangeListener(){
@凌驾
公共作废属性更改(属性更改事件pcEvt){
if(MySwingWorker.STEP_.equals(pcEvt.getPropertyName())){
label.setText(mySwingWorker.getStepPerforming());
}else if(pcEvt.getNewValue()==SwingWorker.StateValue.DONE){
Window win=SwingUtilities.getWindowSenator(示例2.this);
win.dispose();
}
}
});
mySwingWorker.execute();
}
公共维度getPreferredSize(){
返回新维度(PREF_W,PREF_H);
}
私有静态void createAndShowGUI(){
example2example=新的Example2();
JFrame=新JFrame(“示例2”);
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.getContentPane().add(示例);
frame.pack();
frame.setLocationRelativeTo(空);
frame.setVisible(true);
}
公共静态void main(字符串[]args){
SwingUtilities.invokeLater(新的Runnable(){
公开募捐{
createAndShowGUI();
}
});
}
}
类MySwingWorker扩展SwingWorker{
公共静态最终字符串STEP_PERFORMING=“STEP PERFORMING”;
专用静态最终长睡眠延迟=1500;
私有字符串stepPerforming=“”;
@凌驾
受保护的Void doInBackground()引发异常{
start();
createDir();
链接列表();
下载();
解压缩();
deletezip();
返回null;
}
公共字符串getStepPerforming(){
返回步进成形;
}
公共void设置步骤执行(字符串步进格式){
字符串oldValue=this.stepPerforming;
字符串newValue=步进格式;
this.stepPerforming=stepPerforming;
firePropertyChange(正在执行的步骤、旧值、新值);
}
私有void start(){
设置步骤执行(“启动…”);
//Start();
试一试{
线程睡眠(睡眠延迟);
}捕获(中断异常e){}
}
私有void createDir(){
setStepPerforming(“正在执行创建目录”);
//CreateDir();
试一试{
线程睡眠(睡眠延迟);
}捕获(中断异常e){}
}
私有void链接列表(){
设置步骤执行(“执行链接列表”);
//链接列表();
试一试{
线程睡眠(睡眠延迟);
}捕获(中断异常e){}
}
私有void下载(){
设置步骤执行(“执行下载”);
//下载();
试一试{
线程睡眠(睡眠延迟);
}捕获(中断异常e){}
}
私有void解压(){
设置步骤执行(“执行解压缩”);
//解压缩();
试一试{
线程睡眠(睡眠延迟);
}捕获(中断异常e){}
}
私有void deletezip(){
设置步骤执行(“执行删除压缩”);
//DeleteZip();
试一试{
线程睡眠(睡眠延迟);
}捕获(中断异常e){}
}
}

方法名称不应以大写字符开头。显示API中以大写字符开头的方法。通过示例学习,不要制定自己的约定,因为其他人无法阅读您的代码。我会记住这一点。在C#和Java之间跳跃有点让人困惑。我不经常这么说,但你接受了一个糟糕的答案,这个答案可能会导致Swing线程问题。如果他在Swing事件线程上正确启动了Swing GUI,或者如果您尝试在任何其他Swing程序中使用他的代码,它将被锁定,并且您将遇到与开始时相同的问题。有关已更正代码的示例,请参阅我编辑的答案。+1测试代码,其中每个方法仅打印方法名称,然后在从方法返回后添加标签,并按预期工作