2012-07-28 16 views
5

Ive에 JFrame이 있고 LayoutManager를 BorderLayout으로 설정 한 다음 이미지와 함께 JLabel을 추가합니다. 그러나 프레임 크기를 조정하면 JLabel의 크기가 조정되지 않습니다. 나는 North, S, E 등에 어떤 구성 요소도 추가하지 않았다. 나는 라벨 안의 이미지를 전체 프레임에 채워서 메뉴를 그대로두기를 바랬다.이미지 채우기로 JLabel을 만드는 방법 BorderLayout.CENTER

+0

해당 이미지가 공간을 차지할만큼 충분히 커지기를 바랍니다. 제발, 이것 좀 봐 [예제] (http://stackoverflow.com/a/11372350/1057230) –

+0

예, 이미지가 합리적으로 충분히 작습니다. 작은 아이콘이 아닙니다. –

+0

샘플 코드가 있습니까 ?? – MadProgrammer

답변

8

오만한 것처럼 보이면 용서해주세요.하지만 계속 할 일이 없습니다.

나는 그게 JLabel의 국경의 빠른 샘플을 BorderLayout narrow

이미지 주위에 빨간 선을 참조

BorderLayout wide

했다. 보시다시피 라벨은 전체 영역을 채울 수 있도록 크기가 조정되었습니다.)

내가 분명히 샘플

public class LayoutFrame extends JFrame { 

    public LayoutFrame() throws HeadlessException { 

     setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 

     Image image = null; 
     URL url = getClass().getResource("/layout/issue78.jpg"); 
     try { 
      image = ImageIO.read(url); 
     } catch (IOException ex) { 

      ex.printStackTrace(); 

     } 

     JLabel label = new JLabel(new ImageIcon(image)); 
     label.setHorizontalAlignment(JLabel.CENTER); 
     label.setVerticalAlignment(JLabel.CENTER); 
     label.setBorder(new LineBorder(Color.RED, 4)); 

     setLayout(new BorderLayout()); 

     add(label); 

    } 

    public static void main(String[] args) { 

     EventQueue.invokeLater(new Runnable() { 

      @Override 
      public void run() { 

       try { 
        UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName()); 
       } catch (ClassNotFoundException ex) { 
       } catch (InstantiationException ex) { 
       } catch (IllegalAccessException ex) { 
       } catch (UnsupportedLookAndFeelException ex) { 
       } 

       LayoutFrame frame = new LayoutFrame(); 
       frame.setSize(200, 200); 
       frame.setLocationByPlatform(true); 
       frame.setVisible(true); 

      } 
     }); 

    } 

} 

을 생산하는 데 사용되는 코드입니다, 당신은 당신의 자신의 이미지를 제공해야합니다.

레이블이 콘텐츠의 크기를 조정하지 않는다는 것을 잊지 마세요. 목표를 달성하려면 자체 구성 요소를 구현해야합니다.

여전히 문제가있는 경우 라벨이 생각 나는 컨테이너에 없을 수도 있고 컨테이너 레이아웃 관리자가 생각한 바가 아닐 수도 있습니다 (추가 증거가없는 경우).

당신이 구성 요소는 메뉴 없거나 문제를가는 문제가 발생하는 이유를 모르겠어요

UPDATE. 무겁고 가벼운 구성 요소를 혼합합니까 ?? 귀하의 질문에 좀 더 가까이를 읽은 후 메뉴 바

With menu bar

샘플, 나는 간단한 크기 조정 이미지 창 샘플을 고안했습니다. 속도를 위해, 나는 내 라이브러리에 의존했지만, 그것은

public class ImagePane extends JPanel { 

    protected static final Object RESIZE_LOCK = new Object(); 

    private BufferedImage image; 
    private BufferedImage scaledImage; 
    private Timer resizeTimer; 

    public ImagePane() { 

     URL url = getClass().getResource("/layout/issue78.jpg"); 
     try { 
      image = ImageIO.read(url); 
     } catch (IOException ex) { 

      ex.printStackTrace(); 

     } 

     resizeTimer = new Timer(250, new ActionListener() { 

      @Override 
      public void actionPerformed(ActionEvent e) { 

       // Simple thread factory to start a slightly lower 
       // priority thread. 
       CoreThreadFactory.getUIInstance().execute(new ResizeTask()); 

      } 

     }); 

     resizeTimer.setCoalesce(true); 
     resizeTimer.setRepeats(false); 

    } 

    @Override 
    public void setBounds(int x, int y, int width, int height) { 

     super.setBounds(x, y, width, height); 

     resizeTimer.restart(); 

    } 

    @Override 
    protected void paintComponent(Graphics g) { 

     super.paintComponent(g); 

     Graphics2D g2d = (Graphics2D) g; 
     if (scaledImage != null) { 

      // This simply returns a rectangle that takes into consideration 
      //the containers insets 
      Rectangle safeBounds = UIUtilities.getSafeBounds(this); 

      System.out.println("scaledImage = " + scaledImage.getWidth() + "x" + scaledImage.getWidth()); 

      int x = ((safeBounds.width - scaledImage.getWidth())/2) + safeBounds.x; 
      int y = ((safeBounds.height - scaledImage.getHeight())/2) + safeBounds.y; 

      g2d.drawImage(scaledImage, x, y, this); 

     } 

    } 

    protected class ResizeTask implements Runnable { 

     @Override 
     public void run() { 

      synchronized (RESIZE_LOCK) { 

       if (image != null) { 

        int width = getWidth(); 
        int height = getHeight(); 

        System.out.println("width = " + width); 
        System.out.println("height = " + height); 

        // A simple divide and conquer resize implementation 
        // this will scale the image so that it will fit within 
        // the supplied bounds 
        scaledImage = ImageUtilities.getScaledInstanceToFit(image, new Dimension(width, height), ImageUtilities.RenderQuality.High); 

        System.out.println("scaledImage = " + scaledImage.getWidth() + "x" + scaledImage.getWidth()); 

        repaint(); // this is one of the few thread safe calls 

       } 

      } 

     } 

    } 

} 
+0

thanx. 문제는 메뉴와 같은 모든 구성 요소가 손실되고 다른 구성 요소가 손실된다는 것입니다. 당신 말이 맞아요, 제 문제는 레이블이 고통의 어느 부분에있는 아이콘 이미지의 크기를 조절하지 않는다는 것입니다. –

+0

그것은 메뉴에 영향을 주어서는 안됩니다 : P – MadProgrammer

+0

@trashgod OP의 지식 수준을 알지 못해서 나는 경악하는 소리를 내고 싶지 않았지만 어떤 시도가 있었는지 전혀 몰랐습니다. 기본 : P – MadProgrammer

1

가장 좋은 방법은 하위 클래스 이미지 아이콘에 내 전화 대신에 구현 자신의 코드에 합리적으로 쉽게 단순히 페인트의 paintIcon의 메소드를 오버라이드 (override) Graphics.paint (x, y, width, height ...)를 사용해 이미지를 렌더링합니다.

+1

틀림없이 icon의 잘못된 구현 : getIconWidth/Height는 icon의 ** 고정 너비 **를 지정하여 _an int를 반환하도록 doc'ed되었습니다. 즉석에서 크기를 조정할 수는 없습니다 ... – kleopatra

+0

IMHO 생각합니다. 베이스 라인'Icon'을 가져갈 수있는 어떤 종류의'Factory'와 더 잘 어울리고, 당신을 위해 필요한 크기의 새로운'Icon'을 만들거나 페인트를 대신 할 수 있습니다. 그러나 스케일링 작업이 상당 할 경우 (원본 이미지의 크기에 따라 0.1 % 또는 몇 백 개 이상으로 축소라고 말하면) EDT를 "정지"시킬 위험이 있습니다. 예제에서 볼 수 있듯이 모든 요청에 ​​대해 크기를 조정하는 대신 크기 조정 요청에 대해 "병합"방식을 사용합니다. 일반적으로 "유휴 상태"에 이르면 최대한 적은 요청 만 시도하고 크기를 조정합니다. 하지만 그건 MHO – MadProgrammer

+0

@madProgrammer 원래 q를 심하게 말하면서 유감스럽게 생각합니다. 아이콘 안에있는 이미지의 크기를 조정하고 싶지 않습니다. 부모 구성 요소를 채우기 위해 이미지를 늘려야합니다. 나는이 나쁜 말씨가 아마도 당신의 반응을 망쳤다는 것을 알고 있습니다. 그러나 나는 그것이 내가 한 것을 왜 시도했는지 말하기를 바랍니다. –

관련 문제