gpt4 book ai didi

java - 更改窗口大小和 JLabel 的奇怪行为时如何更改字符串长度(以像素为单位计算其宽度)

转载 作者:行者123 更新时间:2023-12-01 13:42:58 24 4
gpt4 key购买 nike

我有JLabel,我想在调整窗口大小时更改其大小。当JLabel包含太大的字符串时,应缩短该字符串,使右侧部分可见,并在左侧添加字符串。

我的JLabel位于innerPanel内部,它是middlePanel中的 header ,被添加到outerPanel中。因此,当我调整窗口大小时,我以这种方式在 outerPanel 上使用监听器:

outerPanel.addComponentListener(new ComponentListener() {
@Override
public void componentResized(ComponentEvent evt) {
int width = ((JPanel) evt.getSource()).getWidth();
windowSize = width;
refresh();
}

// [...] other not used override methods
});

refresh() 重新绘制 View 并创建新的 middlePanel ,其中称为类,该类创建 innerPanel ,其中位于我的 JLabel:

Public class InnerPanel extends JPanel {
private int maxSize;
String string = "<VERY_LONG_STRING>";
private static final int DEFAULT_INDEND_PIXEL = 70;

public InnerPanel(int windowSize) {
maxSize = windowSize - DEFAULT_INDENT_PIXEL;
createPanel();
}

private createPanel() {
// [...] gridbag and GridBagConstraints implementation

String shortString = countString();
JLabel label = new JLabel(shortString);
add(label,gc);
}

private String countString() {
int index = 0;
boolean toBig = true;
StringBuilder sb = new StringBuilder(string);

while(toBig) {
Rectangle2d rect = // [...] code which creates rectangle around text from sb.toString()
// I have no access to repo at home but if it's important I can paste it tomorrow

if(rect.getWidth() > maxSize)
sb.deleteCharAt(0);
else
toBig = false;
}

return sb.toString();
}
}

这通常工作得很好,因为当我放大窗口宽度时,它会一步调整 JLabel 的大小。但当我尝试减小窗口宽度时,问题就出现了。在这种情况下,componentResized()逐步计算width(并且被调用多次),逐渐减少width一定数量的像素,直到它达到真实的窗口大小。即使我将窗口大小从最大大小一步更改为 800,它的行为也是如此。整个过程非常慢,大约需要一秒钟才能将字符串适应窗口大小。所以它看起来有点像动画。

这个问题对我来说非常罕见,因为 componentResized() 方法中的 width 是在我分配 逐步计算的>windowSize 变量。

当我给 windowSize 固定大小(例如 500)时 - componentResized() 仅被调用一次 - 正确的 width 指示真实窗口大小(!!) - 并且没有逐步减少!

它看起来像 width 变量,由 ((JPanel) evt.getSource()).getWidth() 分配,知道 windowSize用于动态更改 JLabel 组件的大小,甚至在第一次调用 refresh() 方法之前也是如此。

如果有人知道这里发生了什么 - 我将非常感谢您的帮助。

最佳答案

您也许可以采用所示的方法之一 here以达到更好的效果。如图here ,省略号由标签的 UI 委托(delegate)通过调用 SwingUtilities2.clipString() 提供。 ,它附加clipString。不要重新发明标签 UI,而是使用 TextLayout要确定所需的几何形状,请在前面添加省略号,并处理表格或列表渲染器中的对齐方式,如here所示.

关于java - 更改窗口大小和 JLabel 的奇怪行为时如何更改字符串长度(以像素为单位计算其宽度),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20555287/

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