Domanda

C'è un modo per creare un JButton con il tuo pulsante di grafica e non solo con un immagine all'interno del pulsante?

Se non c'è un altro modo per creare un custom JButton in java?

È stato utile?

Soluzione

Quando ero in primo luogo l'apprendimento di Java abbiamo dovuto fare Yahtzee e ho pensato che sarebbe stato bello creare dei componenti Swing e contenitori invece di disegnare il tutto in una JPanel.Il vantaggio di estendere Swing componenti, naturalmente, è quello di avere la possibilità di aggiungere il supporto per le scorciatoie da tastiera e le funzioni di accessibilità che si può fare solo avendo un paint() metodo di stampa è una bella immagine.Non può essere fatto, il modo migliore, però, ma può essere un buon punto di partenza per voi.

Edit 8/6 - Se non fosse evidente dalle immagini, ogni Dado è un pulsante che si può scegliere.Questo sposta il DiceContainer qui di seguito.Guardando il codice sorgente si può vedere che ogni Die pulsante è disegnato in modo dinamico, in base al suo valore.

alt text
alt text
alt text

Qui sono i passi fondamentali:

  1. Creare una classe che estende JComponent
  2. Chiamare il costruttore genitore super() nel costruttori
  3. Assicurarsi che la classe implementa MouseListener
  4. Mettere questo nel costruttore:

    enableInputMethods(true);   
    addMouseListener(this);
    
  5. Ignorare questi metodi:

    public Dimension getPreferredSize()  
    public Dimension getMinimumSize()  
    public Dimension getMaximumSize()
    
  6. Eseguire l'Override di questo metodo:

    public void paintComponent(Graphics g)
    

La quantità di spazio che avete a lavorare con quando disegno il pulsante è definito da getPreferredSize(), supponendo getMinimumSize() e getMaximumSize() restituire lo stesso valore.Non ho sperimentato troppo, ma, a seconda del layout si utilizza per la GUI, il pulsante potrebbe avere un aspetto completamente diverso.

E, infine, il il codice sorgente.Nel caso In cui ho perso qualcosa.

Altri suggerimenti

Sì, questo è possibile.Uno dei vantaggi principali per l'utilizzo di Swing è la facilità con la quale l'abstract controlli possono essere creati e manipola.

Ecco un modo rapido e sporco per ampliare l'attuale classe JButton per disegnare un cerchio a destra del testo.

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);
    }

}

Si noti che, dato paintComponent che il contenuto del pulsante può essere cambiato, ma che il confine è dipinto con l' paintBorder metodo.Il getPreferredSize il metodo, inoltre, deve essere gestito in modo dinamico supporto modifiche al contenuto.La cura deve essere presa quando si misura metriche del tipo di carattere e le dimensioni dell'immagine.

Per la creazione di un controllo che si può contare su, il codice di cui sopra non è l'approccio corretto.Dimensioni e colori sono dinamici in Altalena e sono dipendenti l'aspetto e la sensazione di essere utilizzato.Anche il default Metallo aspetto è cambiato tutto JRE versioni.Sarebbe meglio implementare AbstractButton e conforme alle linee guida indicate dal Swing API.Un buon punto di partenza è quello di guardare il javax.swing.LookAndFeel e javax.swing.UIManager classi.

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

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

La comprensione dell'anatomia del LookAndFeel è utile per la scrittura di controlli:La creazione di un Aspetto Personalizzato

Si può sempre provare il Synth look & feel.È necessario fornire un file xml, che agisce come una sorta di foglio di stile, insieme con tutte le immagini che si desidera utilizzare.Il codice potrebbe essere simile a questo:

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);
}

Da lì, andare avanti e aggiungere il JButton come si farebbe normalmente.L'unico cambiamento è che si utilizza il setName(string) metodo per identificare ciò che il pulsante mappa nel file xml.

Il file xml potrebbe assomigliare a questo:

<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>

Bind elemento ci consente di specificare cosa la mappa (in questo esempio, si applicherà styling a tutti i pulsanti, il cui nome proprietà è stata impostata su "sporco").

E un paio di link utili:

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

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

Probabilmente sto andando un milione di miglia di sbagliato diretta (ma sono solo i giovani :P ).ma non è che puoi aggiungere l'immagine di un pannello di controllo e poi un mouselistener per l'oggetto grafico in modo che quando l'utente sulla grafica la tua azione viene eseguita.

Non ho fatto ALTALENA di sviluppo dato che i miei primi CS classi, ma se non fosse stato costruito in appena potrebbe ereditare javax.swing.AbstractButton e creare il proprio.Dovrebbe essere abbastanza semplice per legare qualcosa insieme a loro quadro esistente.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top