Création d'une coutume DButton en Java

voix
86

Est - il possible de créer un JButtonavec votre propre graphique de bouton et non seulement avec une image à l' intérieur du bouton?

Sinon, est - il une autre façon de créer une coutume JButtonen java?

Créé 05/08/2008 à 13:15
source utilisateur
Dans d'autres langues...                            


5 réponses

voix
85

Quand je commence à apprendre Java , nous avons dû faire Yahtzee et je pensais que ce serait cool de créer sur mesure des composants Swing et des conteneurs au lieu de tirer juste tout sur un JPanel. L'avantage de l' extension des Swingcomposants, bien sûr, est d'avoir la possibilité d'ajouter le support des raccourcis clavier et autres fonctions d'accessibilité que vous ne pouvez pas faire tout en ayant une paint()méthode imprimer une jolie image. Il ne peut être fait mais la meilleure façon, mais il peut être un bon point de départ pour vous.

Modifier 8/6 - S'il ne ressortait pas des images, chaque Die est un bouton , vous pouvez cliquer. Cela déplacera au - DiceContainerdessous. En regardant le code source , vous pouvez voir que chaque bouton Die est dessiné de façon dynamique, en fonction de sa valeur.

alt texte
alt texte
alt texte

Voici les étapes de base:

  1. Créer une classe qui étend JComponent
  2. Constructeur parent appel super()à vos constructeurs
  3. Assurez-vous que vous classe implémente MouseListener
  4. Mettre cela dans le constructeur:

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

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

    public void paintComponent(Graphics g)
    

La quantité d'espace que vous devez travailler avec votre bouton lors de l' établissement est défini par getPreferredSize(), en supposant getMinimumSize()et getMaximumSize()retourner la même valeur. Je ne l' ai pas expérimenté trop avec cela , mais, selon la configuration que vous utilisez pour votre GUI votre bouton pourrait complètement différent.

Et enfin, le code source . Au cas où je raté quelque chose.

Créé 05/08/2008 à 14:03
source utilisateur

voix
32

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

Voici un moyen rapide et sale pour étendre la classe JButton existante pour dessiner un cercle à la 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 que par des raisons impérieuses paintComponent que le contenu du bouton peut être changé, mais la frontière est peint par la paintBorder méthode. La getPreferredSize méthode doit également être géré afin de soutenir dynamiquement des modifications au contenu. Des précautions doivent être prises lors de la mesure des paramètres de police et dimensions de l' image.

Pour créer un contrôle que vous pouvez compter sur, le code ci - dessus n'est pas la bonne approche. Les dimensions et les couleurs sont dynamiques Swing et dépendent de l'apparence et utilisé. Même la valeur par défaut métal look a changé dans les versions JRE. Il serait préférable de mettre en œuvre AbstractButton et se conformer aux lignes directrices établies par l'API Swing. Un bon point de départ est de regarder les javax.swing.LookAndFeel et javax.swing.UIManager 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 les contrôles d' écriture: Création d' un look and feel

Créé 05/08/2008 à 13:53
source utilisateur

voix
12

Vous pouvez toujours essayer le Synth look & feel. 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);
}

De là, continuez et ajoutez votre DButton comme vous le feriez normalement. Le seul changement est que vous utilisez la méthode setName (string) pour identifier ce que le bouton doit mapper 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 de liaison, il spécifie quoi la carte à (dans cet exemple, il appliquera que le style à tous les boutons dont la propriété le nom a été réglé sur « la saleté »).

Et quelques liens utiles:

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

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

Créé 05/08/2008 à 13:47
source utilisateur

voix
8

Je vais probablement un million de miles au mauvais directe (mais je suis seulement jeune: P). mais vous ne pourriez pas ajouter le graphique à un panneau, puis un MouseListener à l'objet graphique de sorte que lorsque l'utilisateur sur le graphique votre action est préformées.

Créé 20/08/2008 à 16:48
source utilisateur

voix
6

Je ne l'ai pas fait le développement SWING depuis mes premières cours CS, mais si elle n'a pas été construit en vous pouvais hériter javax.swing.AbstractButton et créer votre propre. Devrait être assez simple à câbler quelque chose ensemble avec leur cadre existant.

Créé 05/08/2008 à 13:30
source utilisateur

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more