2017-01-04 2 views
1

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(); 

트릭을 수행합니다

답변

0

추가 조사 후 나는 제대로 구성 요소의 폭을 읽을 수있는 방법을 발견했다. 매우 방대한 라인 인 것 같습니다.

lbls.get(0).getWidth();