2013-01-09 3 views
1

저는 도박 게임을 시뮬레이트하기로되어있는 작은 프로젝트에서 일해 왔습니다. 불행히도 BoxLayout으로 작업하면서 이상한 문제가 발생했습니다. 내가 아는 한 LayoutManager은 보통 컴포넌트의 선호 크기를 존중합니다. 그러나 아래 코드에서 BoxLayout은 그렇지 않습니다.BoxLayout은 JButton의 선호 크기를 기리는 것을 거부합니다

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



public class Main 
{ 
    public static void main(String[] args) 
    { 
     JFrame.setDefaultLookAndFeelDecorated(true); 
     JFrame frame = new JFrame("Suit-Up"); 
     frame.setContentPane(makeGUI()); 
     frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
     frame.setSize(900,450); 
     frame.setLocationRelativeTo(null); 
     frame.setResizable(false); 
     frame.setVisible(true); 
    } 

    public static JPanel makeGUI() 
    { 
     JPanel main = new JPanel(); 
     main.setMinimumSize(new Dimension(900,450)); 
     main.setBackground(Color.red); 

     JPanel infoPanel = new JPanel(); 
     infoPanel.setLayout(new BoxLayout(infoPanel, BoxLayout.LINE_AXIS)); 
     infoPanel.setPreferredSize(new Dimension(900,60)); 
     infoPanel.setBackground(Color.green); 
     main.add(infoPanel); 

     JPanel infoText = new JPanel(); 
     infoText.setLayout(new BoxLayout(infoText, BoxLayout.PAGE_AXIS)); 
     infoPanel.add(infoText); 

     JPanel moneyText = new JPanel(); 
     moneyText.setLayout(new BoxLayout(moneyText, BoxLayout.LINE_AXIS)); 
     infoText.add(moneyText); 

     JPanel lastGameText = new JPanel(); 
     lastGameText.setLayout(new BoxLayout(lastGameText, BoxLayout.LINE_AXIS)); 
     infoText.add(lastGameText); 

     JButton playAgain = new JButton("Play Again ($20)"); 
     playAgain.setPreferredSize(new Dimension(200,60)); 
     infoPanel.add(playAgain); 

     JButton finish = new JButton("End Session"); 
     finish.setPreferredSize(new Dimension(200,60)); 
     infoPanel.add(finish); 

     JPanel cardPanel = new JPanel(); 
     cardPanel.setLayout(new BoxLayout(cardPanel, BoxLayout.LINE_AXIS)); 
     main.add(cardPanel); 

     return main; 
    } 
} 

모두 JButton의 선호 크기를 지정에도 불구하고, 그들의 크기를 변경하지 마십시오 :

여기에 지금까지 내 코드입니다. setMaximumSize()setMinimumSize()도 시도했지만 어느 것도 영향을 미치지 않았습니다.

나는 명백한 것을 간과하고 있습니까? 아니면이 한계가 BoxLayout입니까?

+0

항상 BoxLayout을 사용할 수 있지만 구성 요소를 중첩합니다 ... – mre

+0

미안하지만 중첩 의미가 확실하지 않습니다. 나는 비교적 레이아웃 관리자가 처음이다. – Thrfoot

+0

단추를 패널에 배치하고 단추 대신 컨테이너에 직접 패널을 추가하면 단추 대신 패널의 크기가 조정됩니다. – mre

답변

2

"내가 아는 한, LayoutManagers는 일반적으로 구성 요소의 기본 크기 인"을 존중합니다. 실제로는 그렇지 않습니다. 기본/최소/최대 크기는 레이아웃 관리자가 내용을 레이아웃하는 최선의 방법을 결정하는 데 사용할 수있는 "힌트"일뿐입니다. 원하는 경우 레이아웃 관리자는이를 무시할 수 있습니다. JavaDoc을 (수평 레이아웃) 선호 폭 에서 구성 요소를 정렬하는

BoxLayout에서는 시도 또는 (수직 레이아웃) 하이츠

. 가로 레이아웃의 경우 모든 구성 요소가 동일한 높이가 아닌 경우 BoxLayout은 모든 구성 요소를 최대 구성 요소 인 만큼 높이려고 시도합니다. 특정 구성 요소에 대해 이것이 가능하지 않은 경우 BoxLayout은 구성 요소의 Y 정렬 에 따라 해당 구성 요소를 세로로 정렬합니다. 기본적으로 구성 요소의 Y 정렬은 0.5입니다. 즉, 구성 요소의 수직 중심은 0.5 Y 정렬을 갖는 다른 구성 요소의 수직 중심과 동일한 Y 좌표를 가져야합니다.

마찬가지로 세로 레이아웃의 경우 BoxLayout은 모든 구성 요소를 가장 넓은 구성 요소만큼 넓게 만듭니다. 이 실패하면 X 축 정렬에 따라 수평 정렬됩니다. PAGE_AXIS 레이아웃의 경우 가로 맞춤은 구성 요소의 앞쪽 가장자리 인 을 기준으로 수행됩니다. 즉, X 축 정렬 값이 인 경우 컨테이너의 ComponentOrientation이 왼쪽에서 오른쪽으로 표시되고 그렇지 않으면 구성 요소의 오른쪽 가장자리가 인 경우 구성 요소의 왼쪽 가장자리를 의미합니다.

+0

내가 선호하는 크기에는 아무런 문제가 없어야합니다. 'JButton'을'JPanel'에 넣을 수있는 충분한 공간이 있습니다. 단지 크기 만 수정하고 레이블에 텍스트를 추가하는 것을 거부합니다. 나는이 문서를 읽었지만 나는 지금 당장 실행중인 것을 설명하는 것을 보지 못했다. – Thrfoot

+0

@Thrfoot 테스트 코드를 실행했고'BoxLayout'은 단순히 내가 시도한 것에 관계없이'JButton'의'preferredSize'를 단순히 거부합니다.이런 방식으로 컴포넌트의 선호 크기를 조작하는 것은 일반적으로 바람직하지 않다. 일반적으로 레이아웃 매니저를 사용하거나'getPreferredSize' 메소드를 직접 오버 라이딩하는 것이 권장된다. 이상하게도,'FlowLayout'은 잘 작동했습니다 ... – MadProgrammer

+0

그게 이상해 ... 글쎄, 내가'BoxLayout'으로 그걸 작동시킬 수 없을 것 같아. 다른 레이아웃 관리자와 비슷한 효과를 얻을 수있는 다른 관리자를 추천 해 주시겠습니까? – Thrfoot

관련 문제