DISABILITARE ADBLOCK

ADBlock sta bloccando alcuni contenuti del sito

ADBlock errore
risultati trovati: 

DOMANDA

C'è un modo per creare un JButton con la tua grafica del pulsante e non solo con un'immagine all'interno del pulsante?

In caso contrario, esiste un altro modo per creare un JButton personalizzato in java?

SOLUZIONE

Quando stavo imparando Java per la prima volta, dovevamo creare Yahtzee e ho pensato che sarebbe stato bello creare componenti e contenitori Swing personalizzati invece di disegnare tutto su un JPanel . Il vantaggio di estendere i componenti Swing , ovviamente, è avere la possibilità di aggiungere supporto per le scorciatoie da tastiera e altre funzionalità di accessibilità che non si possono fare semplicemente avendo un paint () metodo stampa una bella immagine. Tuttavia, potrebbe non essere fatto nel modo migliore, ma potrebbe essere un buon punto di partenza per te.

Modifica 8/6 - Se non risulta dalle immagini, ogni Die è un pulsante su cui puoi fare clic. Questo lo sposterà nel DiceContainer di seguito. Guardando il codice sorgente puoi vedere che ogni pulsante Die è disegnato dinamicamente, in base al suo valore.

alt text
alt text
alt text

Ecco i passaggi di base:

  1. Crea una classe che estende JComponent
  2. Chiama il costruttore principale super () nei tuoi costruttori
  3. Assicurati di implementare la classe MouseListener
  4. Metti questo nel costruttore:

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

    public Dimension getPreferredSize()  
    public Dimension getMinimumSize()  
    public Dimension getMaximumSize()
    
  6. Sostituisci questo metodo:

    public void paintComponent(Graphics g)
    

La quantità di spazio con cui lavorare quando si disegna il pulsante è definita da getPreferredSize () , supponendo getMinimumSize () e getMaximumSize () restituisce lo stesso valore. Non ho sperimentato troppo con questo, ma, a seconda del layout che usi per la tua GUI, il tuo pulsante potrebbe apparire completamente diverso.

E infine il codice sorgente . Nel caso mi mancasse qualcosa.

Se ti va lasciaci una tua opinione

L'articolo ti è stato utile ed è tradotto correttamente?

ALTRI SUGGERIMENTI

Sì, questo è possibile. Uno dei principali professionisti dell'utilizzo di Swing è la facilità con cui i controlli astratti possono essere creati e manipolati.

Ecco un modo rapido e sporco per estendere la classe JButton esistente 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);
    }

}

Nota che sostituendo paintComponent è possibile modificare il contenuto del pulsante, ma che il bordo viene dipinto con il metodo paintBorder . Anche il metodo getPreferredSize deve essere gestito per supportare dinamicamente le modifiche al contenuto. Bisogna fare attenzione quando si misurano le metriche dei caratteri e le dimensioni dell'immagine.

Per creare un controllo su cui fare affidamento, il codice sopra riportato non è l'approccio corretto. Le dimensioni e i colori sono dinamici in Swing e dipendono dall'aspetto e dall'aspetto utilizzati. Anche l'aspetto predefinito Metal è cambiato nelle versioni di JRE. Sarebbe meglio implementare AbstractButton e conformarsi alle linee guida stabilite dall'API Swing. Un buon punto di partenza è guardare le classi javax.swing.LookAndFeel e javax.swing.UIManager .

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

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

Comprendere l'anatomia di LookAndFeel è utile per scrivere controlli: Creazione un aspetto personalizzato

Puoi sempre provare il look Synth & amp; sentire. Fornisci un file xml che funge da una sorta di foglio di stile, insieme a tutte le immagini che desideri utilizzare. Il codice potrebbe apparire così:

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ì, continua e aggiungi il tuo JButton come faresti normalmente. L'unica modifica è che usi il metodo setName (stringa) per identificare a cosa dovrebbe essere associato il pulsante nel file xml.

Il file xml potrebbe apparire così:

<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'elemento bind lì specifica a cosa mappare (in questo esempio, applicherà tale stile a tutti i pulsanti la cui proprietà name è stata impostata su "dirt").

E un paio di link utili:

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

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

Probabilmente sto andando per un milione di miglia nella direzione sbagliata (ma sono solo giovane: P). ma non è possibile aggiungere la grafica a un pannello e quindi un mouselistener all'oggetto grafico in modo che quando l'utente sulla grafica viene preformata la tua azione.

Non ho più sviluppato SWING sin dalle mie prime lezioni CS, ma se non fosse integrato potresti semplicemente ereditare javax.swing.AbstractButton e crearne uno tuo. Dovrebbe essere piuttosto semplice collegare qualcosa insieme al loro framework esistente.

Licensed under: CC-BY-SA with attribution
Not affiliated with StackOverflow