编辑:请原谅我不清楚,我需要一个“Vaadin”解决方案
显然这应该是非常直观的,但我无法让它工作,当一个按钮被点击时我应该改变它的风格,如果再次点击,将风格恢复到原来的样子。我的猜测是:
@Override
public void buttonClick(ClickEvent event) {
Button b = event.getButton();
if (b == my_special_button){
if(!b.getStyleName().contains("x")){
b.addStyleName("x");
} else {
b.removeStyleName("x");
}
}
}
使用 chrome 检查器时,我看到添加了活动类,但按钮消失了。如果我单击按钮所在的位置,我会看到“活动”类已删除(如果再次单击则添加...)。只有当我在按钮所在的区域外单击时,按钮才会重新出现。
你能提供一些见解吗?
编辑:我在这里按照建议更正了示例代码(在我的课堂上已经按照建议进行了,但我不知道它有什么不同,所以谢谢!)
页面加载时按钮有这个类:
v-button v-button-thumbs-up-button thumbs-up-button
当我点击时,使用 chrome inspector 我可以看到类 active 被添加:
v-button v-button-thumbs-up-button thumbs-up-button v-button-active active
如果我再次点击,它就会被删除。所以显然 onclick 代码被正确执行了。
有两个问题:
为了进一步参考,这是我正在使用的 css:
.thumbs-up-button{
background-image: url("../covercliptheme/img/thumbs_up_1x.png");
background-position: left top;
}
.thumbs-up-button .v-button-active .active{
background-image: url("../covercliptheme/img/thumbs_up_1x_green.png");
background-position: left top;
}
我也找到了样式 :active 和 :focus 的解决方法。它正在工作,但没有真正的理由应该这样做。它应该按照我最初的预期工作我认为,通过添加一个类,按钮以该样式呈现,删除类,样式返回到原始样式。
我认为问题出在我用组件构建页面的方式上,而不是在 onClick 操作本身上。我非常想知道出了什么问题:)按钮是组件的一部分,它是其他组件的一部分,特别是带有按钮的组件由以下类表示:
public class CVRow extends CustomComponent implements Button.ClickListener{
@AutoGenerated
private AbsoluteLayout mainLayout;
@AutoGenerated
private HorizontalLayout horizontalLayout_1;
@AutoGenerated
private AbsoluteLayout absoluteLayout_2;
@AutoGenerated
private Button nativeButton_2;
@AutoGenerated
private Button nativeButton_1;
/**
* The constructor
*/
public CVRow() {
buildMainLayout();
setCompositionRoot(mainLayout);
nativeButton_1.addListener(this);
// TODO add user code here
}
@AutoGenerated
private AbsoluteLayout buildMainLayout() {
/* some layout code.. */
// add horizontalLayout_1
horizontalLayout_1 = buildHorizontalLayout_1();
mainLayout.addComponent(horizontalLayout_1, "top:0.0px;left:0.0px;");
return mainLayout;
}
@AutoGenerated
private HorizontalLayout buildHorizontalLayout_1() {
// some layout code... //
// add absoluteLayout_2 <-- buttons will be here
absoluteLayout_2 = buildAbsoluteLayout_2();
horizontalLayout_1.addComponent(absoluteLayout_2);
return horizontalLayout_1;
}
@AutoGenerated
private AbsoluteLayout buildAbsoluteLayout_2() {
// common part: create layout
absoluteLayout_2 = new AbsoluteLayout();
absoluteLayout_2.setImmediate(false);
absoluteLayout_2.setWidth("60px");
absoluteLayout_2.setHeight("60px");
absoluteLayout_2.setMargin(false);
//BUTTONS are here:
// nativeButton_1
nativeButton_1 = new Button();
nativeButton_1.setImmediate(true);
nativeButton_1.setWidth("20px");
nativeButton_1.setHeight("20px");
nativeButton_1.setStyleName("thumbs-up-button");
absoluteLayout_2.addComponent(nativeButton_1, "top:41.0px;left:0.0px;");
// nativeButton_2
nativeButton_2 = new Button();
nativeButton_2.setStyleName("thumbs-down-button");
nativeButton_2.setImmediate(true);
nativeButton_2.setWidth("20px");
nativeButton_2.setHeight("20px");
absoluteLayout_2.addComponent(nativeButton_2, "top:41.0px;left:40.0px;");
return absoluteLayout_2;
}
@Override
public void buttonClick(ClickEvent event) {
Button b = event.getButton();
if (b == nativeButton_1){
if(nativeButton_1.getStyleName().contains("active"))
nativeButton_1.removeStyleName("active");
else
nativeButton_1.addStyleName("active");
}
//etc...
}
}
您的代码的问题是,您检查并更改了按钮“b”的样式名称,而不是按钮“my_special_button”的样式名称。它必须看起来像这样:
@Override
public void buttonClick(ClickEvent event) {
Button b = event.getButton();
if (b == my_special_button){
if(!my_special_button.getStyleName().contains("x")){
my_special_button.addStyleName("x");
} else {
my_special_button.removeStyleName("x");
}
}
}
使用纯 javascript 的简单示例:DEMO
HTML:
<button id="toggleButton">
Toggle Class
</button>
CSS:
button{
font-size:10px;
}
.active{
font-size:15px;
}
JS:
var btn = document.getElementById('toggleButton');
btn.addEventListener('click', function(event){
if(this.classList.contains('active')){
this.classList.remove('active');
}
else{
this.classList.add('active');
}
});