我有一个主要的类,包含swing组件,它调用了一个次要的类,这个类生成了很多我想显示进度条的东西。我怎样才能做到这一点,而不必把整个代码从次要类带到主要类?
下面是简化的代码:
public class ProgressBar {
public static void main(String[] args) {
GUI gui = new GUI();
gui.showGUI();
}
}
import javax.swing.*;
public class GUI {
private JFrame mainFrame;
public void showGUI() {
mainFrame = new JFrame();
mainFrame.setSize(222, 222);
mainFrame.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);
Primary primary = new Primary();
mainFrame.add(primary.getPanel());
mainFrame.setVisible(true);
}
}
import javax.swing.*;
public final class Primary {
private JPanel primaryPanel;
public Primary(){
createPanel();
}
public void createPanel() {
primaryPanel = new JPanel();
primaryPanel.setSize(333, 333);
JTextArea textArea = new JTextArea();
Secondary secondary = new Secondary();
textArea.setText(secondary.writeInfo(11));
primaryPanel.add(textArea);
JProgressBar progressBar = new JProgressBar();
primaryPanel.add(progressBar);
primaryPanel.setVisible(true);
}
public JPanel getPanel(){
return primaryPanel;
}
}
public class Secondary {
private String info;
public int progress;
public Secondary(){
info = "";
}
public String writeInfo(int n){
for(int i=1; i<=n; i++) {
info += " bla";
progress = 100*i/n;
//System.out.println(progress);
}
return info;
}
}
2条答案
按热度按时间eimct9ow1#
因此,有两个问题。
首先,您需要某种方式让
Secondary
通知Primary
进度状态已更改。这可以通过使用observer pattern(在Swing中,这些通常被称为“侦听器”)最容易地实现。其次,Swing是单线程的,不是线程安全的。
这意味着您不应该使用长时间运行或阻塞操作来阻塞事件调度线程,并且您不应该从事件调度线程上下文外部更新UI或UI所依赖的任何状态。
在这种情况下,最好的解决方案是使用
SwingWorker
比如...
li9yvcax2#
您不需要将整个代码从
Primary
带到Secondary
类。您可以将ProgressBar
传递给Constructor中的Secondary
类,并根据您的逻辑从那里更新它。但是,根据您在
Secondary
类中实现的逻辑,这可能与Single Responsibility Principle相反。因此,您还可以实现Observer Pattern,并在每次需要更新进度时从Secondary
类通知Primary
类。