TL; DR 다른 응용 프로그램 구성 요소 설정에서 응용 프로그램 구성 요소가 겹칠 수 있습니다. 이를 제거하기 위해 구성 요소의 너비를 확인하고 싶습니다.이 너비는 UI를 업데이트 한 후 항상 0입니다. 질문 끝에 간단하게 코드를 작성하십시오.UI 업데이트가 0 일 때 SpringLayout의 구성 요소 너비
기본 문제는 다른 DPI 설정에서 내 프로그램의 다른 부분이 가장 오른쪽에 도달하는 것입니다. 상위 DPI에서는 동적으로 생성 된 레이블을 사용하고 하위 DPI에서는 고정 폭 텍스트 필드를 사용합니다.
가능한 변경 DPI 설정을 처리하기 위해 SpringLayout과 협력 중입니다. 위에서 설명한대로 특정 설정 구성 요소가 겹치는 문제가 있습니다.
이것을 극복하기 위해 한 구성 요소의 왼쪽 가장자리가 다른 구성 요소의 오른쪽 가장자리보다 더 왼쪽에 있는지 확인하고 싶습니다.
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를 하단에있는 또 하나 개의 레이블이 업데이트됩니다 :
나는 문제가 폭 확인 폭 보여주기 위해 작은 testprogram을했다. 그에 따라 SpringLayout이 적합 해지고 패널이 다시 검증됩니다. 그러나 너비의 출력은 0입니다. 왜 그런가요? 내가 그걸 어떻게 할 수 있습니까?
sl_panel.getConstraint(SpringLayout.WIDTH, lbls.get(0)).getValue();
트릭을 수행합니다