Δημιουργώντας μια προσαρμοσμένη JButton σε Java

ψήφοι
86

Είναι ένας τρόπος για να δημιουργήσετε ένα εκεί JButtonμε το δικό σας κουμπί γραφικών και όχι μόνο με μια εικόνα μέσα στο πλήκτρο;

Αν όχι, είναι ένας άλλος τρόπος για να δημιουργήσετε μια προσαρμοσμένη υπάρχουν JButtonσε Java;

Δημοσιεύθηκε 05/08/2008 στις 13:15
πηγή χρήστη
Σε άλλες γλώσσες...                            


5 απαντήσεις

ψήφοι
85

Όταν για πρώτη φορά την εκμάθηση Java έπρεπε να κάνει Yahtzee και σκέφτηκα ότι θα ήταν δροσερό για να δημιουργήσετε προσαρμοσμένα στοιχεία Swing και δοχεία αντί απλώς αντλώντας τα πάντα σε ένα JPanel. Το όφελος από την παράταση Swingσυστατικά, φυσικά, είναι να έχουν τη δυνατότητα να προσθέσετε υποστήριξη για συντομεύσεις πληκτρολογίου και άλλες δυνατότητες προσβασιμότητας που δεν μπορείτε να κάνετε ακριβώς από την κατοχή μια paint()μέθοδο εκτυπώσετε μια όμορφη εικόνα. Δεν μπορεί να γίνει ο καλύτερος τρόπος, ωστόσο, αλλά μπορεί να είναι ένα καλό σημείο εκκίνησης για σας.

Επεξεργασία 8/6 - Αν δεν ήταν εμφανές από τις εικόνες, κάθε Die είναι ένα κουμπί που μπορείτε να κάνετε κλικ. Αυτό θα κινηθεί προς το DiceContainerκάτω. Κοιτάζοντας τον πηγαίο κώδικα, μπορείτε να δείτε ότι κάθε κουμπί Die σχεδιάζεται δυναμικά, με βάση την αξία του.

alt κείμενο
alt κείμενο
alt κείμενο

Εδώ είναι τα βασικά βήματα:

  1. Δημιουργήστε μια κλάση που επεκτείνει JComponent
  2. Πρόσκληση μητρική κατασκευαστή super()σε κατασκευαστές σας
  3. Βεβαιωθείτε ότι έχετε τάξη υλοποιεί MouseListener
  4. Βάλτε αυτό το κατασκευαστή:

    enableInputMethods(true);   
    addMouseListener(this);
    
  5. Παράκαμψη αυτές τις μεθόδους:

    public Dimension getPreferredSize()  
    public Dimension getMinimumSize()  
    public Dimension getMaximumSize()
    
  6. Παράκαμψη αυτής της μεθόδου:

    public void paintComponent(Graphics g)
    

Το ποσό του χώρου θα πρέπει να συνεργαστεί με κατά την κατάρτιση κουμπί σας καθορίζεται από getPreferredSize(), αναλαμβάνοντας getMinimumSize()και getMaximumSize()επιστρέφουν την ίδια τιμή. Δεν έχω πειραματιστεί πάρα πολύ με αυτό, αλλά, ανάλογα με τη διάταξη που χρησιμοποιείτε για GUI σας το κουμπί σας θα μπορούσε να είναι τελείως διαφορετικοί.

Και τέλος, ο πηγαίος κώδικας . Σε περίπτωση που χάσει τίποτα.

Απαντήθηκε 05/08/2008 στις 14:03
πηγή χρήστη

ψήφοι
32

Ναι, αυτό είναι δυνατό. Ένα από τα βασικά πλεονεκτήματα για τη χρήση Swing είναι η ευκολία με την οποία μπορούν να δημιουργηθούν και να χειρίζεται το αφηρημένο ελέγχους.

Εδώ είναι μια γρήγορη και βρώμικη τρόπο να επεκτείνει την υπάρχουσα τάξη JButton για να σχεδιάσετε έναν κύκλο στα δεξιά του κειμένου.

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

}

Να σημειωθεί ότι από επιτακτικούς paintComponent ότι μπορεί να αλλάξει το περιεχόμενο του κουμπιού, αλλά ότι τα σύνορα είναι ζωγραφισμένο από τον paintBorder μέθοδο. Η getPreferredSize μέθοδος πρέπει επίσης να διαχειρίζονται με σκοπό την υποστήριξη δυναμικά αλλαγές στο περιεχόμενο. Φροντίδα πρέπει να λαμβάνεται κατά τη μέτρηση μετρήσεις της γραμματοσειράς και τις διαστάσεις της εικόνας.

Για τη δημιουργία ενός ελέγχου που μπορείτε να βασιστείτε, ο παραπάνω κώδικας δεν είναι η σωστή προσέγγιση. Διαστάσεις και χρώματα είναι δυναμική Swing και εξαρτώνται από την εμφάνιση και την αίσθηση που χρησιμοποιείται. Ακόμη και η προεπιλογή Metal εμφάνιση έχει αλλάξει σε όλη εκδόσεις JRE. Θα ήταν καλύτερα να εφαρμόσει AbstractButton και σύμφωνα με τις κατευθυντήριες γραμμές που ορίζονται από το Swing API. Ένα καλό σημείο εκκίνησης είναι να δούμε τα javax.swing.LookAndFeel και 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

Η κατανόηση της ανατομίας του LookAndFeel είναι χρήσιμη για τη σύνταξη ελέγχους: Δημιουργία μιας προσαρμοσμένης εμφάνιση και αίσθηση

Απαντήθηκε 05/08/2008 στις 13:53
πηγή χρήστη

ψήφοι
12

Μπορείτε πάντα να δοκιμάσετε το Synth εμφάνιση και αίσθηση. Μπορείτε να παρέχει ένα αρχείο xml που λειτουργεί ως ένα είδος στυλ, μαζί με τις εικόνες που θέλετε να χρησιμοποιήσετε. Ο κωδικός μπορεί να μοιάζει κάπως έτσι:

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

Από εκεί, να πάει και να προσθέσετε JButton σας όπως θα κάνατε κανονικά. Η μόνη αλλαγή είναι ότι μπορείτε να χρησιμοποιήσετε τη μέθοδο setname θέτει (κορδόνι) να προσδιορίσει ποιο είναι το κουμπί πρέπει χάρτη στο αρχείο xml.

Το αρχείο XML μπορεί να μοιάζει κάπως έτσι:

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

Το στοιχείο δεσμεύουν καθορίζει εκεί τι να χαρτογραφήσει σε (σε αυτό το παράδειγμα, θα εφαρμόζουν το styling σε οποιοδήποτε από τα κουμπιά του οποίου η περιουσία όνομα έχει οριστεί σε «βρωμιά»).

Και μερικά χρήσιμα links:

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

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

Απαντήθηκε 05/08/2008 στις 13:47
πηγή χρήστη

ψήφοι
8

Είμαι κατά πάσα πιθανότητα πρόκειται ένα εκατομμύριο μίλια σε λάθος άμεση (αλλά είμαι μόνο τους νέους: P). αλλά δεν θα μπορούσατε να προσθέσετε το γραφικό σε έναν πίνακα και, στη συνέχεια, ένα mouselistener στο γραφικό αντικείμενο, έτσι ώστε όταν ο χρήστης στο γραφικό σας ενέργεια πραγματοποιείται για.

Απαντήθηκε 20/08/2008 στις 16:48
πηγή χρήστη

ψήφοι
6

Δεν έχω κάνει ανάπτυξης SWING από τις αρχές κατηγορίες CS μου, αλλά αν δεν χτίστηκε σε θα μπορούσατε απλά να κληρονομήσει javax.swing.AbstractButton και να δημιουργήσετε τα δικά σας. Πρέπει να είναι αρκετά απλό να συνδέσετε κάτι μαζί με το υπάρχον πλαίσιο τους.

Απαντήθηκε 05/08/2008 στις 13:30
πηγή χρήστη

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