我目前正在使用 Java 練習 OOP。
我已經使用 Eclipse IDE 通過 WindowBuilder 創建了一個 GUI 專案,結果如下。
private JFrame frame;
/**
* Launch the application.
*/
public static void main(String[] args) {
EventQueue.invokeLater(new Runnable() {
public void run() {
try {
Example window = new Example();
window.frame.setVisible(true);
} catch (Exception e) {
e.printStackTrace();
}
}
});
}
/**
* Create the application.
*/
public Example() {
initialize();
}
/**
* Initialize the contents of the frame.
*/
private void initialize() {
frame = new JFrame();
frame.setBounds(100, 100, 450, 300);
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
JProgressBar progressBar = new JProgressBar();
frame.getContentPane().add(progressBar, BorderLayout.CENTER);
}
我想要做的是將JProgressBar連接到另一個具有實際任務的類,以顯示進度。
例如,如果另一個類包含以下代碼:
int i = 0;
while(i <= 100) {
progressBar.setValue(i);
i ;
}
我應該如何更改progressBar.setValue(i); 部分?
uj5u.com熱心網友回復:
Oracle 有一個有用的教程,
每按一次按鈕,進度條會從 0 到 100 計數,每 100 毫秒一個單位。
為了訪問進度條,您必須將其設為類欄位或變數。然后,您可以使用 setter 訪問類欄位。Getter 和 setter 是一個基本的 Java 概念。您可以在我的課程中看到另一個普通 Java getter/setter 類的示例JProgressBarModel。
我使用 SwingTimer為進度條的更新添加延遲,以便您可以看到進度條更新并模擬實際的長時間運行的任務。實際作業發生在WorkListener課堂上。因為代碼在ActionListener. 中,所以進度條的 Swing 更新發生在Event Dispatch Thread上。
這是完整的可運行代碼。我將所有額外的類都做成了內部類,這樣我就可以將代碼作為一個塊發布。
import java.awt.BorderLayout;
import java.awt.FlowLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import javax.swing.BorderFactory;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.JProgressBar;
import javax.swing.SwingUtilities;
import javax.swing.Timer;
public class JProgressBarExample implements Runnable {
public static void main(String[] args) {
SwingUtilities.invokeLater(new JProgressBarExample());
}
private JProgressBar progressBar;
private final JProgressBarModel model;
public JProgressBarExample() {
this.model = new JProgressBarModel();
}
@Override
public void run() {
JFrame frame = new JFrame("Progress Bar Example");
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.add(createMainPanel(), BorderLayout.CENTER);
frame.pack();
frame.setLocationByPlatform(true);
frame.setVisible(true);
}
private JPanel createMainPanel() {
JPanel panel = new JPanel(new FlowLayout());
panel.setBorder(BorderFactory.createEmptyBorder(5, 5, 5, 5));
progressBar = new JProgressBar();
panel.add(progressBar);
JButton button = new JButton("Start Process");
button.addActionListener(event -> {
model.setIndex(0);
setValue();
Timer timer = new Timer(100, new WorkListener(this, model));
timer.start();
});
panel.add(button);
return panel;
}
public void setValue() {
progressBar.setValue(model.getIndex());
}
public class WorkListener implements ActionListener {
private final JProgressBarExample view;
private final JProgressBarModel model;
public WorkListener(JProgressBarExample view, JProgressBarModel model) {
this.view = view;
this.model = model;
}
@Override
public void actionPerformed(ActionEvent event) {
Timer timer = (Timer) event.getSource();
int index = model.getIndex() 1;
model.setIndex(index);
view.setValue();
if (index >= 100) {
timer.stop();
}
}
}
public class JProgressBarModel {
private int index;
public int getIndex() {
return index;
}
public void setIndex(int index) {
this.index = index;
}
}
}
uj5u.com熱心網友回復:
一種選擇是類似于框架部分。您的 Example 類有一個欄位變數,您的其他代碼可以直接訪問該變數。
更好的方法是為 JProgressBar 和 getProgressBar() 方法設定一個私有欄位。
但是目前您正在使用一個在 initialize() 回傳時被遺忘的方法變數。
轉載請註明出處,本文鏈接:https://www.uj5u.com/net/513577.html
標籤:爪哇摇摆j进度条
