我正在編寫一個工具,在文本文件上執行一項任務。該任務需要一些時間才能完成,因此我製作了一個顯示文件名和進度百分比的面板。 用戶可以在一個或多個文件上運行任務,所以我需要爲每個文件顯示一個面板。問題是面板沒有被添加。 我更新我的代碼是包含的建議如下自我:實時向JFrame添加多個JPanel
package sscce.jpanel;
import javax.swing.JFrame;
import javax.swing.JTextArea;
import java.util.ArrayList;
import java.util.List;
import java.util.logging.Logger;
import javax.swing.JButton;
import javax.swing.BoxLayout;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.SwingConstants;
public class FProgressDisplay extends JFrame {
private final static Logger LOGGER = Logger.getLogger(FProgressDisplay.class.getName());
private List<PanelTaskProgress> tasks;
JTextArea txtLog;
JButton btnAbort;
JButton btnClose;
public static void main(String[] args) {
try {
FProgressDisplay frame = new FProgressDisplay();
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.setVisible(true);
for(int i = 0; i < 10; i++) {
frame.addTask(i, "Task"+i);
}
} catch (Exception e) {
e.printStackTrace();
throw new RuntimeException("Failed to initialize application.");
}
}
/**
* Create the frame.
*/
public FProgressDisplay() {
setTitle("Mask tool - Progress");
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
pack();
getContentPane().setLayout(null);
getContentPane().setLayout(new BoxLayout(getContentPane(), BoxLayout.Y_AXIS));
JPanel panel = new JPanel();
getContentPane().add(panel);
btnAbort = new JButton("Abort");
panel.add(btnAbort);
btnClose = new JButton("Close");
panel.add(btnClose);
txtLog = new JTextArea();
txtLog.setLineWrap(true);
getContentPane().add(txtLog);
tasks = new ArrayList<PanelTaskProgress>();
}
public void addTask(long id, String fileName) {
PanelTaskProgress newTaskPanel = new PanelTaskProgress(id, fileName);
tasks.add(newTaskPanel);
getContentPane().add(newTaskPanel);
validate();
repaint();
LOGGER.info("Added new panel");
}
public class PanelTaskProgress extends JPanel {
private static final long serialVersionUID = 1L;
JLabel lblTaskDescription;
JLabel lblProgress;
private long id;
/**
* Create the panel.
*/
public PanelTaskProgress(long id, String fileName) {
try {
setLayout(null);
lblTaskDescription = new JLabel(id + " " + fileName);
//lblTaskDescription.setBounds(10, 11, 632, 14);
add(lblTaskDescription);
lblProgress = new JLabel("0%");
lblProgress.setHorizontalAlignment(SwingConstants.CENTER);
//lblProgress.setBounds(664, 11, 51, 14);
add(lblProgress);
LOGGER.info("Created new panel; Id: " + id + "; File: " + fileName);
} catch (Exception e) {
LOGGER.severe("Error creating new panel; " + e.getMessage());
}
}
}
}
1)爲了更好地幫助您,請發佈[SSCCE](http://pscode.org/sscce.html)。 2)不要調用'setBounds()'。這是一個等待中斷的GUI(他們很少等待很久)。 –
SSCCE應該是一個單一的源文件。你爲什麼要堅持使用'setBounds()'? –
好的,我想我現在明白了。順便說一句 - 當刪除setbounds()調用時,幀被最小化。 – Yoav