2017-06-04 1 views
1

Je dois concevoir un jeu de swing où un côté est une grille et l'autre côté est un peu un panneau d'affichage où j'ai plusieurs JLabels et un JButton. Mais peu importe si j'utilise setSize(); ou setPrefferedSize(); ou setBounds(); ou même setPrefferedSize (new Dimension()); il ne deviendra pas plus petit mais étend l'intégralité de cette section. Tout JLabel/JButton aligné au centre occupe tout le centre. Comment puis-je réparer ça?Comment changer la taille de mon JButton?

Voici le code à mon référencement de classe à une autre classe dans le projet contenant la grille:

import java.awt.BorderLayout; 
import java.awt.Color; 
import java.awt.Font; 

import javax.swing.ImageIcon; 
import javax.swing.JButton; 
import javax.swing.JLabel; 
import javax.swing.JPanel; 
import javax.swing.SwingConstants; 

public class Scoreboard extends JPanel{ 
    /** 
    * 
    */ 
    private static final long serialVersionUID = 1L; 
    JLabel scoreLabel; 
    JLabel coord; 
    JLabel title; 
    JButton quit; 
    public Scoreboard (int score){ 
     setLayout(new BorderLayout()); 
     setSize(490,400); 
     setPreferredSize(getSize()); 
     setBackground(Color.BLUE); 
     title = new JLabel(); 
     title.setIcon(new ImageIcon("C:\\Users\\Rachel\\Workspace\\Assignment2\\Planet1.png")); 
     title.setSize(200,200); 
     title.setHorizontalAlignment(SwingConstants.CENTER); 
     add (title,BorderLayout.NORTH); 
     scoreLabel = new JLabel("Score: "+Integer.toString(score)); 
     scoreLabel.setSize(200,200); 
     scoreLabel.setBackground(Color.BLUE); 
     scoreLabel.setHorizontalAlignment(SwingConstants.CENTER); 
     scoreLabel.setFont(new Font("Source Sans Pro", Font.BOLD, 40)); 
     scoreLabel.setForeground(Color.WHITE); 
     add(scoreLabel, BorderLayout.CENTER); 
     coord = new JLabel ("Click the aliens!"); 
     coord.setSize(200,400); 
     coord.setBackground(Color.RED); 
     coord.setHorizontalAlignment(SwingConstants.CENTER); 
     coord.setFont(new Font("Source Sans Pro", Font.BOLD, 20)); 
     coord.setForeground(Color.WHITE); 
     add(coord,BorderLayout.SOUTH); 
     JButton quit = new JButton ("Quit Game"); 
     quit.setBounds(20,30,50,30); 
     quit.setHorizontalAlignment(SwingConstants.CENTER); 
     add(quit, BorderLayout.CENTER); 

    } 
} 
+0

Je pense que vous avez besoin de passer plus de temps des recherches sur la façon dont les gestionnaires de mise en page de travail et ceux qui travaillent avec le 'preferredSize' des composants et ceux qui ne le font pas (ou aiment faire leur propre chose) -' BorderLayout' sera Faites en sorte que le composant remplisse tout l'espace disponible du conteneur. – MadProgrammer

+0

Vous pouvez jeter un coup d'œil à [Guide visuel des gestionnaires de mise en page] (http://docs.oracle.com/javase/tutorial/uiswing/layout/visual.html). [Mise en page des composants dans un conteneur] (http://docs.oracle.com/javase/tutorial/uiswing/layout/index.html) – MadProgrammer

+0

Les gestionnaires de disposition Swing ne sont pas tenus de se soucier de la taille, de la taille liée ou de la taille préférée des composants. La taille généralement préférée est la plus courante utilisée par les gestionnaires de disposition. – tsolakp

Répondre

1

Le code suivant ne résout pas le problème. Au lieu de cela, il montre quelques conseils liés à votre question, ainsi que d'autres. En général, essayez d'éviter de "contrôler manuellement" la disposition des composants, mais utilisez les bons gestionnaires de disposition.

import java.awt.BorderLayout; 
import java.awt.Color; 
import java.awt.Dimension; 
import java.awt.Font; 
import javax.swing.JButton; 
import javax.swing.JFrame; 
import javax.swing.JLabel; 
import javax.swing.JPanel; 
import javax.swing.SwingConstants; 
import javax.swing.WindowConstants; 

public class Scoreboard extends JPanel{ 


    JLabel scoreLabel; 
    JLabel coord; 
    JLabel title; 
    JButton quit; 
    private final int W = 490; 
    private final int H = 400; 

    public Scoreboard (int score){ 
     setLayout(new BorderLayout()); 
     setPreferredSize(new Dimension(W, H)); 
     setBackground(Color.BLUE); 
     title = new JLabel("My Title"); 
     //if you use images in your SO posted code use web links 
     //title.setIcon(new ImageIcon("C:\\Users\\Rachel\\Workspace\\Assignment2\\Planet1.png")); 
     //title.setSize(200,200); run the code without it and see it has no effect 
     title.setHorizontalAlignment(SwingConstants.CENTER); 
     add (title,BorderLayout.NORTH); 

     scoreLabel = new JLabel("Score: "+Integer.toString(score)); 
     scoreLabel.setSize(200,200); 
     scoreLabel.setBackground(Color.BLUE); 
     scoreLabel.setHorizontalAlignment(SwingConstants.CENTER); 
     scoreLabel.setFont(new Font("Source Sans Pro", Font.BOLD, 40)); 
     scoreLabel.setForeground(Color.WHITE); 
     //this is directly related to your question. You can't add 2 components 
     //to the center. 
     //instead add a JPanel to the center, apply a layout manager to it, 
     //and add scorelabel and quit button to that JPanel 
     add(scoreLabel, BorderLayout.CENTER); 

     coord = new JLabel ("Click the aliens!"); 
     //coord.setSize(200,400); run the code without it and see it has no effect 
     coord.setBackground(Color.RED); 
     coord.setOpaque(true); //if you want the color show 
     coord.setHorizontalAlignment(SwingConstants.CENTER); 
     coord.setFont(new Font("Source Sans Pro", Font.BOLD, 20)); 
     coord.setForeground(Color.WHITE); 
     add(coord,BorderLayout.SOUTH); 

     JButton quit = new JButton ("Quit Game"); 
     //no need to set bounds. That is what the layout manager does 
     //quit.setBounds(20,30,50,30); 
     quit.setHorizontalAlignment(SwingConstants.CENTER); 
     add(quit, BorderLayout.CENTER); 
    } 

    //add main to your questions to make it runnable 
    public static void main(String[] args){ 

     JFrame frame = new JFrame(); 
     frame.setDefaultCloseOperation(WindowConstants.DISPOSE_ON_CLOSE); 

     JPanel panel = new Scoreboard(50); 
     frame.getContentPane().add(panel); 

     frame.pack(); 
     frame.setVisible(true); 
    } 
}