首选大小
JProgressBar由UI委托
BasicProgressBarUI指定.下面的示例说明了各种布局管理器的效果. FlowLayout只使用UIManager默认值ProgressBar.horizontalSize,而GridLayout和BorderLayout.CENTER填充可用空间.带有侧面胶水的BoxLayout可在调整框架大小时按比例调整.
I am already using a SwingWorker
从SwingWorker的process()方法更新GUI应该是安全的.您可以更改图层甚至删除组件,但我会对过于复杂的事情保持警惕.
附录:这是相关的默认值.
System.out.println(UIManager.get("ProgressBar.horizontalSize"));
javax.swing.plaf.DimensionUIResource[width=146,height=12]
码:
import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.EventQueue;
import java.awt.FlowLayout;
import java.awt.GridLayout;
import java.awt.LayoutManager;
import javax.swing.BorderFactory;
import javax.swing.Box;
import javax.swing.BoxLayout;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.JProgressBar;
/** @see https://stackoverflow.com/questions/7256775 */
public class ProgressTest {
private static final Color border = Color.gray;
private static void display() {
JFrame f = new JFrame("ProgressTest");
f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
f.setLayout(new GridLayout(0, 1));
f.add(createPanel(new FlowLayout()));
f.add(createPanel(new GridLayout()));
f.add(createPanel(new BorderLayout()));
JPanel p = new JPanel();
p.setLayout(new BoxLayout(p, BoxLayout.X_AXIS));
p.setBorder(BorderFactory.createLineBorder(border));
JProgressBar jpb = new JProgressBar();
p.add(Box.createHorizontalGlue());
p.add(jpb);
p.add(Box.createHorizontalGlue());
jpb.setIndeterminate(true);
f.add(p);
f.pack();
f.setSize(320, 240);
f.setLocationRelativeTo(null);
f.setVisible(true);
}
private static JPanel createPanel(LayoutManager layout) {
JPanel p = new JPanel();
p.setBorder(BorderFactory.createLineBorder(border));
p.setLayout(layout);
JProgressBar jpb = new JProgressBar();
jpb.setIndeterminate(true);
p.add(jpb);
return p;
}
public static void main(String[] args) {
EventQueue.invokeLater(new Runnable() {
@Override
public void run() {
display();
}
});
}
}