Java中是否有标准的GUI切换开关?

cbe*_*ski 9 java icons swing uiswitch jtogglebutton

是否有标准实现或库在Swing中提供GUI切换开关?我知道Swing提供了一个切换按钮,但UX有点不尽如人意.我在找这个:

在此输入图像描述

此外,这种控制是否有规范术语?Apple HIG将其称为UISwitch.我也尝试过搜索"拨动开关",但我没有太多运气.(大量的JavaScript结果,但没有任何原生.)

And*_*son 9

您可以通过使用两个图标来表示打开和关闭,然后将它们设置为a来模仿它JToggleButton.

另外,用户希望看到代表"最少惊喜之路"的逻辑和一致的GUI,开发人员认为用户需要一个"漂亮,聪明"的GUI(他们可以设计一个).为什么他们想要对标准切换按钮进行这样的控制呢?

  • 像这样的切换按钮模仿真实的物理开关,因此只要用户知道在与它交互时会发生什么,就会有最小的惊喜效果.对于`JToggleButton`来说,这是一个更简单的方法,可以节省时间而不必重新发明它. (4认同)

Tim*_*arg 7

我不知道标准配置,但是创建Steel Series组件的Gerrit Grunwald创建了这个实现,他称之为Steel Checkbox

钢复选框


Fro*_*orm 7

我猜我迟到了 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 java.awt.Cursor;

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 int borderRadius = 10;
    private Graphics2D g;
    public ToggleSwitch() {
        super();
        setVisible(true);
        addMouseListener(new MouseAdapter() {
            @Override
            public void mouseReleased(MouseEvent arg0) {
                activated = !activated;
                repaint();
            }
        });
        setCursor(new Cursor(Cursor.HAND_CURSOR));
        setBounds(0, 0, 41, 21);
    }
    @Override
    public void paint(Graphics gr) {
        if(g == null || puffer.getWidth() != getWidth() || puffer.getHeight() != getHeight()) {
            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, this.getWidth()-1,getHeight()-1, 5, borderRadius);
        g.setColor(borderColor);
        g.drawRoundRect(0, 0, getWidth()-1, getHeight()-1, 5, borderRadius);
        g.setColor(buttonColor);
        if(activated) {
            g.fillRoundRect(getWidth()/2, 1,  (getWidth()-1)/2 -2, (getHeight()-1) - 2,  borderRadius, borderRadius);
            g.setColor(borderColor);
            g.drawRoundRect((getWidth()-1)/2, 0, (getWidth()-1)/2, (getHeight()-1), borderRadius, borderRadius);
        }
        else {
            g.fillRoundRect(1, 1, (getWidth()-1)/2 -2, (getHeight()-1) - 2,  borderRadius, borderRadius);
            g.setColor(borderColor);
            g.drawRoundRect(0, 0, (getWidth()-1)/2, (getHeight()-1), borderRadius, borderRadius);
        }

        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;
    }
    /**
     * @return the borderRadius
     */
    public int getBorderRadius() {
        return borderRadius;
    }
    /**
     * @param borderRadius the borderRadius to set
     */
    public void setBorderRadius(int borderRadius) {
        this.borderRadius = borderRadius;
    }

}
Run Code Online (Sandbox Code Playgroud)

只需将其复制到 ToggleSwitch.java 中即可。您可以将其添加到您的 JFrame 中,如下所示:

ToggleSwitch ts = new ToggleSwitch();
ts.setLocation(5, 135);
frame.add(ts);
Run Code Online (Sandbox Code Playgroud)


rth*_*sen 5

Swing没有您所描述的标准开关。如果找不到第三方,最好的选择就是简单地写一个。我采用的方式将是一个简单的结构,如下所示:

JLabel
•覆盖paintComponent
•检查的东西,如状态isOn()
•一个添加MouseListener到切换状态。
•自定义绘画将考虑标签值和大小。

我可以寄给我我前一段时间写的一封信,但是您可能对自己想要的东西有一个非常具体的想法,因此花半小时来构建它是值得的。