Frage

Gibt es eine Möglichkeit, eine zu erstellen? JButton mit Ihrer eigenen Button-Grafik und nicht nur mit einem Bild im Button?

Wenn nicht, gibt es eine andere Möglichkeit, eine benutzerdefinierte Datei zu erstellen? JButton in Java?

War es hilfreich?

Lösung

Als ich zum ersten Mal Java lernte, mussten wir Yahtzee erstellen und ich dachte, es wäre cool, benutzerdefinierte Swing-Komponenten und Container zu erstellen, anstatt einfach alles auf einem zu zeichnen JPanel.Der Vorteil der Verlängerung Swing Komponenten besteht natürlich darin, die Möglichkeit zu haben, Unterstützung für Tastaturkürzel und andere Barrierefreiheitsfunktionen hinzuzufügen, die Sie nicht einfach mit einem erreichen können paint() Methode, ein hübsches Bild zu drucken.Es mag zwar nicht die beste Lösung sein, aber es kann ein guter Ausgangspunkt für Sie sein.

Bearbeiten 8/6 – Falls es auf den Bildern nicht erkennbar war: Jeder Würfel ist eine Schaltfläche, auf die Sie klicken können.Dadurch wird es in die verschoben DiceContainer unten.Wenn Sie sich den Quellcode ansehen, können Sie sehen, dass jede Die-Schaltfläche basierend auf ihrem Wert dynamisch gezeichnet wird.

alt text
alt text
alt text

Hier sind die grundlegenden Schritte:

  1. Erstellen Sie eine Klasse, die erweitert wird JComponent
  2. Rufen Sie den übergeordneten Konstruktor auf super() in Ihren Konstruktoren
  3. Stellen Sie sicher, dass Sie die Klasse implementieren MouseListener
  4. Fügen Sie dies in den Konstruktor ein:

    enableInputMethods(true);   
    addMouseListener(this);
    
  5. Überschreiben Sie diese Methoden:

    public Dimension getPreferredSize()  
    public Dimension getMinimumSize()  
    public Dimension getMaximumSize()
    
  6. Überschreiben Sie diese Methode:

    public void paintComponent(Graphics g)
    

Die Menge an Platz, mit der Sie beim Zeichnen Ihrer Schaltfläche arbeiten müssen, wird durch definiert getPreferredSize(), vorausgesetzt getMinimumSize() Und getMaximumSize() den gleichen Wert zurückgeben.Ich habe nicht allzu viel damit experimentiert, aber je nachdem, welches Layout Sie für Ihre GUI verwenden, könnte Ihre Schaltfläche völlig anders aussehen.

Und schließlich die Quellcode.Für den Fall, dass ich etwas verpasst habe.

Andere Tipps

Ja, das ist möglich.Einer der Hauptvorteile von Swing ist die einfache Erstellung und Bearbeitung abstrakter Steuerelemente.

Hier ist eine schnelle und unkomplizierte Möglichkeit, die vorhandene JButton-Klasse zu erweitern, um einen Kreis rechts vom Text zu zeichnen.

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

}

Beachten Sie dies durch Überschreiben paintComponent dass der Inhalt der Schaltfläche geändert werden kann, der Rand jedoch durch die gezeichnet wird paintBorder Methode.Der getPreferredSize Die Methode muss auch verwaltet werden, um Änderungen am Inhalt dynamisch zu unterstützen.Beim Messen von Schriftmetriken und Bildabmessungen ist Vorsicht geboten.

Um ein Steuerelement zu erstellen, auf das Sie sich verlassen können, ist der obige Code nicht der richtige Ansatz.Abmessungen und Farben sind in Swing dynamisch und hängen von der verwendeten Optik und Haptik ab.Sogar die Standardeinstellung Metall Das Aussehen hat sich in den JRE-Versionen geändert.Es wäre besser, es umzusetzen AbstractButton und den von der Swing-API festgelegten Richtlinien entsprechen.Ein guter Ausgangspunkt ist es, sich das anzuschauen javax.swing.LookAndFeel Und javax.swing.UIManager Klassen.

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

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

Das Verständnis der Anatomie von LookAndFeel ist hilfreich für das Schreiben von Steuerelementen:Erstellen eines individuellen Erscheinungsbilds

Sie können jederzeit das Synth-Look & Feel ausprobieren.Sie stellen eine XML-Datei bereit, die als eine Art Stylesheet fungiert, zusammen mit allen Bildern, die Sie verwenden möchten.Der Code könnte so aussehen:

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

Fahren Sie von dort aus fort und fügen Sie Ihren JButton hinzu, wie Sie es normalerweise tun würden.Die einzige Änderung besteht darin, dass Sie die Methode setName(string) verwenden, um zu identifizieren, worauf die Schaltfläche in der XML-Datei abgebildet werden soll.

Die XML-Datei könnte so aussehen:

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

Das dortige Bindungselement gibt an, was zugeordnet werden soll (in diesem Beispiel wird dieser Stil auf alle Schaltflächen angewendet, deren Namenseigenschaft auf „Dirt“ gesetzt wurde).

Und ein paar nützliche Links:

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

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

Ich fahre wahrscheinlich eine Million Meilen in die falsche Richtung (aber ich bin noch jung :P).Aber könnten Sie die Grafik nicht zu einem Panel und dann einen Mouselistener zum Grafikobjekt hinzufügen, damit Ihre Aktion ausgeführt wird, wenn der Benutzer auf der Grafik ist?

Ich habe seit meinen frühen CS-Kursen keine SWING-Entwicklung mehr gemacht, aber wenn es nicht eingebaut wäre, könnte man es einfach erben javax.swing.AbstractButton und erstellen Sie Ihr eigenes.Sollte ziemlich einfach sein, etwas mit dem vorhandenen Framework zu verbinden.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top