2017-01-17 1 views
0

비교적 작은 규모의 텍스트 기반 게임을 JFrame 안에 만들려고합니다. 나는 이것을 JFrame을 일정한 크기로 유지할 계획이므로 setResizable(false)을 호출했습니다.JFrame의 boxed JScrollPane 사이의 여분의 공간

내 목표는 다소 콘솔처럼 행동 또는 명령 프롬프트 텍스트 I/O 기능을 만드는 것이 었습니다, 그래서 JScollPane 내부에 두 개의 JTextArea의 각이하고 나는 Box, 하나 둘 추가했습니다 다른 쪽 위에. 이 구성 요소가 일정한 크기를 유지하기를 원했기 때문에 setPreferredSize()setMaximumSize()을 적절한 크기로 호출했습니다.

그러나이 상자 중 두 개를 JFrame에 추가하면 가로 간격이 분리됩니다. 간격은 구성 요소의 오른쪽 경계에 부착 된 것으로 보입니다. 이 동작에 대한 첨부 된 그림을 참조하십시오.

gaps).

콘텐츠 창에서 FlowLayout을 사용 중입니다. hGap을 0으로 설정했지만 추가 한 구성 요소 사이에 여전히 간격이 있으며 이유를 파악할 수 없습니다.

JFrame 자체 또는 레이아웃 관리자에서 문제가 없는지 확인하기 위해 버튼 사이에 간격이 없다는 것을 설명하는 버튼이있는 상자 두 개를 추가했습니다.

가능한 한 틈을 없애거나 적어도 그 원인을 파악하고 싶습니다. 이 시점에서 다른 문제가 무엇인지 알 수는 없으며 조언을 주시면 감사하겠습니다.

편집 : 내 문제를 보여주기 위해이 클래스에 코드의

no gaps

내가 발췌 한 관련 비트 : : 여기처럼 보이도록이 데모 클래스를 원하는 무엇의 사진입니다

import javax.swing.*; 
import java.awt.*; 

public class Demo extends JFrame { 
    public Demo() { 
     super("Demo"); 
     setSize(400, 400); 
     setResizable(false); 

     int Y_AXIS = BoxLayout.Y_AXIS; 

     getContentPane().setLayout(new FlowLayout(FlowLayout.CENTER, 0, 0)); 
     getContentPane().setBackground(Color.RED); 

     Box boxA = new Box(Y_AXIS); 
     boxA.add(createComponent("output")); 
     boxA.add(createComponent("input")); 
     this.add(boxA); 

     Box boxB = new Box(Y_AXIS); 
     boxB.add(createComponent("output")); 
     boxB.add(createComponent("input")); 
     this.add(boxB); 

     Box boxC = new Box(Y_AXIS); 
     boxC.add(new JButton("Button")); 
     boxC.add(new JButton("Button")); 
     this.add(boxC); 

     Box boxD = new Box(Y_AXIS); 
     boxD.add(new JButton("Button")); 
     boxD.add(new JButton("Button")); 
     this.add(boxD); 

     this.setVisible(true); 
    } 

    private JScrollPane createComponent(String initial) { 
     JTextArea ta = new JTextArea(3, 10); 
     ta.setText(initial); 
     JScrollPane sp = new JScrollPane(ta); 

     Dimension pref = new Dimension(100, 100); 
     sp.setPreferredSize(pref); 
     sp.setMaximumSize(pref); 

     sp.setVerticalScrollBarPolicy(JScrollPane.VERTICAL_SCROLLBAR_NEVER); 
     sp.setHorizontalScrollBarPolicy(JScrollPane.HORIZONTAL_SCROLLBAR_NEVER); 

     return sp; 
    } 

    public static void main(String[] args) { 
     Demo d = new Demo(); 
    } 

} 
+1

1) 공백은 'FlowLayout'이 아닌 'Box'에서 오는 것 같습니다. 2) ASCII 아트 또는 GUI의 * 의도 된 레이아웃의 간단한 그림을 제공하십시오. –

+0

@AndrewThompson 팁 주셔서 감사! 당신이 제안한 것처럼 나는 GUI가 어떻게 보이길 원하는지 그림으로 포스트를 수정했다. 기본적으로 나는 그 차이를 없애고 싶다. Box가 나타날 수 있다는 것에 대해 알고 있습니까? 나는 당황 스럽다 - JButtons의 쌍은 또한 상자에 있지만 틈새를 보이지 않는다. – kattusite

+1

아마도 4 개의 패널을 사용할 것입니다. 1) 텍스트 영역을위한 2x2'GridLayout'. 2) 버튼을위한 2x2'GridLayout'. 3) 버튼을 포함하는 패널을 중앙에 배치하기위한'GridBagLayout'. 4) 텍스트 영역 패널 ('LINE_START')의'BorderLayout'과'GridBagLayout' ('LINE_END')을 사용한 패널. - 선호하는 것을 망치지 마십시오. minimu 또는 최대 크기. 테두리 레이아웃이있는 패널에'EmptyBorder '를 추가 한 다음 프레임을 보여주기 직전에 포장하십시오. –

답변

0

정확히 왜 스윙이나 LayoutManagers에 익숙하지는 않지만, 그 원인을 찾아 냈습니다.

내부 구성 요소의 setMaximumSize()에 대한 호출 만 제거하면 프로그램이 원하는 방식으로 작동합니다. 내 생각 엔 레이아웃 관리자 중 하나 (아마도 Box에 내장 된 BoxLayout?)는 원하는 크기에 의존하지 않고 절대 최대 크기를 사용하도록 요청했을 때 예상했던대로 동작하지 않습니다. 작업.

다음은 수정 된 코드입니다. 문제의 라인이 주석 처리되었습니다. 이 솔루션은 내가가 원하는 것을 있지만 앤드류 톰슨은 그의 주석에서 언급 한 바와 같이

private JScrollPane createComponent(String initial) { 
    JTextArea ta = new JTextArea(3, 10); 
    ta.setText(initial); 
    JScrollPane sp = new JScrollPane(ta); 

    Dimension pref = new Dimension(100, 100); 
    sp.setPreferredSize(pref); 
    //sp.setMaximumSize(pref); 

    sp.setVerticalScrollBarPolicy(JScrollPane.VERTICAL_SCROLLBAR_NEVER); 
    sp.setHorizontalScrollBarPolicy(JScrollPane.HORIZONTAL_SCROLLBAR_NEVER); 

    return sp; 
} 

, 그것은 아마도 적합하지 않습니다, 나는 선호/최대 크기의 설정을 피하려고한다.