java - 单击后 Vaadin 更改按钮样式

标签 java css button vaadin

编辑:请原谅我不清楚,我需要一个“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 检查器时,我看到添加了 Activity 类,但按钮消失了。如果我单击按钮所在的位置,我会看到“Activity ”类已删除(如果再次单击则添加...)。仅当我在按钮所在的区域外单击时,该按钮才会重新出现。

您能提供一些见解吗?

编辑:我按照建议更正了此处的示例代码(在我的类里面,它已经按照建议进行了,但我不知道它有什么不同,所以谢谢!)

当页面加载时,按钮有这个类:

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 代码已正确执行。

有两个问题:

  1. “active”样式没有应用到按钮,按钮消失了!
  2. 如果我在按钮外单击,按钮会重新出现,但样式会返回到非 Activity 按钮。非 Activity 样式工作正常,因此页面加载了 css。

为了进一步引用,这是我正在使用的 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");
        }       
    }
}

关于java - 单击后 Vaadin 更改按钮样式,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18284016/

相关文章:

javascript - 如何使用 toggleClass

javascript - jQuery 通过按下按钮更改 div 的内容(include())

Ghost 按钮的 CSS 对齐方式

java - 为了使用 FFT 算法将音频转录为频率数据,我应该使用 targetDataLine 的哪一部分?

java - 在 HashSet 中搜索字符串数组中的任意元素

java - 避免在 Android 设备上的应用程序设置中单击 'clear data' 按钮时从数据库中删除数据

html - 位置 :Absolute withing Position:Relative in Chrome

html - 在 flex 上有两行。我怎样才能使一个比另一个相对大?

变量中的 JavaScript/HTML 代码?

java - 使用 lambda 表达式对值集合执行算术运算时避免抛出 java.lang.NullPointerException