我在这里花了一段时间阅读和实验,并提出了一些方法,但还没有使它们中的任何一个完全工作,所以我想知道更有经验的 Swing 程序员会做什么。
我的应用程序的主窗口包含 JPanel 的自定义子类型,用于显示根据数学函数计算的图像。这可能需要一些时间来计算,因此当发生这种情况时,我会在面板中间显示一条文本消息和一个叠加的进度条。我希望在调整面板大小时,文本和进度条都能适当调整大小,可能使用面板宽度的恒定分数。
目前,我有另一个包含文本和进度栏的 JPanel 子类型,我将此“进度面板”添加到主面板,并将其设置为在需要时可见。主面板不包含任何其他组件,但有自己的paintComponent()方法来显示从另一个类获得的BufferedImage。目前的情况存在一些问题:
- 进度面板并不总是在应该可见的时候可见,可能是因为代码中没有任何地方明确确保它绘制在图像前面。
- 进度面板始终占据应用程序面板的整个宽度。它在主面板中使用 BoxLayout 垂直居中,并在进度面板之前和之后使用一些垂直粘合,但我还没有设法获得相同的技巧来水平工作,无论如何,进度面板的首选水平尺寸是不一定是对的。一种几乎可行的方法是在进度面板周围使用带有水平和垂直支柱的 BorderLayout,但进度面板的大小仍然不正确,并且在调整主面板大小时需要更改支柱。
那么你会怎么做?
- 在主面板中使用不同的布局管理器?
- 以某种方式使用 LayeredPane 或 OverlayLayout 吗?
- 向包含图像面板和进度面板的包含层次结构添加另一个层?
- 以上的某种组合,还是其他什么?
调整文本大小怎么样?调整面板大小时是否需要显式创建新字体,或者有什么方法可以更自动地执行此操作?
-
首选尺寸为JProgressBar由 UI 委托指定,BasicProgressBarUI。下面的示例说明了各种布局管理器的效果。FlowLayout
只需使用UIManager
默认,ProgressBar.horizontalSize
, while GridLayout
and BorderLayout.CENTER
填充可用空间。BoxLayout
,带有侧面胶水,随着框架大小的调整而按比例调整。
我已经在使用SwingWorker
从以下位置更新 GUIprocess()
你的方法SwingWorker
应该是安全的。您可以更改图层甚至删除组件,但我会对任何过于复杂的内容保持警惕。
![PreogressTest](https://i.stack.imgur.com/u4gtz.png)
附录:这是相关的默认值。
System.out.println(UIManager.get("ProgressBar.horizontalSize"));
javax.swing.plaf.DimensionUIResource[width=146,height=12]
Code:
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 http://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();
}
});
}
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)