2010-10-31 2 views
1

Je suis en train de concevoir un système d'optimisation pour les transports publics dans une grande ville. J'ai donc une carte avec quelques points dessus, mais je m'en fous)
Tout ce dont j'ai besoin est: mon propre JButton, qui ressemble à un cercle rempli de couleurs et à une petite balise de texte près d'elle. J'ai eu quelques problèmes en surchargeant la méthode paintComponent() .. le bouton rond est peint correctement, mais pas le texte. MAIS, quand je redimensionne la fenêtre manuellement, le texte apparaît pendant une seconde, puis il est repeint et disparaît. espérons que vous les gars ont compris mes besoins, grâce à l'aide;)Peinture d'un JButton personnalisé et d'une ligne de texte

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


public class JRoundButton extends JButton { 

String label; 
Color color; 
int x,y; 
public JRoundButton(Color color,int x,int y,String str) 
{ 
    label=str; 
    this.x=x; 
    this.y=y; 
    this.color=color;  
} 

protected void paintComponent(Graphics g) 
    { 
    super.paintComponent(g); 
    Dimension size = getPreferredSize(); 
    setPreferredSize(size); 
    this.setBounds(0, 0, 10, 10); 
    setContentAreaFilled(false); 

    g.setFont(new Font("Arial",Font.BOLD,14)); 
    g.drawChars(label.toCharArray(), 0, label.length(), 12,12); 
    g.fillOval(0,0,8,8); 
} 

public void paintBorder(Graphics g) 
    { 
    g.setColor(Color.white); 
    g.drawOval(0,0, 9, 9); 
} 
public static void main(String[] args) 
    { 
    JButton button = new JRoundButton(Color.GRAY,150,150,"Times Square"); 

    JFrame frame = new JFrame(); 
    frame.getContentPane().setBackground(Color.black); 
    frame.setSize(300, 300); 
    frame.setVisible(true); 
    frame.add(button); 
} 

}

Répondre

0

Je venais de tricher et d'utiliser un cercle unicode dans le texte du JButton. .: par exemple

import javax.swing.*; 

JFrame frame = new JFrame(); 
frame.getContentPane().add(new JButton("<html><font size='+10' color='red'>&#x25CF;</font> I'm next to a red circle!</html>")); 
frame.pack(); 
frame.show(); 

1

Il semble que l'appel à « setBounds (0, 0, 10, 10) » définit une empreinte composant qui est trop petite pour accueillir la chaîne de texte. Étendre les limites à 100 pixels de large et réduire la taille du point à 6 semble fonctionner.

1

1) NE JAMAIS définir les propriétés du bouton dans la méthode paintComponent().

Dimension size = getPreferredSize(); 
setPreferredSize(size); 
this.setBounds(0, 0, 10, 10); 
setContentAreaFilled(false); 

Débarrassez-vous du code ci-dessus.

2) Ne pas définir la police de l'objet Graphics dans la méthode paintComponent(). C'est à quoi sert la méthode setFont (...).

3) Il n'est pas nécessaire de faire une peinture personnalisée. Si vous voulez un cercle, ajoutez une icône au JLabel.

4) Ne pas surcharger la méthode paintBorder(). Si vous voulez une bordure, créez une bordure personnalisée et ajoutez-la au bouton en utilisant la méthode setBorder().

En bref, il n'est pas nécessaire d'étendre le bouton. Débarrassez-vous de votre classe JRoundButton. Votre code doit simplement quelque chose comme:

JButton = new JButton("Times Square"); 
button.setFont(new Font("Arial",Font.BOLD,14)); 
button.setIcon(new OvalIcon(Color.WHITE, iconSize)); 

Bien sûr, vous devrez créer une classe de OvalIcon mais qui est facile à mettre en œuvre car il n'y a que trois méthodes et vous savez déjà ce que le code de la peinture doit être.

+0

merci beaucoup pour 1), 2) et 4), mais pas pour le troisième, car j'ai besoin d'un cercle cliquable et d'une ligne de texte près de .... c'est donc le problème! – NavigatingYourSoul

+0

Eh bien, votre approche ne résoudra pas non plus la troisième exigence. Je ne suis pas sûr de comprendre l'exigence. On dirait que vous avez besoin de deux composants sur un panneau. Un JButton avec une icône et un JLabel avec le texte. Ou peut-être que vous avez besoin d'un JCheckBox. – camickr