Question

Existe-t-il un moyen de créer un JButton avec votre propre graphique de bouton et pas seulement avec une image à l'intérieur du bouton ?

Si ce n'est pas le cas, existe-t-il un autre moyen de créer un fichier personnalisé ? JButton en Java ?

Était-ce utile?

La solution

Quand j'ai commencé à apprendre Java, nous devions créer Yahtzee et j'ai pensé que ce serait cool de créer des composants et des conteneurs Swing personnalisés au lieu de simplement tout dessiner sur un seul. JPanel.L’avantage de prolonger Swing composants, bien sûr, est d'avoir la possibilité d'ajouter la prise en charge des raccourcis clavier et d'autres fonctionnalités d'accessibilité que vous ne pouvez pas faire simplement en ayant un paint() méthode pour imprimer une jolie image.Cela ne se fait peut-être pas de la meilleure façon, mais cela peut être un bon point de départ pour vous.

Edit 8/6 - Si cela ne ressortait pas des images, chaque Die est un bouton sur lequel vous pouvez cliquer.Cela le déplacera vers le DiceContainer ci-dessous.En regardant le code source, vous pouvez voir que chaque bouton Die est dessiné dynamiquement, en fonction de sa valeur.

alt text
alt text
alt text

Voici les étapes de base:

  1. Créer une classe qui s'étend JComponent
  2. Appeler le constructeur parent super() dans vos constructeurs
  3. Assurez-vous de classer les outils MouseListener
  4. Mettez ceci dans le constructeur :

    enableInputMethods(true);   
    addMouseListener(this);
    
  5. Remplacez ces méthodes :

    public Dimension getPreferredSize()  
    public Dimension getMinimumSize()  
    public Dimension getMaximumSize()
    
  6. Remplacez cette méthode :

    public void paintComponent(Graphics g)
    

La quantité d'espace avec laquelle vous devez travailler lorsque vous dessinez votre bouton est définie par getPreferredSize(), en supposant getMinimumSize() et getMaximumSize() renvoie la même valeur.Je n'ai pas beaucoup expérimenté cela mais, selon la disposition que vous utilisez pour votre interface graphique, votre bouton peut être complètement différent.

Et enfin, le code source.Au cas où j'aurais raté quelque chose.

Autres conseils

Oui, c'est possible.L'un des principaux avantages de l'utilisation de Swing est la facilité avec laquelle les contrôles abstraits peuvent être créés et manipulés.

Voici un moyen simple et rapide d'étendre la classe JButton existante pour dessiner un cercle à droite du texte.

package test;

import java.awt.Color;
import java.awt.Container;
import java.awt.Dimension;
import java.awt.FlowLayout;
import java.awt.Graphics;

import javax.swing.JButton;
import javax.swing.JFrame;

public class MyButton extends JButton {

    private static final long serialVersionUID = 1L;

    private Color circleColor = Color.BLACK;

    public MyButton(String label) {
        super(label);
    }

    @Override
    protected void paintComponent(Graphics g) {
        super.paintComponent(g);

        Dimension originalSize = super.getPreferredSize();
        int gap = (int) (originalSize.height * 0.2);
        int x = originalSize.width + gap;
        int y = gap;
        int diameter = originalSize.height - (gap * 2);

        g.setColor(circleColor);
        g.fillOval(x, y, diameter, diameter);
    }

    @Override
    public Dimension getPreferredSize() {
        Dimension size = super.getPreferredSize();
        size.width += size.height;
        return size;
    }

    /*Test the button*/
    public static void main(String[] args) {
        MyButton button = new MyButton("Hello, World!");

        JFrame frame = new JFrame();
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        frame.setSize(400, 400);

        Container contentPane = frame.getContentPane();
        contentPane.setLayout(new FlowLayout());
        contentPane.add(button);

        frame.setVisible(true);
    }

}

Notez qu'en remplaçant composant de peinture que le contenu du bouton peut être modifié, mais que la bordure est peinte par le peindreBordure méthode.Le getPreferredSize La méthode doit également être gérée afin de prendre en charge dynamiquement les modifications apportées au contenu.Des précautions doivent être prises lors de la mesure des métriques de police et des dimensions de l’image.

Pour créer un contrôle sur lequel vous pouvez compter, le code ci-dessus n’est pas la bonne approche.Les dimensions et les couleurs sont dynamiques dans Swing et dépendent de l’apparence utilisée.Même la valeur par défaut Métal l'apparence a changé dans les versions de JRE.Il vaudrait mieux mettre en œuvre Bouton abstrait et conformez-vous aux directives définies par l'API Swing.Un bon point de départ est de regarder le javax.swing.LookAndFeel et javax.swing.UIManager Des classes.

http://docs.oracle.com/javase/8/docs/api/javax/swing/LookAndFeel.html

http://docs.oracle.com/javase/8/docs/api/javax/swing/UIManager.html

Comprendre l'anatomie de LookAndFeel est utile pour écrire des contrôles :Créer une apparence et une sensation personnalisées

Vous pouvez toujours essayer le look & feel Synth.Vous fournissez un fichier XML qui agit comme une sorte de feuille de style, ainsi que toutes les images que vous souhaitez utiliser.Le code pourrait ressembler à ceci :

try {
    SynthLookAndFeel synth = new SynthLookAndFeel();
    Class aClass = MainFrame.class;
    InputStream stream = aClass.getResourceAsStream("\\default.xml");

    if (stream == null) {
        System.err.println("Missing configuration file");
        System.exit(-1);                
    }

    synth.load(stream, aClass);

    UIManager.setLookAndFeel(synth);
} catch (ParseException pe) {
    System.err.println("Bad configuration file");
    pe.printStackTrace();
    System.exit(-2);
} catch (UnsupportedLookAndFeelException ulfe) {
    System.err.println("Old JRE in use. Get a new one");
    System.exit(-3);
}

À partir de là, continuez et ajoutez votre JButton comme vous le feriez normalement.Le seul changement est que vous utilisez la méthode setName(string) pour identifier ce à quoi le bouton doit correspondre dans le fichier XML.

Le fichier XML pourrait ressembler à ceci :

<synth>
    <style id="button">
        <font name="DIALOG" size="12" style="BOLD"/>
        <state value="MOUSE_OVER">
            <imagePainter method="buttonBackground" path="dirt.png" sourceInsets="2 2 2 2"/>
            <insets top="2" botton="2" right="2" left="2"/>
        </state>
        <state value="ENABLED">
            <imagePainter method="buttonBackground" path="dirt.png" sourceInsets="2 2 2 2"/>
            <insets top="2" botton="2" right="2" left="2"/>
        </state>
    </style>
    <bind style="button" type="name" key="dirt"/>
</synth>

L'élément bind spécifie ce à quoi mapper (dans cet exemple, il appliquera ce style à tous les boutons dont la propriété name a été définie sur "dirt").

Et quelques liens utiles :

http://javadesktop.org/articles/synth/

http://docs.oracle.com/javase/tutorial/uiswing/lookandfeel/synth.html

Je fais probablement un million de kilomètres dans la mauvaise direction (mais je ne suis que jeune :P).mais ne pourriez-vous pas ajouter le graphique à un panneau, puis un écouteur de souris à l'objet graphique afin que lorsque l'utilisateur se trouve sur le graphique, votre action soit préformée.

Je n'ai pas fait de développement SWING depuis mes premiers cours CS, mais s'il n'était pas intégré, vous pourriez simplement hériter javax.swing.AbstractButton et créez le vôtre.Cela devrait être assez simple de connecter quelque chose avec leur cadre existant.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top