2013-07-08 2 views
3

JPanel을 확장하고 이미지를 배경으로 칠하는 수퍼 클래스 (ImagePanel)를 만들었습니다. 내 ImagePanel 하위 클래스에서 NetBeans GUI 디자이너를 통해 GroupLayout을 사용하여 기본 이미지와 정렬 된 JTextFields로 패널을 오버레이합니다.배경 이미지와의 교차 플랫폼 레이아웃

이 방법은 단일 플랫폼에서 의도 한대로 작동합니다. 그러나 다른 플랫폼에서 응용 프로그램을 실행하면 JTextFields는 모양과 느낌에 따라 크기가 조정되거나 이동됩니다. 레이아웃 관리자를 null로 설정하면 JTextFields가 적절한 위치에 유지되지만 JTextFields의 크기가 조정되지 않습니다. 이상적으로, 나는 JTextFields의 위치를 ​​유지하고 싶지만 L & F에 따라 크기를 조정하고 싶습니다. 어떻게 다르게 접근 할 수 있습니까? Windows에서

/** 
* Extends JPanel adding the ability to paint a background image. 
*/ 
public class ImagePanel extends JPanel implements Serializable 
{ 
    public static final String PROP_IMAGEFILE = "imageFile"; 

    //~--- fields ------------------------------------------------------------- 

    private ImageIcon imageIcon; 
    private String imageFile; 

    /** 
    * Constructs a new ImagePanel. 
    */ 
    public ImagePanel() 
    { 
     // required by Beans specification. 
    } 

    /** 
    * Get the path to the image file used to paint the background. 
    * 
    * @return the path. 
    */ 
    public String getImageFile() 
    { 
     return imageFile; 
    } 

    /** 
    * Set the path to the image file used to paint the background. 
    * 
    * @param imageFile the image file path. 
    */ 
    public void setImageFile(String imageFile) 
    { 
     String oldImageFile = this.imageFile; 

     this.imageFile = imageFile; 

     imageIcon = new ImageIcon(getClass().getResource(imageFile)); 

     firePropertyChange(PROP_IMAGEFILE, oldImageFile, imageFile); 
    } 

    /** 
    * Overridden to draw image background image. 
    */ 
    @Override 
    public void paintComponent(Graphics g) 
    { 
     /* Draw image on the panel */ 
     super.paintComponent(g); 

     if (imageIcon != null) 
     { 
      /* create image icon to get image */ 
      Image image = imageIcon.getImage(); 

      if (image != null) 
      { 
       g.drawImage(image, 0, 0, getWidth(), getHeight(), this); 
      } 
     } 
    } 
} 

: Linux에서

enter image description here

:

enter image description here

+1

시리즈 중 하나를 사용해야 할 수도 있습니다. 복합 레이아웃을 만들거나 스크린 샷을 만들려면 – MadProgrammer

+2

+1을 만드십시오. (실제로 두 개의 탭에서 열어야 만합니다.) 중요한 부분은 구성 요소를 배경과 정렬하는 코드입니다. LayoutManager는이를 처리 할 수 ​​있어야합니다 내가 좋아하는 (놀라움, 놀라움 ... :-)은 MigLayout이다. 특정 지점에 구성 요소를 연결합니다. 그래도 이미지로 시도하지 않았습니다. – kleopatra

+1

* "기본 이미지와 정렬 된 JTextFields로 패널을 오버레이합니다."* 재앙으로 인한 것 같습니다. 자바 레이아웃에 관한 것은 컴포넌트의 크기를 추정하는 것이 아니라, (사용자, PLAF 등을 위해) 필요한 크기가 될 수 있도록 해준다. –

답변

0

나는 화합물 레이아웃이 경우에 작동 얼마나 잘되지 확신과 아주 잘 수 있습니다 널 레이아웃이 필요한 경우의 1 % 중 하나 (인간이 가능할 때마다 피해야합니다). 앞에서 언급했듯이 miglayout은 조금 놀아도 작동 할 수 있지만 위치 값보다는 하드 코드 비율 값을 사용해야 할 수도 있습니다. 이미지를 그린 후 각 구성 요소의 위치와 크기를 나타내는 이미지 백분율을 계산하고 해당 비율 값을 사용하여 프로그래밍 방식으로 구성 요소를 배치합니다.

add(); 메소드는 5 개의 변수 (구성 요소, 위치 x의 비율 값, 비율 값)를 취할 수 있으며, 위의 null 레이아웃 메소드보다 선호도가 높을 수 있습니다. 위치 y, 위치 x의 크기 값, 위치 y의 크기 값) 레이아웃 관리자를 작성하는 방법에 대해서는 잘 모르겠지만 선택 사항입니다.

관련 문제