java—ui更新后springlayout中组件的宽度等于0

2hh7jdfx  于 2021-07-09  发布在  Java
关注(0)|答案(1)|浏览(374)

热释光;在不同的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);
        }

    }
}

当按下按钮时,ui会在底部更新一个标签。相应地安装Spring布局,然后重新验证面板。但是,宽度的输出为0。为什么会这样?我能做些什么?

llew8vvj

llew8vvj1#

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

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

有办法。与之相比,似乎是一条非常庞大的线

lbls.get(0).getWidth();

不过。

相关问题