如何在JPanel上叠加,调整大小和居中组件?

时间:2011-08-31 12:14:17

标签: java swing jpanel font-size layout-manager

我花了一段时间阅读并在这里进行实验,并提出了一些方法,但还没有完成任何工作,所以我想知道更多有经验的Swing程序员会做什么。

我的应用程序的主窗口包含JPanel的自定义子类型,用于显示从数学函数计算的图像。这可能需要一些时间来计算,所以当发生这种情况时,我会在面板中间显示一条文本消息和一个进度条。我希望文本和进度条在调整面板大小时适当调整大小,可能使用面板宽度的常量部分。

目前我有另一个包含文本和进度条的JPanel子类型,我将此“进度面板”添加到主面板,并在需要时将其设置为可见。主面板不包含任何其他组件,但有自己的paintComponent()方法来显示从另一个类获取的BufferedImage。这有一些问题:

  • 进度面板在应该出现时并不总是可见,可能是因为代码中没有任何地方明确确保它被绘制在图像前面。
  • 进度面板始终占用应用程序面板的整个宽度。它使用主面板中的BoxLayout垂直居中,并在进度面板之前和之后使用一些垂直胶水,但我没有设法让水平工作的相同技巧,并且在任何情况下,进度面板的首选水平尺寸是不一定是对的。一种几乎可行的方法是在进度面板周围使用带有水平和垂直支柱的BorderLayout,但进度面板的大小仍然不正确,并且在调整主面板大小时需要更改支柱。

那你会做什么?

  • 在主面板中使用其他布局管理器?
  • 以某种方式使用LayeredPane或OverlayLayout?
  • 将另一个图层添加到包含图像面板和进度面板的包含层次结构中?
  • 以上的某些组合,或其他什么?

如何调整文本大小。我是否需要在调整面板大小时显式创建新的字体,或者是否有任何方法可以更自动地执行此操作?   -

2 个答案:

答案 0 :(得分:3)

JProgressBar的首选大小由UI代表BasicProgressBarUI指定。下面的示例说明了各种布局管理器的效果。 FlowLayout仅使用UIManager默认值ProgressBar.horizontalSize,而GridLayoutBorderLayout.CENTER填充可用空间。 BoxLayout,使用侧翼胶水,在调整框架大小时按比例调整。

  

我已使用SwingWorker

process()的{​​{1}}方法更新GUI应该是安全的。您可以更改图层甚至删除组件,但我会对过于复杂的任何事情保持警惕。

PreogressTest

附录:这是相关的默认值。

SwingWorker
javax.swing.plaf.DimensionUIResource[width=146,height=12]

代码:

System.out.println(UIManager.get("ProgressBar.horizontalSize"));

答案 1 :(得分:2)

我知道这是一个布局问题,但如果您有有用的中间结果,SwingWorker可能会使问题更简单。我有时会从example开始。