gpt4 book ai didi

java - MigLayout - componentResized() 调用次数过多

转载 作者:行者123 更新时间:2023-11-30 05:38:00 30 4
gpt4 key购买 nike

我有以下场景 - 我有一个面板,其中在另一个面板中包含一个组件(在本例中为标签) - 全部使用 MigLayout 定义。

当调整面板大小时,我想调整JLabel的字体大小以适合整个区域。

我将代码精简到最低限度

public class TestClass {

private JPanel panel;
private JLabel displayLabel;

private TestClass() {
panel = new JPanel(new MigLayout(new LC().fill().gridGap("0", "0").insetsAll("0").hideMode(3)));

displayLabel = new JLabel("some text goes here");
displayLabel.setFont(new Font("Dialog", Font.BOLD, 9));
panel.add(displayLabel, new CC().grow().push());

panel.addComponentListener(new ComponentAdapter() {
@Override
public void componentResized(ComponentEvent e) {
scale(displayLabel);
}
});
}

private void scale(JLabel component) {
Integer lastWidth = (Integer) component.getClientProperty("width");
Integer lastHeight = (Integer) component.getClientProperty("height");
if (lastWidth != null && lastHeight != null && lastWidth == component.getWidth() && lastHeight == component.getHeight()) {
return;
}

component.putClientProperty("width", component.getWidth());
component.putClientProperty("height", component.getHeight());

int minFontSize = 9;
Font oldFont = component.getFont();
float size = oldFont.getSize();
Font newFont = oldFont.deriveFont(size);
FontMetrics fm = component.getFontMetrics(newFont);

int availWidth = component.getWidth() - 2;
int availHeight = component.getHeight() - 2;

boolean found = false;
boolean increased = false;
boolean decreased = false;
while (!found) {
int stringWidth = fm.stringWidth(component.getText());
int stringHeight = fm.getHeight();
if (!decreased && stringWidth < availWidth && stringHeight < availHeight) {
size++;
increased = true;
} else if (stringWidth > availWidth || stringHeight > availHeight) {
size--;
decreased = true;
} else {
found = true;
}
if (increased && decreased) {
found = true;
}
newFont = oldFont.deriveFont(size);
fm = component.getFontMetrics(newFont);
}

if (size < minFontSize) {
size = minFontSize;
newFont = oldFont.deriveFont(size);
}

component.setFont(newFont);
}


public JPanel getPanel() {
return panel;
}

public static void main(String[] args) {
JFrame frame = new JFrame("");
JPanel pnl = new JPanel(new MigLayout(new LC().fill()));
pnl.add(new TestClass().getPanel(), new CC().grow().push());
frame.add(pnl, BorderLayout.CENTER);
frame.setSize(1024, 700);
frame.setLocationRelativeTo(null);
frame.setVisible(true);
}
}

当我通过拖动右边缘来放大它来调整框架大小时 - 它工作得很好,但是,当我尝试通过拖动右边缘的左侧来减小其大小时,应用程序变得缓慢并且结果没有反射(reflect)出来立即在 GUI 中。请运行它以了解我的意思。

您知道如何改进此代码以便顺利工作吗?

enter image description here

更新:我添加了一些日志记录,并且我观察到,当增加宽度时,它工作得很好,但是当减少面板的宽度时,我看到 componentResized() 方法被调用了很多与放大时相比,次数更多。

问题的原因似乎是MigLayout与grow()的结合。我已经用 BorderLayout 替换了所有布局,并且似乎工作正常。

但是,就我而言,我确实无法做到这一点,因为我需要面板在布局中增长。

最佳答案

我不确定为什么,但似乎为 JLabel 设置最小尺寸可以解决问题。

private TestClass() {
panel = new JPanel(new MigLayout(new LC().fill().gridGap("0", "0").insetsAll("0").hideMode(3)));

displayLabel = new JLabel("some text goes here");
displayLabel.setFont(new Font("Dialog", Font.BOLD, 9));
displayLabel.setMinimumSize(new Dimension(30, 10));
panel.add(displayLabel, new CC().grow().push());

panel.addComponentListener(new ComponentAdapter() {
@Override
public void componentResized(ComponentEvent e) {
scale(displayLabel);
}
});
}

关于java - MigLayout - componentResized() 调用次数过多,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56240770/

30 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com