Есть ли в Java стандартный тумблер GUI? - PullRequest
8 голосов
/ 05 февраля 2012

Существует ли стандартная реализация или библиотека, обеспечивающая тумблер GUI в Swing?Я знаю, что в Swing есть кнопка , но UX оставляет желать лучшего.Я ищу это:

enter image description here

Кроме того, существует ли канонический термин для этого типа контроля?Apple HIG называют его UISwitch.Я также попытался найти «тумблер», но мне не повезло.(Множество результатов JavaScript, но ничего нативного.)

Ответы [ 4 ]

8 голосов
/ 05 февраля 2012

Вы можете имитировать его, используя два значка для представления вкл. И выкл., А затем установите для них значение JToggleButton.

Кроме того, пользователи хотят видеть логические и непротиворечивые графические интерфейсы, которые представляют «путьНеудивительно, что разработчики думают, что пользователям нужен «красивый, умный» графический интерфейс (и что они могут его разработать).С какой стати им нужен такой контроль над стандартной кнопкой-переключателем?

5 голосов
/ 24 марта 2012

Я не знаю стандартного, но Геррит Грюнвальд , который создает компоненты серии Steel, создал реализацию этого, которую он называет Steel Checkbox

Steel checkbox

4 голосов
/ 05 февраля 2012

Swing не имеет стандартного переключателя, подобного тому, который вы описали.Лучше всего, если вы не можете найти стороннего, просто напишите его.То, как я подхожу к этому, будет простой структурой, подобной этой:

JLabel
• Переопределить paintComponent
• Проверить состояние с помощью чего-то вроде isOn()
•Добавьте MouseListener в состояние переключения.
• При создании пользовательского рисунка будут учитываться значения и размеры меток.

Я мог бы выслать вам тот, который написал некоторое время назад, но у вас, вероятно, есть очень конкретная идеяиз того, что вы хотите, так может стоить полчаса на его создание.

0 голосов
/ 20 сентября 2018

Думаю, я опоздал на 6 лет, но, тем не менее, для тех, кто все еще ищет простое решение:

import java.awt.Color;
import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.RenderingHints;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;
import java.awt.image.BufferedImage;

import javax.swing.JPanel;

@SuppressWarnings("serial")
public class ToggleSwitch extends JPanel {
    private boolean activated = false;
    private Color switchColor = new Color(200, 200, 200), buttonColor = new Color(255, 255, 255), borderColor = new Color(50, 50, 50);
    private Color activeSwitch = new Color(0, 125, 255);
    private BufferedImage puffer;
    private Graphics2D g;
    public ToggleSwitch() {
        super();
        setVisible(true);
        addMouseListener(new MouseAdapter() {
            @Override
            public void mouseClicked(MouseEvent arg0) {
                activated = !activated;
                repaint();
            }
        });
        setBounds(0, 0, 41, 21);
    }
    @Override
    public void paint(Graphics gr) {
        if(g == null) {
            puffer = (BufferedImage) createImage(getWidth(), getHeight());
            g = (Graphics2D)puffer.getGraphics();
            RenderingHints rh = new RenderingHints(
            RenderingHints.KEY_ANTIALIASING,
            RenderingHints.VALUE_ANTIALIAS_ON);
            g.setRenderingHints(rh);
        }
        g.setColor(activated?activeSwitch:switchColor);
        g.fillRoundRect(0, 0, 40, 20, 5, 5);
        g.setColor(borderColor);
        g.drawRoundRect(0, 0, 40, 20, 5, 5);
        g.setColor(buttonColor);
        if(activated) {
            g.fillRoundRect(21, 1, 18, 18,  5, 5);
            g.setColor(borderColor);
            g.drawRoundRect(20, 0, 20, 20, 5, 5);
        }
        else {
            g.fillRoundRect(1, 1, 18, 18,  5, 5);
            g.setColor(borderColor);
            g.drawRoundRect(0, 0, 20, 20, 5, 5);
        }

        gr.drawImage(puffer, 0, 0, null);
    }
    public boolean isActivated() {
        return activated;
    }
    public void setActivated(boolean activated) {
        this.activated = activated;
    }
    public Color getSwitchColor() {
        return switchColor;
    }
    /**
     * Unactivated Background Color of switch
     */
    public void setSwitchColor(Color switchColor) {
        this.switchColor = switchColor;
    }
    public Color getButtonColor() {
        return buttonColor;
    }
    /**
     * Switch-Button color
     */
    public void setButtonColor(Color buttonColor) {
        this.buttonColor = buttonColor;
    }
    public Color getBorderColor() {
        return borderColor;
    }
    /**
     * Border-color of whole switch and switch-button
     */
    public void setBorderColor(Color borderColor) {
        this.borderColor = borderColor;
    }
    public Color getActiveSwitch() {
        return activeSwitch;
    }
    public void setActiveSwitch(Color activeSwitch) {
        this.activeSwitch = activeSwitch;
    }
}

Просто скопируйте его в ToggleSwitch.java.Вы можете добавить его в свой JFrame следующим образом:

ToggleSwitch ts = new ToggleSwitch();
ts.setLocation(5, 135);
frame.add(ts);
...