我正在尝试使用包含尽可能多的JLabel的整齐网格填充JPanel,以适应JPanel。 JPanel的大小可以变化,JLabel的大小取决于标签文本,JLabel中包含的图标以及用于呈现标签文本的字体。
GridLayout myLayout = new GridLayout();
JPanel myPanel = new JPanel(myLayout);
List<JLabel> myLabels = ...
int panelWidth = myPanel.getWidth();
int panelHeight = myPanel.getHeight();
if (panelWidth == 0 || panelHeight == 0) return;
int maxLabelWidth = 0, maxLabelHeight = 0;
for (JLabel label : myLabels) {
int labelWidth = ???
int labelHeight = ???
if (labelWidth > maxLabelWidth) maxLabelWidth = labelWidth;
if (labelHeight > maxLabelHeight) maxLabelHeight = labelHeight;
}
// Use panelHeight, panelWidth, maxLabelHeight and maxLabelWidth to compute
// rows and columns available for myLayout
myLayout.setRows(nRows); myLayout.setColumns(nColumns);
for (JLabel label : myLabels) {
myPanel.add(label);
// stop if we reach nRows*nColumns labels
}
我已经尝试了myPanel.getGraphics()。getFontMetrics()。getHeight()来获取文本的高度,但是当字体很大且myPanel很小时,文本比labelHeight高,而且底部和顶部被切断了。
我已尝试使用label.getIcon()。getIconHeight()来获取图标的高度,但使用此值始终会切断图标的顶部和底部。
我已经尝试使用label.getSize()来获取JLabel的高度和宽度,但这通常会返回0高度和0宽度。我尝试过label.getPreferredSize(),但通常会返回一个太小的值。
我已经尝试使用label.getGraphics()。getFontMetrics()。stringWidth(label.getText())来获取字符串的宽度,然后将其添加到label.getIcon()。getIconWidth()和label中。 getIcon()。getIconTextGap()但是它提供了一个比label.getPreferredSize()稍微大一点的值,并且在任何情况下仍然太小 - 有时候标签文本会在最后被截断。
我曾尝试在每个宽度和高度添加一个常量;这阻止了截止文本和图标,但当然它在JLabel周围留下了太多空白。有没有办法为每种JLabel获得这种用法的准确大小?