2010-11-24 4 views
2

JLabel과 3 개의 버튼으로 구성된 간단한 스윙 애플리케이션이 있습니다. 3 개의 버튼은 JLabel과 함께 JFrame에있는 자체 JPanel에 있습니다. JPanel은 flowlayout 관리자를 사용하여 버튼을 수평으로 배열하고 JFrame은 BorderLayout 관리자를 사용하여 JLabel과 JPanel을 세로로 정렬합니다.모든 버튼을 표시하도록 JFrame 크기를 자동으로 조정할 수있는 방법

내 문제는 응용 프로그램을 사용하는 동안 버튼 중 하나의 텍스트가 변경되어 너비가 늘어납니다. 그러나 창 크기를 조정할 필요가 없으며 단추 중 하나가 사라집니다. 나는 pack()을 다시 호출하는 것에 대해 생각했지만 JFrame은 내 생성자의 로컬 변수이기도합니다. 또한 크기를 조정할 프로그램을 말하지 않아도됩니다. 나는 Google에서 또는 나를 도울 수있는 아무것도 찾을 수 없었지만 간단한 해결책이 있어야합니다, 내가 무엇을 놓치고 있습니까? 코드는 다음과 같습니다.

playButton = new JButton("Play"); 
    pauseButton = new JButton("Pause"); 
    stopButton = new JButton("Stop"); 
    curTrackLabel = new JLabel("No Track Selected"); 

    JFrame myFrame = new JFrame("MediaPlayer"); 
    myFrame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
    myFrame.setTitle("MediaPlayer"); 
    myFrame.setLocation(400,300); 

    JPanel topPanel = new JPanel(); 
    topPanel.setLayout(new BorderLayout()); 
    myFrame.add(topPanel); 
    JPanel buttonPanel = new JPanel(new FlowLayout()); 

    buttonPanel.add(playButton); 
    buttonPanel.add(pauseButton); 
    buttonPanel.add(stopButton); 
    topPanel.add(buttonPanel, BorderLayout.CENTER); 
    topPanel.add(curTrackLabel, BorderLayout.NORTH); 

    playButton.addActionListener(new playButtonHandler()); 
    pauseButton.addActionListener(new pauseButtonHandler()); 
    stopButton.addActionListener(new stopButtonHandler()); 

    myFrame.pack(); 
    myFrame.setVisible(true); 

답변

5

아마 시도

((JFrame의) myButton.getTopLevelAncestor()) 팩().;

여기서 myButton은 실행 중에 텍스트가 수정되는 버튼입니다.

+0

+1, 멋지다! 나는 오늘 새로운 방법을 배운다. 과거에는 SwingUtilities.windowForComponent (...)를 제안했습니다. – camickr

+0

조금 해킹 된 것 같지만 이것이 효과가 있습니다. – CalumMcCall

1

GUI 소프트웨어를 배우는 것과 마찬가지로 실험이 가장 좋습니다. 중첩 된 JPanel을 사용하여 BorderLayouts를 엉망으로 만들어보십시오.

궁극적으로 JPanel을 BorderLayout과 함께 사용합니다 (흐름 레이아웃은 괜찮지 만 실제로는 창의 크기를 조정할 때 Epically Fail). BorderLayouts에 대한 자세한 내용은 http://download.oracle.com/javase/tutorial/uiswing/layout/border.html을 참조하십시오.

  • 이 JFrame의이 JPanel에이 BorderLayout를 가진 (이 JPanel의 1 전화)를 포함 JFrame의 :

    1. 톱 레벨의 컨테이너 :

      이제 레이아웃 방식에 대한이의 라인을 따라 뭔가해야합니다.
    2. 세 개의 버튼은 분리 된 jPanel (JPanel 2)에 있어야합니다. JPanel 1은 세 개의 버튼을 BorderLayout.CENTER로 추가해야합니다. 이 방법으로 버튼의 너비 및/또는 hright가 변경되면 창이 크기가 조정됩니다.
    3. JLabel은 BorderLayout.LINE_START로 추가해야합니다.

    튜토리얼 : http://download.oracle.com/javase/tutorial/uiswing/layout/border.html이 도움이 될 것입니다. 그러나 일반적으로 다음과 같은 사용

    • 사용 JPanel의 및
    • BorderLayout.CENTER 크기 변화를 수용 할 필요 둥지 JPanel의이 ---이 열쇠입니다! (이 실험)
    • JFrame은 최상위 컨테이너로만 사용해야합니다 (더 복잡한 GUI의 경우이 경우).

    유연성이 더 필요한 경우 JGoodies : http://www.jgoodies.com/을 확인하십시오. 이것은 양식을 만드는 길에 더 가깝습니다.

  • +0

    위 코드 스 니펫에서 설명한 내용을 구현했지만 버튼의 텍스트 중 하나를 길게 만들면 윈도우는 여전히 같은 크기로 유지됩니다. 나는 분명히 잘못된 것을하고 있습니까?어쨌든 귀하의 설명 주셔서 감사합니다, 왜 자바 문서는 읽기 쉽지 않을 수 있습니다 : P – CalumMcCall

    관련 문제