gpt4 book ai didi

java - UI-Update 后 SpringLayout 中组件的宽度等于 0

转载 作者:太空宇宙 更新时间:2023-11-04 11:54:54 26 4
gpt4 key购买 nike

TL;DR在不同的 DPI 设置上,我的应用程序的组件可能会重叠。为了摆脱这个问题,我想检查组件宽度,更新 UI 后它始终等于 0。问题末尾的简单代码。

基本问题是,在不同的 DPI 设置下,我的程序的不同部分是到达最右边的部分。在较高的 DPI 上,它是动态生成的标签,在较低的 DPI 上,它是固定宽度的文本字段。
我正在使用 SpringLayout 来处理可能更改的 DPI 设置。通过上述描述,我遇到了特定设置组件重叠的问题。

为了克服这个问题,我想检查一个组件的左边缘是否比另一个组件的右边缘更左 +10 个像素,以获得更多空间。

if (labelRight.getX() < (labellist.get(0).getX() + labellist.get(0).getWidth+10)){ 
//Use one SpringLayout setting for labelRight
} else //Use another SpringLayout setting for labelRight

我认为问题是我在生成组件后检查组件的宽度。用户可以从不同的设置中进行选择,这将改变部分面板内容。 labellist 包含该区域最右侧的标签。
我编写了一个小测试程序来显示宽度检查的问题宽度:

import java.awt.EventQueue;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.util.ArrayList;

import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.SpringLayout;
import javax.swing.UIManager;

public class testsforSO extends JFrame {

private static final long serialVersionUID = -857761460788731909L;
ArrayList<JLabel> lbls = new ArrayList<>();
int lblCount = 6;
JPanel panel = new JPanel();
SpringLayout sl_panel = new SpringLayout();

public static void main(String[] args) {
EventQueue.invokeLater(new Runnable() {
@Override
public void run() {
testsforSO frame = new testsforSO();
frame.pack();
frame.setVisible(true);
frame.setSize(500, 500);
try {
UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName());
} catch (Exception e) {
e.printStackTrace();
}

}
});
}

public testsforSO() {

getContentPane().add(panel);

updateUI();

JButton incr = new JButton("Increment here!");
incr.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent arg0) {
for (int i=0; i<=lbls.size()-1; i++){
panel.remove(lbls.get(i));
}

lblCount++;
lbls.clear();
updateUI();
panel.repaint();
panel.revalidate();

System.out.println("Width of slimest label: " + lbls.get(0).getWidth());
System.out.println("Width of widest label : " + lbls.get(lbls.size()-1).getWidth());
}
});
panel.add(incr);
sl_panel.putConstraint(SpringLayout.NORTH, incr, 10, SpringLayout.NORTH, panel);
sl_panel.putConstraint(SpringLayout.EAST, incr, -10, SpringLayout.EAST, panel);

panel.setLayout(sl_panel);
}

private void updateUI(){
for (int i = 0; i <= lblCount; i++) {
String abc = new String();
for (int j = 0; j <= i; j++) {
abc += "xx";
}
JLabel bfrLbl = new JLabel(abc);
lbls.add(bfrLbl);
panel.add(bfrLbl);
}

for (int i = 0; i <= lbls.size() - 1; i++) {
if (i > 0)
sl_panel.putConstraint(SpringLayout.NORTH, lbls.get(i), 8, SpringLayout.SOUTH, lbls.get(i - 1));
else
sl_panel.putConstraint(SpringLayout.NORTH, lbls.get(i), 8, SpringLayout.NORTH, panel);
}

}
}

按下按钮时,用户界面会更新,底部会多一个标签。 SpringLayout 会相应地安装,并且面板会在之后重新验证。但是宽度的输出是 0。为什么会这样?我能做什么呢?

最佳答案

经过进一步调查,我找到了一种正确读取组件宽度的方法:

sl_panel.getConstraint(SpringLayout.WIDTH, lbls.get(0)).getValue();

成功了。与相比,似乎是一个非常庞大的线路

lbls.get(0).getWidth();

不过。

关于java - UI-Update 后 SpringLayout 中组件的宽度等于 0,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41458862/

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