Custom Buttons oder Custom Combobox

DoppelFabi

Aktives Mitglied
Hey,

Ich habe ein kleines Programm programmiert.
Aber die ich finde die Standard Combobox und Buttons "Skins" so heeslig.
Ich habe davon gehört, dass man mit einer Grafikmethode irgendwie diese Skins selbst erstellen kann.
Gibt es Websiten oder Leute die mir das alles etwas erklären?

LG
Fabi
 

Robat

Top Contributor
Geht es dir um Swing oder um JavaFX?

Falls ersteres:
Es kommt etwas drauf an, was du unter "Custom" verstehst.
Es gibt die verschiedene, vordefinierte, Look and Feels (LAF). Einfach mal danach googeln.
Falls du wirklich in die Richtung "fancy" mit polygon-förmigen Comboboxen gehen willst ( ;) ), musst du tatsächlich deine Komponenten selber zeichnen. Dazu vielleicht einfach mal hier einlesen.

Falls letzteres:
In JavaFX kannst du dein Styling über CSS bestimmen.
 

DoppelFabi

Aktives Mitglied
Ich denke ich werde sie selber Zeichnen gibt es Beispiel Bilder wie so ein Custom Button, Combobox aussehen kann? Würde gerne eine Combobox, wo auf einer Seite ON steht auf der anderen OFF und wenn ich ihn Klicke soll eine Animation kommen. Die Animation sollte einfach nur das die eine Seite zur anderen wandert aber dann ON anzeigt und der Hintergrund des Buttons sollte dann Grün bzw. Rot werden.
 

Robat

Top Contributor
Such bei Google einfach mal nach "Toggle Switch Button" ... da sollten genug Bilder kommen.
Das mit der Animation solltest du erstmal in der Hintergrund stellen - das ist nicht ganz so trivial. Bau erstmal den Button ohne Animation und füg diese danach hinzu.
 

DoppelFabi

Aktives Mitglied
Ich habe mich mal auf Google informiert und habe mir das Beispiel von Oracle angeschaut.
Bei mir hat sich eine Frage gebildet:
Dort sind 3 Buttons, aber ich bräuchte 2 und die Buttons dort sind alle "Rund" deswegen sieht es bisschen naja aus..
Aber ginge es, wenn man 2 Buttons (ON/OFF) nebeneinander packt, und denn Button auf einer Seite nur rund zu machen. Sprich (ON OFF) bei ON links rund und bei OFF rechts rund.
 

Robat

Top Contributor
Warum willst du das ganze denn als 2 verschiedene Buttons abbilden? Es reicht doch vollkommen 1 Button zu nutzen und beim klick auf den Button das Bild zu wechseln. Intern hast du ein boolean für den State (on/off) und fertig ist das Ding. ;)
Somit hast du das Problem auch nicht mehr mit den Ecken weil du einfach alle Ecken abrunden kannst.

Aber um die Frage zu beantworten: in der Theorie wäre es möglich nur jeweils 2 Ecken abzurunden, ja.
 

DoppelFabi

Aktives Mitglied
Möchte in der Mitte des Button ein Strich oder was auch gut wäre ist ein Punkt der ganz rechts ist (Also OFF) und wenn ich drauf klicke mit Animation nach ganz rechts zu on wandert. Kennst du diese Minecraft Cheats? Dort sind öfters sowelche Animations drin. Nur dieses Beispiel kenne ich:confused:
 

Robat

Top Contributor
Meinst du sowas?
Edit: (Link: https://www.digminecraft.com/game_commands/images/cheats_on_edu.png )
cheats_on_edu.png
 
Zuletzt bearbeitet:

DoppelFabi

Aktives Mitglied
Ich habe denn Screenshot von dir auf Google gefunden.
Das ist auch ein gute Beispiel.
Aber was natürlich geiler Aussehen würde ist, wenn es ein abgerundeten Buttom gibt, der rechts off und links on hat.
Und ein Punkt standardmäßig auf off steht und wenn drauf klicke, geht der Punkt von rechts nach links zu on.
Vielleicht schwer vorzustellen. :D
 

DoppelFabi

Aktives Mitglied
Ja nur länger und das rechts und links on/off steht

EDIT: Was besser wäre: In denn Punkt on und wenn der Status geändert wird dementsprechend off
 

mihe7

Top Contributor

DoppelFabi

Aktives Mitglied
Auf denn 2ten Link kann ich erst nach der Arbeit.
Steht im 2ten Link, wie man das ungefährt programmiert?
Und wie programmiert man die Animation und das Custom Design?
 

mihe7

Top Contributor
Die Animation ist, soweit ich das sehe, bereits enthalten. Die CSS-Styles musst Du suchen. Ich verwende kein JavaFX, insofern kann ich da nicht viel mehr dazu sagen. Was Anpassungen betrifft: @Robat :)
 

Robat

Top Contributor
Ich würde gerne JavaFX benutzen aber wenn es nicht anders geht dann CSS.
Das ist ein bisschen wie wenn du sagen würdest:
Ich würde meinen Kaffee gerne mit der Maschine machen - wenn das nicht geht trinke ich ihn ohne Milch :p

JavaFX nutzt CSS Dateien um die Komponenten zu stylen. Ob du CSS nutzt hängt nicht davon ab ob du JavaFX benutzt ;)

Ansonsten hier mal ein kleiner Denkanstoß:
 

Robat

Top Contributor
JavaFX und Swing zu mischen ist zwar technisch möglich, aber nicht empfehlenswert und hier überhaupt nicht nötig.

@mihe7 wird sicherlich gleich mit einem Beispiel um die Ecke kommen, daher halt ich mich mal zurück :p

Übrigens: hast du mal in Erwägung gezogen selber zu googeln? Gibt doch bestimmt genug Zeug dazu im Netz
 

DoppelFabi

Aktives Mitglied
Ist derzeit nicht möglich, da dieser PC denn ich verwende mit einer FireWall mit einem Netzwerk verbunden ist von der Firma, sodass die meisten Websiten die nicht zum Arbeiten da sind, gesperrt sind.
 

DoppelFabi

Aktives Mitglied
Ich habe oft wenig zu tun, deswegen schreibe ich hier.
Gerade habe ich wieder einen Auftrag deswegen bin ich jetzt eine Stunde wieder nicht da.
Meine Hobbies bekommen nur Zeit, wenn keine Arbeit ansteht.
 

mihe7

Top Contributor
@mihe7 wird sicherlich gleich mit einem Beispiel um die Ecke kommen, daher halt ich mich mal zurück :p
So schnell geht das auch wieder nicht :)

Hier mal ein Ansatz (Achtung: quick & dirty - vor allem dirty)

Java:
import java.awt.Color;
import java.awt.Dimension;
import java.awt.Font;
import java.awt.FontMetrics;
import java.awt.Graphics;
import java.awt.Insets;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;
import javax.swing.JComponent;
import javax.swing.Timer;

// für Testzwecke (main)
import javax.swing.*;


public class SwitchButton extends JComponent {
    private String onLabel = "ON";
    private String offLabel = "OFF";
    private int gap = 10;
    private static final int DEFAULT_TRACK_WIDTH = 100;
    private static final int KNOB_DIAMETER = 20;

    private int trackHeight = 24;

    private int duration = 200;
    private int animX = -1;
    private Animator animator;

    private Color trackColor = Color.WHITE;
    private Color knobColor = Color.GREEN;

    private boolean on = false;

    public SwitchButton() {
        addMouseListener(new MouseAdapter() {
            @Override
            public void mouseClicked(MouseEvent e) {
                if (animator == null || animator.timer == null) {
                    animator = new Animator(duration);
                }
            }
        });
    }

    @Override
    public Dimension getPreferredSize() {
        if (isPreferredSizeSet()) {
            return super.getPreferredSize();
        }

        FontMetrics fm = getFontMetrics(getFont());
        Insets insets = getInsets();
        int w = insets.left + insets.right;
        w += onLabelWidth() + offLabelWidth();
        w += 2 * gap + DEFAULT_TRACK_WIDTH;
        int h = insets.top + insets.bottom + 
                Math.max(trackHeight, Math.max(
                    KNOB_DIAMETER, fm.getHeight()));
        return new Dimension(w, h);
    }

    private int onLabelWidth() {
        FontMetrics fm = getFontMetrics(getFont());
        return fm.stringWidth(onLabel);        
    }

    private int offLabelWidth() {
        FontMetrics fm = getFontMetrics(getFont());
        return fm.stringWidth(offLabel);        
    }

    private int trackWidth() {
        Insets insets = getInsets();
        return getWidth() - insets.left - insets.right - 
            2*gap - onLabelWidth() - offLabelWidth();
    }

    @Override
    public Dimension getMinimumSize() {
        return getPreferredSize();
    }

    @Override
    protected void paintComponent(Graphics g) {
        Insets insets = getInsets();
        int lx = insets.left;
        int ty = insets.top;
        int h = getHeight() - insets.top - insets.bottom - 1;
        int w = getWidth() - insets.left - insets.right - 1;

        g.setColor(getBackground());
        g.fillRect(lx, ty, w, h);

        g.setFont(getFont());
        FontMetrics fm = g.getFontMetrics();

        int onWidth = onLabelWidth();
        int offWidth = offLabelWidth();

        int cy = h/2;
        int x = lx;
        g.setColor(getForeground());
        g.drawString(offLabel, x, cy + fm.getAscent() / 2);
        x += offWidth + gap;
        int onX = lx + w - onWidth;
        g.drawString(onLabel, onX, cy + fm.getAscent() / 2);        
        
        int trackX = x;
        int trackWidth = onX - gap - x;
        g.setColor(trackColor);
        g.fillRect(x, ty, trackWidth, h);    

        int knobX;
        int maxKnobX = trackWidth - KNOB_DIAMETER;
        if (animX != -1) {
            knobX = Math.min(Math.max(0, animX), maxKnobX);
        } else {
            knobX = on ? maxKnobX : 0;
        }
        int knobY = cy - KNOB_DIAMETER/2;
        g.setColor(knobColor);
        g.fillOval(trackX + knobX, knobY, KNOB_DIAMETER, KNOB_DIAMETER);
    }

    private void setAnimX(int x) {
        animX = x;
        repaint();
    }

    private class Animator {
        private Timer timer;
        private int direction;
        private int max;
        private long millis;
        private int duration;

        public Animator(int duration) {
            this.duration = duration;
            max = trackWidth();
            direction = on ? -1 : 1;
            millis = System.currentTimeMillis();
            timer = new Timer(15, e -> animate());
            timer.start();
        }

        private void animate() {
            int time = (int)(System.currentTimeMillis() - millis);
            if (time < duration) {
                setAnimX((direction < 0 ? max : 0) + direction * max * time / duration);
            } else {
                on = !on;
                setAnimX(-1);
                timer.stop();
                timer = null;
            }
        }
    }

    public static final void main(String[] args) {
        JPanel panel = new JPanel();
        panel.add(new SwitchButton());

        JFrame frame = new JFrame();
        frame.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);
        frame.add(panel);
        frame.pack();
        frame.setVisible(true);
    }
}
 
Ähnliche Java Themen
  Titel Forum Antworten Datum
W Items löschen aus String Array vom Custom Base Adapter Java Basics - Anfänger-Themen 2
I JPA CriteriaBuilder -> Custom SQL hinzufügen Java Basics - Anfänger-Themen 5
WetWer Custom Datei Endung öffnen Java Basics - Anfänger-Themen 1
F Wie Werte einer ArrayList an einen 'Custom'-Iterator übergeben? Java Basics - Anfänger-Themen 2
Z Custom Exception ausgeben? Java Basics - Anfänger-Themen 8
P custom EventDispatcher fehlermeldung in der runtime bei invo Java Basics - Anfänger-Themen 27
N Java Taschenrechner hat Jemand vlt einen Tipp dafür wie ich jetzt die buttons verbinden kann und das Ergebnis auf dem textfield anzeigen lassen kann Java Basics - Anfänger-Themen 13
Jxhnny.lpz Randomisier für Buttons Java Basics - Anfänger-Themen 13
R Buttons ohne Funktion Java Basics - Anfänger-Themen 2
yoskaem Text Color durch Klicken eines Buttons in anderer Activity ändern Java Basics - Anfänger-Themen 2
A Aktualisierung eines Buttons Java Basics - Anfänger-Themen 18
S Runde Buttons erstellen Java Basics - Anfänger-Themen 10
J Input/Output Input Buttons Html mit JSP Java Basics - Anfänger-Themen 3
F Mehrere Buttons mit einem ActionListener abdecken Java Basics - Anfänger-Themen 24
T Buttons... Java Basics - Anfänger-Themen 1
U Javafx Array aus Buttons Java Basics - Anfänger-Themen 2
L Buttons außerhalb der sichtbaren Activity Java Basics - Anfänger-Themen 8
E Hilfe bei Buttons (GUI) Java Basics - Anfänger-Themen 3
D Mit Buttonklick Farbe der anderen Buttons verändern? Java Basics - Anfänger-Themen 2
L Buttons ansprechen Java Basics - Anfänger-Themen 1
F Mehrfaches Clicken eines Buttons Java Basics - Anfänger-Themen 1
H Buttons zeigen keine Reaktion Java Basics - Anfänger-Themen 6
E Wenn i (for-Loop) bestimmter Wert, dann neue Zeile eines Buttons Java Basics - Anfänger-Themen 7
H Java Buttons ausblenden bei inaktivität Java Basics - Anfänger-Themen 1
A Nach Druck eines Buttons reagieren andere Button nicht Java Basics - Anfänger-Themen 3
R Problem mit ActionListener für Buttons Java Basics - Anfänger-Themen 5
D Variable Anzahl an Buttons per Schleife Java Basics - Anfänger-Themen 7
U Best Practice Buttons sollen ÜBER Labeln liegen, also quasi im Vordergrund. WIE? Java Basics - Anfänger-Themen 4
TheSorm Anzeige fehler eines Buttons Java Basics - Anfänger-Themen 3
M Icons auf Buttons Java Basics - Anfänger-Themen 9
S Variablen Variable bei drücken eines Buttons ändern Java Basics - Anfänger-Themen 1
M Buttons funktionieren nicht Java Basics - Anfänger-Themen 4
lord239123 Buttons werden nicht angezeigt Java Basics - Anfänger-Themen 3
D Erste Schritte Buttons mit actionlistener Problem Java Basics - Anfänger-Themen 3
M Größe eines Buttons festlegen Java Basics - Anfänger-Themen 4
W Buttons sollen bei Mausklick einen String schreiben Java Basics - Anfänger-Themen 11
J Aktivierung eines Buttons nach Eingabe in Textfeldern (DocumentListener) Java Basics - Anfänger-Themen 4
O Position des Buttons wird nicht geändert.. Java Basics - Anfänger-Themen 6
K Erste Schritte GUI - Hintergrundbild und darauf Buttons Java Basics - Anfänger-Themen 2
J BlueJ canvas Buttons adden? Java Basics - Anfänger-Themen 2
U Methoden Methode zur Erstellung von Buttons Java Basics - Anfänger-Themen 11
H Icons in Buttons resizable? Java Basics - Anfänger-Themen 3
C Buttons über Textfeld beschriften Java Basics - Anfänger-Themen 10
L OOP Buttons mit Pfeilen miteinander verbinden Java Basics - Anfänger-Themen 5
A Dropdown Liste - mit je zwei Verlinkungen und zwei ausführende Buttons Java Basics - Anfänger-Themen 3
I Dynamisch erzeugten Buttons Methoden zuweisen Java Basics - Anfänger-Themen 6
P Listener für mehrere Buttons Java Basics - Anfänger-Themen 3
S Hilfe bei Buttons Java Basics - Anfänger-Themen 2
S Erste Schritte ActionListener auf Buttons einrichten Java Basics - Anfänger-Themen 3
B Die Hintergrundfarbe eines deaktivierten buttons ändern? Java Basics - Anfänger-Themen 4
SheldoN Töne abspielen auf verschiedenen Buttons Java Basics - Anfänger-Themen 17
J durch drücken eines buttons text in einer textdatei speichern Java Basics - Anfänger-Themen 2
G MouseListener für mehrere Buttons Java Basics - Anfänger-Themen 11
Fab1 Buttons auf ein Hintergrundbild(JFrame) setzen Java Basics - Anfänger-Themen 24
H Methode aufrufen beim Drücken eines Buttons im Boxlayout Java Basics - Anfänger-Themen 6
M Tabelle mit Buttons Java Basics - Anfänger-Themen 24
M Variablen via actionPerformed mit Buttons ändern Java Basics - Anfänger-Themen 7
K Durch ändern eines Buttons String füllen Java Basics - Anfänger-Themen 14
J Buttons Java Basics - Anfänger-Themen 19
G Buttons in ein Array umformen Java Basics - Anfänger-Themen 11
S Buttons übereinander legen - Reihenfolge Java Basics - Anfänger-Themen 2
M Buttons erscheinen erst bei Mouse-Over Java Basics - Anfänger-Themen 8
B Buttons Java Basics - Anfänger-Themen 9
T Buttons (auf denen bilder sind) random vertauschen Java Basics - Anfänger-Themen 11
1 Menü mit Buttons erstellen Java Basics - Anfänger-Themen 10
M Durchsichtige Buttons Java Basics - Anfänger-Themen 12
P OnClickListener für mehrere Buttons Java Basics - Anfänger-Themen 5
U Buttons einfügen (Leiste verschwunden!?) Java Basics - Anfänger-Themen 2
M Gui - Probleme mit Buttons Java Basics - Anfänger-Themen 4
C Swing, Buttons Wert zuweisen Java Basics - Anfänger-Themen 3
E Android: OnClickListener erkennt Buttons nicht Java Basics - Anfänger-Themen 7
E Buttons in Android generieren? Java Basics - Anfänger-Themen 4
D Link over Buttons Java Basics - Anfänger-Themen 4
B Identifikation eines einzelnen Buttons aus mehreren Buttons per Schleife erzeugten Java Basics - Anfänger-Themen 4
Nicer Radio Buttons Gruppe Java Basics - Anfänger-Themen 2
G getControlPanelComponent JMF Buttons verstecken? Java Basics - Anfänger-Themen 7
K Buttons Funktionieren Nicht!!! Java Basics - Anfänger-Themen 8
manunana89 2 ActionListener auf 2 Buttons??? Java Basics - Anfänger-Themen 6
Mike90 verschieben von Buttons, ... Java Basics - Anfänger-Themen 18
F Buttons und Aktionen Java Basics - Anfänger-Themen 20
M dynamisches Clipboard mit Buttons Java Basics - Anfänger-Themen 5
H Buttons um sprache zu ändern. Java Basics - Anfänger-Themen 6
B Calculator - Buttons zusammenfassen Java Basics - Anfänger-Themen 8
0 Buttons mit Absatz Java Basics - Anfänger-Themen 6
B Buttons erstellen! Wie? Java Basics - Anfänger-Themen 2
D Buttons-die Wahrheit über sie Java Basics - Anfänger-Themen 11
G Buttons mit MouseOver Java Basics - Anfänger-Themen 5
M "Selbst erstellte" Buttons nicht sichtbar. Java Basics - Anfänger-Themen 20
Mörmel Variable Anzahl von Buttons erzeugen Java Basics - Anfänger-Themen 6
K Fenster mit Buttons hin und her schieben ? Java Basics - Anfänger-Themen 23
A in jTextField mit Hilfe von Buttons schreiben Java Basics - Anfänger-Themen 2
J Buttons Java Basics - Anfänger-Themen 3
M Buttons auf allen Masken Java Basics - Anfänger-Themen 4
G Alle Buttons in einer For Schleife ändern Java Basics - Anfänger-Themen 5
G Nicht benannte Buttons - Wenn gedrückt > Action Java Basics - Anfänger-Themen 24
T Buttons Resetten Java Basics - Anfänger-Themen 2
G Grafische Oberfläche mit Buttons und Actionlistener? Java Basics - Anfänger-Themen 27
D Buttons gehen trotz enebled(false) Java Basics - Anfänger-Themen 8
P Buttons Java Basics - Anfänger-Themen 6
G Panels und Buttons Java Basics - Anfänger-Themen 5

Ähnliche Java Themen

Neue Themen


Oben