2016-07-25 7 views
1

저는이 작은 퀴즈 게임을 프로젝트로 삼아 바쁘게 지 냈습니다. 그러나 어떻게 보이게 할 수 있는지 알 수는 없습니다. 바람직하게는, 버튼은 상부에 있고, 질문은 설정된 창 크기로 바닥쪽으로 향하게 될 것이다. setSize() 또는 setPreferredSize()가 작동하지 않지만. 그래서 창문은 매우 얇고 버튼과 질문은 모두 맨 위에 있습니다.카드 레이아웃의 위치와 크기를 어떻게 설정할 수 있습니까?

package mainPackage; 

import javax.swing.JFrame; 

public class MainGame{ 
    public static void main(String[] args) { 
     new WindowComp(); 

    } 
} 

    package mainPackage; 

import java.awt.CardLayout; 
import java.awt.event.ActionEvent; 
import java.awt.event.ActionListener; 

import javax.swing.JButton; 
import javax.swing.JComponent; 
import javax.swing.JFrame; 
import javax.swing.JLabel; 
import javax.swing.JPanel; 

@SuppressWarnings("serial") 
public class WindowComp extends JComponent implements ActionListener { 

    JFrame frame = new JFrame("trivia game"); 




    static JButton [] buttons; 
    static JLabel question; 
    JPanel panelCont = new JPanel(); 
    JPanel panelStartScreen= new JPanel(); 
    JPanel panelGame = new JPanel(); 
    JButton startGame = new JButton("Start Trivia"); 
    CardLayout cl = new CardLayout(); 




    public WindowComp(){ 
     question = new JLabel("default"); 
     buttons = new JButton[4]; 
     panelCont.setLayout(cl); 



     buttons[0] = new JButton("Answer 1 : " + "default"); 
     buttons[1] = new JButton("Answer 2 : " + "default"); 
     buttons[2] = new JButton("Answer 3 : " + "default"); 
     buttons[3] = new JButton("Answer 4 : " + "default"); 

     buttons[0].addActionListener(this); 
     buttons[1].addActionListener(this); 
     buttons[2].addActionListener(this); 
     buttons[3].addActionListener(this); 
     startGame.addActionListener(this); 
     addAll(); 
     panelCont.add(panelStartScreen, "1"); 
     panelCont.add(panelGame, "2"); 



     frame.add(panelCont); 
     frame.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE); 
     frame.setSize(300, 300); 
     frame.pack(); 
     frame.setVisible(true); 



    } 


    @Override 
    public void actionPerformed(ActionEvent e) { 
     if(e.getSource() == buttons[0]){ 
      setQuestion("button 1"); 
      setAnswers("start", "start", "start", "start"); 
     } 
     if(e.getSource() == buttons[1]){ 
      setQuestion("button 2"); 
      setAnswers("final", "final", "final", "final"); 
     } 
     if(e.getSource() == buttons[2]){ 
      setQuestion("button 3"); 
     } 
     if(e.getSource() == buttons[3]){ 
      setQuestion("button 4"); 
     } 

     if(e.getSource()==startGame){ 
      cl.show(panelCont, "2"); 

     } 


    } 
    public void addAll(){ 

     panelGame.add(buttons[0]); 
     panelGame.add(buttons[1]); 
     panelGame.add(buttons[2]); 
     panelGame.add(buttons[3]); 
     panelGame.add(question); 
     panelStartScreen.add(startGame); 



    } 



    public static void setAnswers(String ans1, String ans2, String ans3,String ans4){ 
     buttons[0].setText("Answer 1 : " + ans1); 
     buttons[1].setText("Answer 2 : " + ans2); 
     buttons[2].setText("Answer 3 : " + ans3); 
     buttons[3].setText("Answer 4 : " + ans4); 

    } 

    public static void setQuestion(String q){ 
     question.setText("Question: " + q); 
    } 
} 
+1

내가 갖고있는 것과 원하는 것을 다이어그램으로 게시하는 것이 좋습니다. 또한 – copeg

답변

1

유의할 것들 :

1. JFrame.pack()를 호출하는 구성 요소를 재 배열하고, JFrame의 크기를 조정합니다.

2. JPanel을 만들거나, JPanel.setPreferredSize (새 Dimension (width, height))를 호출하고, 내부에 구성 요소를 배치하고 JFrame에 추가하는 것이 더 쉽습니다. 그렇게하면 JFrame.pack()을 호출 할 수 있으며 JPanel은 원하는 크기로 유지됩니다.

3. JFrame.pack()을 제거하고 JFrame.setPreferredSize (새 Dimension (width, height)) 및/또는 JFrame.setResizable (false)를 호출 할 수 있습니다.

4. JFrame.setMinimumSize (새 Dimension (width, height))를 호출하여 패킹이 너무 밀리지 않도록 할 수 있습니다. 이 메서드는 JFrame.pack()을 호출 할 때 지정된 차원을 보장하지는 않습니다. 귀하의 경우, 나중에 호출되는 JFrame.pack() 때문에 너비가 조금 늘어납니다.

5. 프로그램의 경우 JFrame.setLayout (new BorderLayout())을 사용하고 FlowLayout/GridLayout을 사용하여 JPanel을 만들고 버튼을 추가하는 것이 좋습니다. 그런 다음 JPanel을 BorderLayout.NORTH 영역에 배치합니다. 그런 다음 다른 JPanel을 만들고 선택한 레이아웃을 사용하여 질문을 배치 한 다음 JFrame의 BorderLayout.CENTER 영역에 추가합니다. 컴퍼넌트의 가시성을 저해하지 않는 최소 사이즈를 지정하고 나서, JFrame.setMinimumSize (새로운 Dimension (폭, 높이))를 설정합니다.

6. 레이아웃 관리자는 창 크기를 조정 한 후에 구성 요소 배치와 관련된 모든 골칫거리를 없애지 만, 드물게도 setLayout (null)을 사용하는 것이 가장 좋은 옵션입니다 (그림 1 참조). 사용자의 앱 크기 조정 기능에 신경 쓰지 않으면 JFrame.setResizable (false)를 호출하면 충분합니다. 그러나 해상도가 낮은 디스플레이와의 호환성 문제가 발생할 수 있습니다.

enter image description here 그림 1. 이러한 방식으로 단추를 배치하면 레이아웃 관리자를 포기하고 창 크기를 조정할 때 업데이트되는 너비 및 높이 변수에 따라이 단추의 배치를 구성해야했습니다.

행운을 빈다.

+0

이 아닌 경우 [Layout Manager에 대한 시각 안내서] (https://docs.oracle.com/javase/tutorial/uiswing/layout/visual.html)를 참조하십시오. 감사합니다. –