Java中是否有标准的GUI切换开关?
是否有标准实现或库在Swing中提供GUI切换开关?我知道Swing提供了一个切换按钮,但是UX还有一点不尽如人意。我在找这个:Java中是否有标准的GUI切换开关?,java,swing,icons,uiswitch,jtogglebutton,Java,Swing,Icons,Uiswitch,Jtogglebutton,是否有标准实现或库在Swing中提供GUI切换开关?我知道Swing提供了一个切换按钮,但是UX还有一点不尽如人意。我在找这个: 还有,这种类型的控件是否有一个规范术语?苹果把它称为一个开关。我也试着搜索“切换开关”,但运气不太好。(有很多JavaScript结果,但没有本地结果。)Swing没有您描述的标准开关。如果你找不到第三方,最好的办法就是写一个。我的方法是这样一个简单的结构: ToggleSwitch ts = new ToggleSwitch(); ts.setLocation(5
还有,这种类型的控件是否有一个规范术语?苹果把它称为一个开关。我也试着搜索“切换开关”,但运气不太好。(有很多JavaScript结果,但没有本地结果。)Swing没有您描述的标准开关。如果你找不到第三方,最好的办法就是写一个。我的方法是这样一个简单的结构:
ToggleSwitch ts = new ToggleSwitch();
ts.setLocation(5, 135);
frame.add(ts);
•JLabel
•覆盖
paintComponent
•使用类似于
isOn()
•添加一个
鼠标侦听器来切换状态。
•定制喷漆将考虑标签值和尺寸
我可以给你发一封我不久前写的信,但是你可能对你想要的东西有一个非常具体的想法,所以花半个小时来构建它可能是值得的 您可以通过使用两个图标来模拟开关,然后将它们设置为JToggleButton
另一方面,用户希望看到逻辑一致的GUI,它们代表了“最不令人惊讶的途径”,开发者认为用户需要一个“漂亮、聪明”的GUI(并且他们可以设计一个)。他们到底为什么想要对标准的切换按钮进行这样的控制呢?我不知道标准的切换按钮,但是谁创造了钢制系列组件,谁创造了一个他称之为
我想我晚了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;
}
}
只需将其复制到ToggleSwitch.java中。
您可以将其添加到JFrame中,如下所示:
ToggleSwitch ts = new ToggleSwitch();
ts.setLocation(5, 135);
frame.add(ts);
这样的切换按钮模仿真实的物理开关,因此只要用户知道在与它交互时会发生什么,效果上就不会有什么意外+1对于JToggleButton
,这是一种更简单的方法,可以节省时间,而不必重新发明它。@偏执狂安卓只要它是操作系统的正常组件,它就不再是最令人惊讶的途径。我认为这只是表示“可切换开关”的一种方式(不一定是最好的)。切换按钮或复选框是另外两种方式。它只是让组件做用户期望的事情。还有@MK.,你有权发表你的意见,这里不是争论的地方,所以我就顺其自然了p同意,如果它遵循其他组件的样式,您将是安全的。鉴于这个问题是关于Swing的,这种开关是否“适合”完全取决于实现。@MK.我不使用OS X,但认为它的外观非常优雅。此外,考虑到苹果对磨砺用户体验的态度,我非常怀疑他们会不直观。所以“你有权发表你的意见,但请不要把这篇文章弄得乱七八糟”。评论被标记为非建设性的。@AndrewThompson你是100%对的,这就是为什么我说它非常不直观——考虑到视觉上的完美和大量细节,至少可以说,结果并不令人满意。可以找到相关的例子并加以说明。实现图标
也是改变外观的便捷方式。Gerrit的博客是一个很好的资源。谢谢开关看起来不错。有没有办法在切换中添加文本?