是否有标准的实现或库在Swing中提供GUI切换开关?我知道Swing提供了一个切换按钮,但是UX有点不尽如人意。我正在寻找这个:
此外,这种控制是否有规范术语? Apple HIG将其称为UISwitch。我也尝试过搜索“拨动开关”,但我没有太多运气。 (很多JavaScript结果,但没有原生的。)
答案 0 :(得分:8)
您可以使用两个图标来代表&关闭,然后将其设置为JToggleButton
。
另外,用户希望看到代表“最少惊喜之路”的逻辑和一致的GUI,开发人员认为用户需要一个“漂亮,聪明”的GUI(他们可以设计一个)。为什么他们想要对标准切换按钮进行这样的控制?
答案 1 :(得分:5)
我不知道标准版本,但创建Steel Series组件的Gerrit Grunwald创建了一个实现,他称之为Steel Checkbox
答案 2 :(得分:4)
Swing没有像您描述的标准开关。如果你找不到第三方,你最好的选择就是简单地写一个。我接近它的方式将是一个简单的结构:
•JLabel
•覆盖paintComponent
•检查类似isOn()
的状态
•为切换状态添加MouseListener
•自定义绘画将考虑标签值和尺寸。
我可以寄给你一些我前段时间写过的东西,但你可能对你想要的东西有一个非常具体的想法,所以可能值得花半个小时来构建它。
答案 3 :(得分:0)
猜猜我迟到了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);