2016-11-08 13 views
0

자바 스윙을 사용하고 있습니다. 나는 그림 그리드를 추가하고 싶다.간격없이 아이콘을 설정하는 방법은 무엇입니까?

public class LayoutTest { 
    JFrame frame = new JFrame("GridLayout demo"); 
    JPanel panel = new JPanel(); 
    JButton btn1 = new JButton("First"); 
    JButton btn2 = new JButton("Second"); 
    JButton btn3 = new JButton("Third"); 
    JButton btn4 = new JButton("Fourth"); 
    JPanel panel2 = new JPanel(); 
    JButton btn12 = new JButton("First2"); 
    JButton btn22 = new JButton("Second2"); 
    JButton btn32 = new JButton("Third2"); 
    JButton btn42 = new JButton("Fourth2"); 
    JPanel panel3 = new JPanel(); 
    JButton btn13 = new JButton("First2"); 
    JButton btn23 = new JButton("Second2"); 
    JButton btn33 = new JButton("Third2"); 
    JButton btn43 = new JButton("Fourth2"); 

    JLabel label13 = new JLabel(new ImageIcon("pictures/building.jpg"), JLabel.CENTER); 
    JLabel label23 = new JLabel(new ImageIcon("pictures/building2.png"), JLabel.CENTER); 
    JLabel label33 = new JLabel(new ImageIcon("pictures/building.jpg"), JLabel.CENTER); 
    JLabel label43 = new JLabel(new ImageIcon("pictures/building2.png"), JLabel.CENTER); 
    public LayoutTest() { 
     panel3.setLayout(new GridLayout(2,2,0,0)); 
     panel3.add(label13); 
     panel3.add(label23); 
     panel3.add(label33); 
     panel3.add(label43); 

     frame.add(panel3); 

     frame.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE); 
     frame.pack(); 
//  frame.setSize(40,40); 
     frame.setVisible(true); 
    } 

} 

결과 : this image. 나는 gridLayout을 사용하고있다. 내 사진 크기는 20x20 픽셀입니다. 이 수평 간격이없는 이미지를 추가하려면 어떻게해야합니까?

+1

프레임 장식이 여분의 크기를 강요 것으로 보인다. 네 개의 아이콘이 한 행에 추가 된 경우 간격이 줄어들거나 사라집니다. 일반적인 팁 : 1) 더 나은 도움을 더 빨리 얻으려면 [MCVE] 또는 [Short, Self Contained, Correct Example] (http://www.sscce.org/)를 게시하십시오. 2) 예를 들어 이미지를 얻는 한 가지 방법은 [이 Q & A] (http://stackoverflow.com/q/19209650/418556)에서 볼 수있는 이미지에 핫 링크하는 것입니다. .. –

+0

.. 3) 애플리케이션 리소스는 배포 시점까지 임베디드 리소스가 될 것이므로 지금 당장 액세스하는 것이 현명합니다. [tag : embedded-resource]는 파일이 아닌 URL로 액세스해야합니다. [info. URL을 구성하는 방법은 임베디드 리소스 페이지 (http://stackoverflow.com/tags/embedded-resource/info)를 참조하십시오. –

+0

첫 번째 댓글을 확장하십시오. 프레임의 기본 레이아웃은'BorderLayout'입니다. 구성 요소가 제약 조건없이 테두리 레이아웃에 추가되면 'CENTER'로 끝납니다. 테두리 레이아웃의 가운데에 추가 된 구성 요소 ('panel3')는 사용 가능한 전체 너비와 높이를 채우기 위해 늘어납니다. 'GridLayout'은 가장 넓고 가장 높은 그리드 셀에 대해 필요한 너비와 높이를 할당합니다. 따라서 content pane의'LINE_START' 또는'LINE_END'에'panel3'을 추가함으로써이 동작을 피할 수 있습니다 -이 위치는 높이를 늘리 겠지만 너비를 존중합니다. –

답변

1

감사합니다. Andrew Thompson! 더 큰 크기의 그리드를 사용하는 것과 같습니다. enter image description here

1

프레임 장식이 추가 크기를 강제하는 것으로 보입니다. 네 개의 아이콘이 한 행에 추가 된 경우 간격이 줄어들거나 사라집니다.

프레임의 기본 레이아웃은 BorderLayout입니다. 제한 사항을 지정하지 않고 테두리 레이아웃에 구성 요소를 추가하면 CENTER이됩니다. 테두리 레이아웃의 가운데에 추가 된 구성 요소 (panel3)는 사용 가능한 전체 폭과 높이를 채우기 위해 늘어납니다. GridLayout은 가장 넓고 가장 높은 그리드 셀에 대해 필요한 너비와 높이를 동일하게 할당합니다. 따라서 콘텐츠 창 LINE_START 또는 LINE_END 중 하나에 panel3을 추가하면이 동작을 피할 수 있습니다.이 위치는 높이가 늘어나지 만 너비는 존중합니다.

다음은 경계 레이아웃의 각 제약 조건 내에서의 효과를 보여주는 예제입니다.

enter image description hereenter image description here

import java.awt.*; 
import java.awt.image.BufferedImage; 
import javax.swing.*; 
import javax.swing.border.EmptyBorder; 

public class GridLayoutSpace { 

    private JComponent ui = null; 

    GridLayoutSpace() { 
     initUI(); 
    } 

    public void initUI() { 
     if (ui!=null) return; 

     ui = new JPanel(new BorderLayout()); 
     ui.setBorder(new EmptyBorder(4,4,4,4)); 

     addFourIcons(Color.ORANGE, BorderLayout.PAGE_START); 
     addFourIcons(Color.ORANGE, BorderLayout.PAGE_END); 

     addFourIcons(Color.BLUE, BorderLayout.LINE_START); 
     addFourIcons(Color.BLUE, BorderLayout.LINE_END); 

     addFourIcons(Color.YELLOW, BorderLayout.CENTER); 
    } 

    private void addFourIcons(Color bg, String constraint) { 
     JPanel p = new JPanel(new GridLayout(0, 2, 0, 0)); 
     p.setBackground(bg); 
     ui.add(p, constraint); 
     p.add(new JLabel(new ImageIcon(getImage(Color.RED)))); 
     p.add(new JLabel(new ImageIcon(getImage(Color.GREEN)))); 
     p.add(new JLabel(new ImageIcon(getImage(Color.GREEN)))); 
     p.add(new JLabel(new ImageIcon(getImage(Color.RED)))); 
    } 
    int sz = 24; 
    private BufferedImage getImage(Color color) { 
     BufferedImage bi = new BufferedImage(sz, sz, BufferedImage.TYPE_INT_RGB); 
     Graphics g = bi.getGraphics(); 
     g.setColor(color); 
     g.fillRect(0,0, sz, sz); 
     g.dispose(); 
     return bi; 
    } 

    public JComponent getUI() { 
     return ui; 
    } 

    public static void main(String[] args) { 
     Runnable r = new Runnable() { 
      @Override 
      public void run() { 
       try { 
        UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName()); 
       } catch (Exception useDefault) { 
       } 
       GridLayoutSpace o = new GridLayoutSpace(); 

       JFrame f = new JFrame(o.getClass().getSimpleName()); 
       f.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE); 
       f.setLocationByPlatform(true); 

       f.setContentPane(o.getUI()); 
       f.pack(); 
       f.setMinimumSize(f.getSize()); 

       f.setVisible(true); 
      } 
     }; 
     SwingUtilities.invokeLater(r); 
    } 
}