2016-07-25 4 views
1

J'ai travaillé sur ce petit jeu-questionnaire comme un projet pour me tenir occupé, mais je n'arrive pas à comprendre comment le faire paraître bien. de préférence, les boutons seraient en haut et la question serait vers le bas avec une taille de fenêtre définie. Bien que setSize() ou setPreferredSize() ne fonctionnent pas. Donc la fenêtre est très fine et les boutons et la question sont tous en haut.Comment définir l'emplacement et la taille de la disposition de la carte?

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

Je vous recommande de poster un diagramme de ce que vous avez et de ce que vous voulez. Nous vous recommandons également de regarder [Un guide visuel pour les gestionnaires de mise en page] (https://docs.oracle.com/javase/tutorial/uiswing/layout/visual.html) si vous n'avez pas – copeg

Répondre

1

choses à noter:

1. Appel JFrame.pack() réorganise ses composants et redimensionne la JFrame.

2. Il est plus facile (je trouve) de faire un JPanel, appelez JPanel.setPreferredSize (nouvelle dimension (largeur, hauteur)), placer les composants à l'intérieur, et l'ajouter à la JFrame. De cette façon, vous pouvez toujours appeler JFrame.pack() et le JPanel reste sa taille préférée.

3. Vous pouvez supprimer JFrame.pack(), appelez JFrame.setPreferredSize (nouvelle dimension (largeur, hauteur)), et/ou JFrame.setResizable (false).

4. Vous pouvez appeler JFrame.setMinimumSize (nouvelle dimension (largeur, hauteur)) pour l'empêcher de trop serrer. Notez que cette méthode ne garantit pas les dimensions spécifiées lorsque vous appelez JFrame.pack(). Dans votre cas, la largeur s'étire un peu car JFrame.pack() est appelé après.

5. Pour votre programme, je vous recommande d'utiliser JFrame.setLayout (new BorderLayout()), de créer un JPanel avec FlowLayout/GridLayout et d'ajouter vos boutons. Placez ensuite le JPanel dans la zone BorderLayout.NORTH. Ensuite, créez un autre JPanel, placez vos questions à l'intérieur de celui-ci en utilisant une disposition de votre choix, et ajoutez-le à la zone BorderLayout.CENTER dans le JFrame. Après avoir noté la taille minimale qui n'interfère pas avec la visibilité du composant, configurez JFrame.setMinimumSize (new Dimension (width, height)). 6. Les gestionnaires de mise en page se débarrassent de tous les maux de tête liés aux placements de composants après le redimensionnement d'une fenêtre, mais de rares cas existent où l'utilisation de setLayout (null) est la meilleure option (voir Fig1). Si vous ne vous souciez pas de la capacité des utilisateurs à redimensionner votre application, l'appel de JFrame.setResizable (false) suffira. Cela entraînera cependant des problèmes de compatibilité avec les affichages à plus basse résolution. Figure 1. Pour placer les boutons de cette manière, j'ai dû abandonner les gestionnaires de disposition et configurer le placement de ces boutons en fonction des variables de largeur et de hauteur qui sont mises à jour lors du redimensionnement de la fenêtre.

Bonne chance!

+0

Merci, cela aide une tonne. –