2010-05-29 2 views
3

Pourquoi mon cadre 'JFrame' affiche-t-il une fenêtre vide, alors qu'il devrait me donner 3 boutons de menu et mon propre composant JComponent peint ci-dessous? Qu'est-ce que j'oublie ici ?Comment afficher les panneaux avec le composant dans l'image

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

public class Eyes extends JFrame { 

    public static void main(String[] args) { 
     final JFrame frame = new JFrame("Eyes"); 
     frame.setPreferredSize(new Dimension(450, 300)); 
     frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 

     JPanel players = new JPanel(new GridLayout(1, 3)); 
       players.add(new JButton("Eyes color")); 
       players.add(new JButton("Eye pupil")); 
       players.add(new JButton("Background color")); 

     JPanel eyes = new JPanel(); 
     eyes.add(new MyComponent()); 

     JPanel content = new JPanel(); 
     content.setLayout(new BoxLayout(content, BoxLayout.Y_AXIS)); 
     content.add(players); 
     content.add(eyes); 

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

class MyComponent extends JComponent { 

    public MyComponent(){ 

    } 

    @Override 
    public void paint(Graphics g) { 
     int height = 120; 
     int width = 120; 
     Graphics2D g2d = (Graphics2D) g; 
     g2d.setRenderingHint(RenderingHints.KEY_ANTIALIASING,RenderingHints.VALUE_ANTIALIAS_ON); 
     BasicStroke bs = new BasicStroke(3.0f); 
     g2d.setStroke(bs); 
     g2d.setColor(Color.yellow); 
     g2d.fillOval(200, 200, height, width); 
     g2d.setColor(Color.black); 
     g2d.drawOval(60, 60, height, width); 
    } 
} 
+1

La peinture personnalisée doit être effectuée en remplaçant la méthode paintComponent(), PAS la méthode paint(). Et vous devriez appeler super.paintComponent() comme première instruction de la méthode. – camickr

Répondre

2

Votre ligne:

frame.getContentPane(); 

ne marche pas quoi que ce soit, mais accéder au volet de contenu du cadre. Au lieu d'obtenir le volet contenu, vous devez définir votre volet de contenu, comme ceci:

frame.setContentPane(content); 

EDIT:

alternativement, comme le souligne @trashgod sur, vous pouvez utiliser la méthode getContentPane pour accéder à la valeur par défaut volet contenu et ajoutez votre composant content que:

frame.getContentPane().add(content); 
+0

+1 Aussi, 'frame.add (content)' via le transfert. – trashgod

0

Je pense que vous essayez d'utiliser imbriquée JPanels. C'est certainement un moyen d'organiser vos composants, mais l'inconvénient est le fait qu'il devient difficile à gérer dans certains cas. Vous pouvez essayer cet extrait de code ci-dessous. Dans le programme, vous trouverez:

1) Un tableau de JLabel

2) Un tableau de JTextField

3) Nichée JPanels

A la fin du programme que j'utilise le Container à ajouter le produit final de ces objets à ma fenêtre graphique.

Le moyen le plus efficace que je peux penser est de définir ces composants au sommet de mon programme afin que je puisse les réutiliser plus tard comme je le dois.

Pour ce faire, vous pouvez essayer ce bout de code:

import javax.swing.*; //Required to use Swing Components 

public class TestGUI extends JFrame 
{ 
    JLabel[] label;   //Define this with an array 
    JTextField[] textField; //Define this with an array as well 

    private int nLabels;  //Number of labels preferred 
    private int nTextFields; //Number of text fields preferred 

    public testGUI(int amt) 
    { 
     //Assuming that you want equal amounts of each, 
     //set these two variables to the "ant" input parameter 
     nLabels  = amt; 
     nTextFields = amt; 

     //Set component attributes 
     label  = new JLabel[2];  //Label compared text fields 
     textField = new JTextField[2]; //Use two of these for comparison 

     textField[0].setEnabled(false); //Disabled editing 
     //Do nothing with the second text field 

     JPanel labels = new JPanel(); //Place JLabels here 

     //Use this to align the labels vertically 
     labels.setLayout(new GridLayout(2, 1)); 

     //Use this for loop to add the labels to this JPanel 
     for(int i = 0; i < nLabels; i++) 
     { 
      labels.add(label[i]); 
      //You can also define and apply additional properties 
      //to labels inside this loop. TIP: You can do this in 
      //any loop 
     } 

     JPanel txtFields = new JPanel(); //Place JTextFields here 

     //Use this to align the text fields vertically 
     txtFields.setLayout(new GridLayout(2, 1)); 

     //Use this for loop to add the labels to this JPanel 
     for(int i = 0; i < nTextFields; i++) 
     { 
      textFields.add(textField[i]); 
      //You can also define and apply additional properties 
      //to text fields inside this loop. TIP: You can do 
      //this in any loop 
     } 

     //Now we have the two components, you asked for help with, set up 
     //Next, we will need another JPanel to add these to panels to. 
     //This JPanel will be added to the JFrame Container 
     //You probably know how to run this via the "main" method 

     JPanel window = new JPanel(); 
     //Place the JPanel for the labels and text fields 

     //This requires a horizontal grid 
     window.setLayout(new GridLayout(1, 2)); 

     //Add the the two JPanels: "labels" and "txtFields" 
     window.add(labels); 
     window.add(txtFields); 

     //Define the Container object to set up the GUI 
     Container container = getContentPane(); 

     //Apply the "window" JPanel object to the container 
     container.add(window, BorderLayout.CENTER); 
     //Center this in the Graphics Window when displayed 
    } 
    //Any other methods and/or functions can be added as well 
    //If they are, they must placed in the constructor method above 
} 

Telle est l'approche que j'utiliser lorsque vous essayez d'aller à faire et manipuler mon Windows Graphics que je vous écris. Parfois j'écris des applets, mais seulement après m'être assuré que tout fonctionne correctement dans une simple fenêtre graphique.

J'espère que cela aide.

Si vous avez d'autres questions, faites le moi savoir et je vais répondre au mieux de mes capacités, merci.

Questions connexes