Java 我的JPanel中可以容纳多少个JLabel

Java 我的JPanel中可以容纳多少个JLabel,java,swing,layout,Java,Swing,Layout,我试图用一个整洁的网格来填充JPanel,其中包含尽可能多的JLabel,以适应JPanel。JPanel的大小可能不同,JLabel的大小取决于标签文本、JLabel中包含的图标以及用于呈现标签文本的字体 GridLayout myLayout = new GridLayout(); JPanel myPanel = new JPanel(myLayout); List<JLabel> myLabels = ... int panelWidth = myPanel.getWidt

我试图用一个整洁的网格来填充JPanel,其中包含尽可能多的JLabel,以适应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
}
GridLayout myLayout=新建GridLayout();
JPanel myPanel=新的JPanel(myLayout);
列表myLabels=。。。
intpanelwidth=myPanel.getWidth();
intpanelheight=myPanel.getHeight();
如果(panelWidth==0 | | panelHeight==0)返回;
int maxLabelWidth=0,maxLabelHeight=0;
用于(JLabel标签:MyLabel){
int labelWidth=???
int labelHeight=???
如果(labelWidth>maxLabelWidth)maxLabelWidth=labelWidth;
如果(labelHeight>maxLabelHeight)maxLabelHeight=labelHeight;
}
//使用panelHeight、panelWidth、maxLabelHeight和maxLabelWidth进行计算
//可用于myLayout的行和列
myLayout.setRows(nRows);myLayout.setColumns(nColumns);
用于(JLabel标签:MyLabel){
添加(标签);
//如果我们到达nRows*N列标签,请停止
}
我尝试了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获取准确的大小以用于此用途?

“我正在尝试用一个整洁的网格填充一个JPanel,其中包含尽可能多的JLabel,以满足JPanel的需要。”这有什么不寻常的要求?如果有15个可能的标签,那么只显示12个标签有什么意义?这听起来像是一个XY问题。考虑到这一点,我想您应该考虑使用
JList
(滚动窗格中),其中每个项目都会显示图标(可能会缩小到合适的大小)&当用户将鼠标指向它时,会弹出一个带有全尺寸图标和完整文本的工具提示。。。。在大多数情况下,这提供了最好的世界,用户可以上下滚动列表,然后指向项目以获取完整的详细信息。如果“弹出窗口”不适用于特定用例,则在列表旁边放置一个面板,显示从列表中选择的任何项目的详细信息(图标和文本)。标签的首选大小应在调用
validate()
之后,例如在15个标签的情况下,由
pack()
@andrewhompson调用,并且仅为12个标签留出空间,从High传下来的设计要求是,可以使用一个单独的控件来显示标签的其他“页面”。滚动窗格将是一个很好的解决方案,除非设计要求另有规定。@谢谢,我将调查
validate()
pack()
对这个问题的影响。