2011-04-07 8 views
2

GridBagLayout에 구성 요소가 배치되었습니다. JPanel 자체뿐만 아니라 모든 구성 요소 사이에 1px 검정색 선이 필요합니다.스윙 GridBagLayout 구성 요소의 구성 요소간에 1px 경계선을 그립니다.

현재 저는 MatteBorder를 사용하고 있습니다. 상위 구성 요소의 상단 및 왼쪽 가장자리에는 1 픽셀 매트 경계가 있습니다. 각 하위 구성 요소에는 오른쪽 및 아래쪽 가장자리에 1x 크기의 MatteBorder가 있습니다. 수평 및 수직 갭은 GridBagLayout상에서 제로입니다.

주로 부모 경계를 만나는 경우가 종종 있습니다. Gaps in borders

이는 하위 구성 요소에 대한 여분의 공간 분포에서 반올림/부동 소수점 부정확성 때문인 것으로 생각됩니다.

이 모양을 얻는 더 좋은 방법이 있습니까?

public class SSBGuiTest extends JDialog { 
    public SSBGuiTest(Frame owner) { 
     super(owner); 
     initComponents(); 
    } 

    public SSBGuiTest(Dialog owner) { 
     super(owner); 
     initComponents(); 
    } 

    private void initComponents() { 
     // JFormDesigner - Component initialization - DO NOT MODIFY //GEN-BEGIN:initComponents 
     wrapperPanel = new JPanel(); 
     panelWithTopLeftMatteBorder = new JPanel(); 
     panel1 = new JPanel(); 
     label1 = new JLabel(); 
     panel2 = new JPanel(); 
     label2 = new JLabel(); 
     panel3 = new JPanel(); 
     label3 = new JLabel(); 

     //======== this ======== 
     Container contentPane = getContentPane(); 
     contentPane.setLayout(new BorderLayout()); 

     //======== wrapperPanel ======== 
     { 
      wrapperPanel.setBorder(new EmptyBorder(15, 15, 15, 15)); 
      wrapperPanel.setLayout(new BorderLayout()); 

      //======== panelWithTopLeftMatteBorder ======== 
      { 
       panelWithTopLeftMatteBorder.setBorder(new MatteBorder(1, 1, 0, 0, Color.black)); 
       panelWithTopLeftMatteBorder.setLayout(new GridBagLayout()); 
       ((GridBagLayout)panelWithTopLeftMatteBorder.getLayout()).columnWidths = new int[] {0, 0}; 
       ((GridBagLayout)panelWithTopLeftMatteBorder.getLayout()).rowHeights = new int[] {0, 0, 0, 0}; 
       ((GridBagLayout)panelWithTopLeftMatteBorder.getLayout()).columnWeights = new double[] {1.0, 1.0E-4}; 
       ((GridBagLayout)panelWithTopLeftMatteBorder.getLayout()).rowWeights = new double[] {1.0, 1.0, 1.0, 1.0E-4}; 

       //======== panel1 ======== 
       { 
        panel1.setBorder(new MatteBorder(0, 0, 1, 1, Color.black)); 
        panel1.setLayout(new BorderLayout()); 

        //---- label1 ---- 
        label1.setHorizontalAlignment(SwingConstants.CENTER); 
        label1.setText("label1"); 
        panel1.add(label1, BorderLayout.CENTER); 
       } 
       panelWithTopLeftMatteBorder.add(panel1, new GridBagConstraints(0, 0, 1, 1, 0.0, 0.0, 
        GridBagConstraints.CENTER, GridBagConstraints.BOTH, 
        new Insets(0, 0, 0, 0), 0, 0)); 

       //======== panel2 ======== 
       { 
        panel2.setBorder(new MatteBorder(0, 0, 1, 1, Color.black)); 
        panel2.setLayout(new BorderLayout()); 

        //---- label2 ---- 
        label2.setHorizontalAlignment(SwingConstants.CENTER); 
        label2.setText("label2"); 
        panel2.add(label2, BorderLayout.CENTER); 
       } 
       panelWithTopLeftMatteBorder.add(panel2, new GridBagConstraints(0, 1, 1, 1, 0.0, 0.0, 
        GridBagConstraints.CENTER, GridBagConstraints.BOTH, 
        new Insets(0, 0, 0, 0), 0, 0)); 

       //======== panel3 ======== 
       { 
        panel3.setBorder(new MatteBorder(0, 0, 1, 1, Color.black)); 
        panel3.setLayout(new BorderLayout()); 

        //---- label3 ---- 
        label3.setHorizontalAlignment(SwingConstants.CENTER); 
        label3.setText("label3"); 
        panel3.add(label3, BorderLayout.CENTER); 
       } 
       panelWithTopLeftMatteBorder.add(panel3, new GridBagConstraints(0, 2, 1, 1, 0.0, 0.0, 
        GridBagConstraints.CENTER, GridBagConstraints.BOTH, 
        new Insets(0, 0, 0, 0), 0, 0)); 
      } 
      wrapperPanel.add(panelWithTopLeftMatteBorder, BorderLayout.CENTER); 
     } 
     contentPane.add(wrapperPanel, BorderLayout.CENTER); 
     pack(); 
     setLocationRelativeTo(getOwner()); 
     // JFormDesigner - End of component initialization //GEN-END:initComponents 
    } 

    // JFormDesigner - Variables declaration - DO NOT MODIFY //GEN-BEGIN:variables 
    private JPanel wrapperPanel; 
    private JPanel panelWithTopLeftMatteBorder; 
    private JPanel panel1; 
    private JLabel label1; 
    private JPanel panel2; 
    private JLabel label2; 
    private JPanel panel3; 
    private JLabel label3; 
    // JFormDesigner - End of variables declaration //GEN-END:variables 
} 

다음과 같습니다 : 첨부

은 간단한 예입니다

enter image description here

답변

2

나는 LineBorder가 될 것으로 보인다 이후가 아니라 matteBorder ...보다 BorderFactory.createLineBorder(color, thickness)를 사용하는 거라고 생각 네가하려는 것을 조금 더 가까이서. 편의상 LineBorder.createBlackLineBorder()을 사용할 수도 있습니다.

일부 구성 요소의 바깥 쪽이 해당 컨테이너 내부에 맞지 않는 경우 컨테이너 (즉, 바깥 쪽 구성 요소)에 0이 아닌 인 세트가 설정되어 있지 않은지 확인하십시오!


대체 솔루션은 배경 용기는 검은 색 배경에 1 개 픽셀 세트를 가지고 있고, 그들 사이에 1 개 픽셀 간격으로에 비 경계 구성 요소를 배치하도록 할 수 있습니다. 따라서 구성 요소가없는 곳에서는 매우 정확한 검정색 선이 나타나야하며 여러 테두리가 만나서 너비가 두배가되는 문제가 해결됩니다.


마지막으로 테이블을 그릴 구성 요소를 사용하고있는 것처럼 보입니다. 어떤 종류의 동작을하기 위해 이러한 구성 요소가 필요합니까 아니면 실제로 구성 요소에 테이블을 넣는 것이 좋을까요? 예를 들어를 사용하면 매우 편리하게이 작업을 수행 할 수 있습니다. JLabel s JTextPanel s이고 표시 할 내용은 text 속성을 HTML로 설정하십시오. Java는 매우 정교한 HTML 레이아웃 엔진을 통합하여 인라인 또는 심지어 href '파일의 CSS 하위 세트를 잘 처리합니다.

+0

칼, 정확한 테두리를 얻으려고합니다. 선 경계선이있는 두 구성 요소가 서로 대치되면 1px 대신 2px 경계가 있습니다. –

+0

검정색 배경에 1px 패딩을 적용하고 흰색 구성 요소를 겹쳐 보았습니다.하지만 위아래 하위 구성 요소는 어떤 이유로 상단과 하단에 두꺼운 테두리가 있습니다. 또한이 구성 요소에서 PDF를 생성 중이며 검정색 배경이 실제 라인 좌표보다 덜 최적 인 PDF 지침이 될 수 있다고 우려하고 있습니다. –

+0

@ Sam Barnum : 설명 주셔서 감사합니다! 나는 당신의 문제를 완전히 해결하지 못했지만 그것을 재현 할 수있었습니다. 다양한 패널에 다른 배경색을 설정함으로써, 내부 구성 요소가 외부 패널을 완전히 채우지 못한다는 것을 보여줄 수있었습니다. 상단, 우측 및 하단에 2px 간격이 있습니다. 어쩌면 당신이 모르고 있거나 보지 않은 인 세트가있을 수 있습니까? –

관련 문제