2016-07-25 15 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

注意観光:JFrame.packを(呼び出し

1)は、そのコンポーネントを再配置し、JFrameのサイズを変更します。

2. JPanelを作成し、JPanel.setPreferredSize(新しい次元(幅、高さ))を呼び出し、内部にコンポーネントを配置してJFrameに追加する方が簡単です。そうすれば、JFrame.pack()を呼び出すことができ、JPanelは望ましいサイズのままです。

3. JFrame.pack()を削除し、JFrame.setPreferredSize(新しい次元(幅、高さ))、および/またはJFrame.setResizable(false)を呼び出すことができます。

4. JFrame.setMinimumSize(新しい寸法(幅、高さ))を呼び出すと、詰めすぎないようにすることができます。このメソッドは、JFrame.pack()を呼び出すときに指定された寸法を保証するものではありません。あなたのケースでは、後でJFrame.pack()が呼び出されるために、幅が少し伸びます。

5.プログラムでは、JFrame.setLayout(new BorderLayout())を使用し、FlowLayout/GridLayoutを使用してJPanelを作成し、ボタンを追加することをお勧めします。その後、BorderLayout.NORTH領域にJPanelを配置します。その後、別のJPanelを作成し、あなたの選択したレイアウトを使って質問を配置し、JFrameのBorderLayout.CENTERエリアに追加します。コンポーネントの可視性を妨げない最小サイズを確認した後、JFrame.setMinimumSize(新しい寸法(幅、高さ))を設定します。

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)を参照することをお勧めします。 –

関連する問題