2013-03-07 2 views
0

과제를 지금 당장 진행하고 있습니다. 본질적으로 첫 번째 GUI를 작성하고 있습니다. 스크롤 막대를 제외하고는 모든 것이 올바르게 작동하고 있습니다. 추가 할 때뿐만 아니라 표시되지 않을뿐만 아니라 주석을 추가 한 후에도 .add 함수 호출을 통해 추가 된 마지막 요소가 전체 GUI를 포함합니다. 레이아웃을 null로 설정하면 문제가 해결되는 것처럼 보였지만 첫 번째 문제가 도움이되는지 방해가되는지 확신 할 수 없습니다. 필자는 오라클의 설명서와 예제를 이미 봤으며 필자가 필요로하는 것을 보지 못했습니다.JScrollPane이 나타나지 않고 요소가 넘쳤습니다

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

    public class Example 
     { 
     public static void main(String[] args) 
     {  

    JFrame mygui = new JFrame(); 
    mygui.getContentPane(); 
    mygui.setBounds(100, 100, 700, 500); 
    mygui.setLayout(new BorderLayout()); //playing with layout here 

    JLabel first = new JLabel("integer:"); 
    JLabel second = new JLabel("float:"); 
    JLabel third = new JLabel("short:"); 
    JLabel fourth = new JLabel("long:"); 
    JLabel fifth = new JLabel("byte:"); 
    JLabel sixth = new JLabel("double:"); 
    JLabel seventh = new JLabel("boolean:"); 
    JTextField myint = new JTextField("" + a); 
    JTextField myfloat = new JTextField("" + b); 
    JTextField myshort = new JTextField("" + c); 
    JTextField mylong = new JTextField("" + d); 
    JTextField mybyte = new JTextField("" + e); 
    JTextField mydbl = new JTextField("" + f); 
    JTextField mybool = new JTextField("" + g); 
    JTextArea myarea = new JTextArea(); 
    JScrollPane scrolla = new JScrollPane(myarea); 

    first.setOpaque(true); 
    first.setBounds(20, 20, 50, 20); 
    second.setOpaque(true); 
    second.setBounds(20, 70, 50, 20); 
    third.setOpaque(true); 
    third.setBounds(20, 120, 50, 20); 
    fourth.setOpaque(true); 
    fourth.setBounds(20, 170, 50, 20); 
    fifth.setOpaque(true); 
    fifth.setBounds(20, 220, 50, 20); 
    sixth.setOpaque(true); 
    sixth.setBounds(20, 270, 50, 20); 
    seventh.setOpaque(true); 
    seventh.setBounds(20, 320, 50, 20); 

    myint.setBounds(70, 20, 50, 20); 
    myint.setOpaque(true); 
    myfloat.setBounds(70, 70, 50, 20); 
    myfloat.setOpaque(true); 
    myshort.setBounds(70, 120, 50, 20); 
    myshort.setOpaque(true); 
    mylong.setBounds(70, 170, 80, 20); 
    mylong.setOpaque(true); 
    mybyte.setBounds(70, 220, 50, 20); 
    mybyte.setOpaque(true); 
    mydbl.setBounds(70, 270, 50, 20); 
    mydbl.setOpaque(true); 
    mybool.setBounds(70, 320, 50, 20); 
    mybool.setOpaque(true); 

    myarea.setBounds(200, 50, 250, 200); 
    myarea.setOpaque(true); 
    scrolla.setPreferredSize(new Dimension(250, 200)); 

    mygui.add(first); 
    mygui.add(second); 
    mygui.add(third); 
    mygui.add(fourth); 
    mygui.add(fifth); 
    mygui.add(sixth); 
    mygui.add(seventh); 

    mygui.add(myint); 
    mygui.add(myfloat); 
    mygui.add(myshort); 
    mygui.add(mylong); 
    mygui.add(mybyte); 
    mygui.add(mydbl); 
    mygui.add(mybool); 
    mygui.add(scrolla); 

    myarea.append("" + errcheck + "\n"); 
    myarea.append("" + valcheck + "\n"); 

    while(y < 2) 
    { 
    myarea.append("" + a + "\n"); 
    myarea.append("" + b + "\n"); 
    myarea.append("" + c + "\n"); 
    myarea.append("" + d + "\n"); 
    myarea.append("" + e + "\n"); 
    myarea.append("" + f + "\n"); 
    myarea.append("" + g + "\n"); 
    myarea.append("" + w + "\n"); 
    myarea.append("" + u + "\n"); 
    myarea.append("" + v + "\n"); 
    myarea.append("" + secondary + "\n"); 
    myarea.append("" + whilecount + "\n");; 
    y++; 
    a--; 
    } 

    mygui.setVisible(true); 
    mygui.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
    } 
} 

내가 확신이 뭔가 : 여기에 관련 코드 (공간에 떠있는 것 같다 변수 AG는 별도의 섹션의 일부이며 GUI 코드를 분리 할 수 ​​있도록 내가 그것을 붙여하지 않은 경우)입니다 간단하지만 모든 의견을 보내 주시면 감사하겠습니다.

답변

3

BorderLayout는 기본 위치는 CENTER입니다 구성 요소를 추가 할 수있는에 다섯 개 정의 위치 ...

enter image description here

있습니다.

기본적으로 프레임/콘텐츠 창에 각 구성 요소를 추가 할 때 주어진 위치 내에 하나의 구성 요소 만 존재할 수 있기 때문에 마지막 구성 요소를 제거하고 중간에 배치합니다.

레이아웃 관리자를 변경하여 시작하십시오.

-2

제거이 라인 :이 일을하지 않는 원인

mygui.getContentPane(); 

. 모든 구성 요소에 자신에 대한 경계를 지정하려면 원인 또한,

mygui.getContentPane().setLayout (null); // playing with layout here 

mygui.setLayout(new BorderLayout()); //playing with layout here 

을 변경합니다. 당신이 원하는 크기를 필요로하지 않기 때문에 레이아웃 매니저없이

scrolla.setPreferredSize(new Dimension(250, 200)); 

: 또한

scrolla.setBounds(200, 50, 250, 200); 

myarea.setBounds(200, 50, 250, 200); 

을 변경하고 다음 줄을 제거합니다. 또한

mygui.add(first); 
mygui.add(second); 
mygui.add(third); 
mygui.add(fourth); 
mygui.add(fifth); 
mygui.add(sixth); 
mygui.add(seventh); 

mygui.add(myint); 
mygui.add(myfloat); 
mygui.add(myshort); 
mygui.add(mylong); 
mygui.add(mybyte); 
mygui.add(mydbl); 
mygui.add(mybool); 
mygui.add(scrolla); 

mygui.getContentPane().add(first); 
mygui.getContentPane().add(second); 
mygui.getContentPane().add(third); 
mygui.getContentPane().add(fourth); 
mygui.getContentPane().add(fifth); 
mygui.getContentPane().add(sixth); 
mygui.getContentPane().add(seventh); 

mygui.getContentPane().add(myint); 
mygui.getContentPane().add(myfloat); 
mygui.getContentPane().add(myshort); 
mygui.getContentPane().add(mylong); 
mygui.getContentPane().add(mybyte); 
mygui.getContentPane().add(mydbl); 
mygui.getContentPane().add(mybool); 
mygui.getContentPane().add(scrolla); 

에 원인 요소가 JFrame의에 직접 추가,하지만 컨텐츠 창에해서는 안 변경합니다. 이러한 변경 후 잘 작동합니다. 텍스트 영역에 충분한 텍스트가 있으면 스크롤 막대가 표시됩니다. 여기에 나를 위해 작동 코드의 고정 혼란 스럽다은 다음과 같습니다

import java.awt.Color; 
import java.awt.Dimension; 

import javax.swing.JFrame; 
import javax.swing.JLabel; 
import javax.swing.JScrollPane; 
import javax.swing.JTextArea; 
import javax.swing.JTextField; 

public class Example 
{ 
    public static void main (String [] args) 
    { 

     JFrame mygui = new JFrame(); 
     mygui.getContentPane(); 
     mygui.setBounds (100, 100, 700, 500); 
     mygui.getContentPane().setLayout (null); // playing with layout here 

     JLabel first = new JLabel ("integer:"); 
     JLabel second = new JLabel ("float:"); 
     JLabel third = new JLabel ("short:"); 
     JLabel fourth = new JLabel ("long:"); 
     JLabel fifth = new JLabel ("byte:"); 
     JLabel sixth = new JLabel ("double:"); 
     JLabel seventh = new JLabel ("boolean:"); 
     JTextField myint = new JTextField ("a"); 
     JTextField myfloat = new JTextField ("b"); 
     JTextField myshort = new JTextField ("c"); 
     JTextField mylong = new JTextField ("d"); 
     JTextField mybyte = new JTextField ("e"); 
     JTextField mydbl = new JTextField ("f"); 
     JTextField mybool = new JTextField ("g"); 
     JTextArea myarea = new JTextArea(); 
     JScrollPane scrolla = new JScrollPane (myarea); 

     first.setOpaque (true); 
     first.setBounds (20, 20, 50, 20); 
     second.setOpaque (true); 
     second.setBounds (20, 70, 50, 20); 
     third.setOpaque (true); 
     third.setBounds (20, 120, 50, 20); 
     fourth.setOpaque (true); 
     fourth.setBounds (20, 170, 50, 20); 
     fifth.setOpaque (true); 
     fifth.setBounds (20, 220, 50, 20); 
     sixth.setOpaque (true); 
     sixth.setBounds (20, 270, 50, 20); 
     seventh.setOpaque (true); 
     seventh.setBounds (20, 320, 50, 20); 

     myint.setBounds (70, 20, 50, 20); 
     myint.setOpaque (true); 
     myfloat.setBounds (70, 70, 50, 20); 
     myfloat.setOpaque (true); 
     myshort.setBounds (70, 120, 50, 20); 
     myshort.setOpaque (true); 
     mylong.setBounds (70, 170, 80, 20); 
     mylong.setOpaque (true); 
     mybyte.setBounds (70, 220, 50, 20); 
     mybyte.setOpaque (true); 
     mydbl.setBounds (70, 270, 50, 20); 
     mydbl.setOpaque (true); 
     mybool.setBounds (70, 320, 50, 20); 
     mybool.setOpaque (true); 

     myarea.setOpaque (true); 
     myarea.setBackground (Color.yellow); 
     scrolla.setBounds (200, 50, 250, 200); 
     scrolla.setPreferredSize (new Dimension (250, 200)); 

     mygui.getContentPane().add (first); 
     mygui.getContentPane().add (second); 
     mygui.getContentPane().add (third); 
     mygui.getContentPane().add (fourth); 
     mygui.getContentPane().add (fifth); 
     mygui.getContentPane().add (sixth); 
     mygui.getContentPane().add (seventh); 

     mygui.getContentPane().add (myint); 
     mygui.getContentPane().add (myfloat); 
     mygui.getContentPane().add (myshort); 
     mygui.getContentPane().add (mylong); 
     mygui.getContentPane().add (mybyte); 
     mygui.getContentPane().add (mydbl); 
     mygui.getContentPane().add (mybool); 
     mygui.getContentPane().add (scrolla); 

     myarea.append ("sdfgsdfgsdfgsf\n"); 

     mygui.setVisible (true); 
     mygui.setDefaultCloseOperation (JFrame.EXIT_ON_CLOSE); 
    } 
} 
+4

'null'레이아웃을 사용하는 초보자에게 절대 제안하지 마십시오. 처리해야 할 필요없이 처리 할 수 ​​있습니다. 그것은 나쁜 습관이고 이런 상황에서 다른 사람들에게 더 혼란스럽게 도움이되지 않습니다. – MadProgrammer

+1

-1, 프레임에 구성 요소를 추가하면 내용 창에 구성 요소가 추가되므로 getContentPane()을 사용하면 필요하지 않으며 문제를 수정/변경하지 않습니다. 또한 null 레이아웃을 사용하는 것은 좋지 않으므로 이와 같은 양식을 작성하는 데 사용해서는 안됩니다. 적절한 방법은, 적절한 LayoutManager를 사용해 JPanel를 작성해, 그 패널을 프레임에 추가하는 것입니다. – camickr

+0

@MadProgrammer null 레이아웃의 문제점은 무엇입니까? 레이아웃 관리자는 꽤 복잡한 영역이며 모든 구성 요소의 범위를 명시 적으로 지정하면 초보자가 쉽게 작업 할 수있는 좋은 방법이 될 수 있습니다. –

1

BorderLayout을 사용하는 경우 setBounds() 메서드는 아무런 영향을주지 않습니다.당신은 당신이 add(comp, BorderLayout.EAST) 같은 위치를 지정하지 않는 경우 북부, 남부, 동부, 서부, 센터
, 그것은 당신의 구성 요소
무작위로 렌더링에만 다섯 개 위치 에 구성 요소를 해결할 수
, BorderLayout를 사용. 위치를 지정하지 않고 더 많은 구성 요소를 추가하면 겹치기 쉽고 명확한보기를 제공하지 않습니다.

다섯 개 이상의 구성 요소를 사용 중이고 위치를 지정하지 않으므로 스크롤 팬
이 표시되지 않습니다.

올바른 결과를 얻으려면 GridBagLayout을 사용하십시오. 참조하십시오. http://docs.oracle.com/javase/tutorial/uiswing/layout/gridbag.html

관련 문제