2010-05-20 10 views
0

Pour les devoirs, j'essaie de créer un "CustomButton" qui a un cadre et dans ce cadre, je dessine deux triangles, et un carré au-dessus. Il est supposé donner à l'utilisateur l'effet d'un bouton une fois qu'il est enfoncé. Donc, pour commencer, j'essaie de mettre en place les graphiques de début, en dessinant deux triangles, et un carré. Le problème que j'ai est bien que je mette mon cadre à 200, 200, et les triangles que j'ai dessinés je pense aux bonnes extrémités de ma taille de cadre, quand je cours le programme, je dois étendre ma fenêtre pour faire toute l'oeuvre, mon "CustomButton", visible. Est-ce normal? Merci.Aide avec un cadre simple et des graphiques

code:

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


public class CustomButton 
{ 
    public static void main(String[] args) 
    { 
     EventQueue.invokeLater(new Runnable() 
     { 
      public void run() 
      { 
       CustomButtonFrame frame = new CustomButtonFrame(); 
       frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
       frame.setVisible(true); 
      } 
     }); 
    } 
} 

class CustomButtonFrame extends JFrame 
{ 
    // constructor for CustomButtonFrame 
    public CustomButtonFrame() 
    { 
     setTitle("Custom Button"); 
     setSize(DEFAULT_WIDTH, DEFAULT_HEIGHT); 
     CustomButtonSetup buttonSetup = new CustomButtonSetup(); 
     this.add(buttonSetup); 
    } 

    private static final int DEFAULT_WIDTH = 200; 
    private static final int DEFAULT_HEIGHT = 200; 

} 

class CustomButtonSetup extends JComponent 
{ 
    public void paintComponent(Graphics g) 
    { 
     Graphics2D g2 = (Graphics2D) g; 

     // first triangle coords 
     int x[] = new int[TRIANGLE_SIDES]; 
     int y[] = new int[TRIANGLE_SIDES]; 
     x[0] = 0; y[0] = 0; 
     x[1] = 200; y[1] = 0; 
     x[2] = 0; y[2] = 200; 
     Polygon firstTriangle = new Polygon(x, y, TRIANGLE_SIDES); 

     // second triangle coords 
     x[0] = 0; y[0] = 200;  
     x[1] = 200; y[1] = 200; 
     x[2] = 200; y[2] = 0; 
     Polygon secondTriangle = new Polygon(x, y, TRIANGLE_SIDES); 

     g2.drawPolygon(firstTriangle); 
     g2.setColor(Color.WHITE); 
     g2.fillPolygon(firstTriangle); 

     g2.drawPolygon(secondTriangle); 
     g2.setColor(Color.GRAY); 
     g2.fillPolygon(secondTriangle); 

     // draw rectangle 10 pixels off border 
     g2.drawRect(10, 10, 180, 180); 

    } 
    public static final int TRIANGLE_SIDES = 3; 
} 

Répondre

1

Essayez d'ajouter

public Dimension getPreferredSize() { 
    return new Dimension(200, 200); 
} 

à votre classe CustomButtonSetup.

Et puis faire

setTitle("Custom Button"); 
    //setSize(DEFAULT_WIDTH, DEFAULT_HEIGHT); 
    CustomButtonSetup buttonSetup = new CustomButtonSetup(); 
    this.add(buttonSetup); 
    pack(); 

(Des api-docs sur pack() :)

Causes cette fenêtre pour être dimensionnée à la taille préférée et mise en page de ses sous-composants.

Vous devriez obtenir quelque chose comme:

enter image description here

+0

Il est préférable de stocker les dimensions préférées dans une variable statique et de les retourner dans getPreferredSize(). Sinon, une nouvelle instance sera créée chaque fois que getPreferredSize() est invoqué, ce qui peut arriver très souvent selon la disposition. –

+0

Bon point. Une meilleure solution serait probablement de faire un 'setPreferredSize()' dans le constructeur du composant. J'espère que le PO lit ceci. – aioobe

1

Le DEFAULT_WIDTH et DEFAULT_HEIGHT que vous définissez est pour l'ensemble du cadre, y compris les frontières, des fenêtres, des icônes, etc. Ce n'est pas la taille de la toile de dessin elle-même. Ainsi, il est prévu que si vous dessinez quelque chose dans un canevas de 200x200, cela ne rentre pas nécessairement dans une fenêtre de 200x200 contenant ce canevas.