本範例由官網所取得,它展示的就是使用List Button來自動設定已選定之CheckBox元件的文字顏色。
============範例展示=================================================
============範例展示=================================================
以下是ui.bxml,請注意在List Button的屬性中,有一個是設定repeatable="true",表示它會自動重複執行選定的動作。還有,在List Button的子元件中,有兩個部份:
<dataRenderer> <content:ListButtonColorItemRenderer/> </dataRenderer>使用ListButtonColorItem來呈現色板(color swatches),也就是ListButton在未下拉時的樣式僅呈現一塊色板。
<itemRenderer> <content:ListViewColorItemRenderer/> </itemRenderer>使用ListViewColorItem來呈現色板(color swatches),包含色板及相關說明文字,在按了ListButton之後會以popup的方式呈現。
同時,在程式碼下方的BoxPane(bxml:id="checkboxBoxPane")的地方,是在java原始碼中,以動態的方式產生十個Checkbox元件。
<!--ui.bxml-->
<myex:RepeatableListButtons title="Repeatable List Buttons" maximized="true"
xmlns:bxml="http://pivot.apache.org/bxml"
xmlns:content="org.apache.pivot.wtk.content"
xmlns:myex="myex"
xmlns="org.apache.pivot.wtk">
<Border styles="{padding:8}">
<TablePane styles="{horizontalSpacing:4}">
<columns>
<TablePane.Column width="-1"/>
<TablePane.Column width="1*"/>
</columns>
<TablePane.Row height="1*">
<FlowPane>
<Label text="顏色:"/>
<ListButton bxml:id="colorListButton" Form.label="Color"
repeatable="true" action="applyColor" listSize="8"
selectedIndex="0">
<dataRenderer>
<content:ListButtonColorItemRenderer/>
</dataRenderer>
<itemRenderer>
<content:ListViewColorItemRenderer/>
</itemRenderer>
<content:ColorItem color="#000000" name="Black"/>
<content:ColorItem color="#0000AA" name="Blue"/>
<content:ColorItem color="#00AA00" name="Green"/>
<content:ColorItem color="#00AAAA" name="Cyan"/>
<content:ColorItem color="#AA0000" name="Red"/>
<content:ColorItem color="#AA00AA" name="Magenta"/>
<content:ColorItem color="#AA5500" name="Brown"/>
<content:ColorItem color="#AAAAAA" name="Light Gray"/>
<content:ColorItem color="#555555" name="Dark Gray"/>
<content:ColorItem color="#5555FF" name="Bright Blue"/>
<content:ColorItem color="#55FF55" name="Bright Green"/>
<content:ColorItem color="#55FFFF" name="Bright Cyan"/>
<content:ColorItem color="#FF5555" name="Bright Red"/>
<content:ColorItem color="#FF55FF" name="Bright Magenta"/>
<content:ColorItem color="#FFFF55" name="Bright Yellow"/>
<content:ColorItem color="#FFFFFF" name="White"/>
</ListButton>
</FlowPane>
<Border>
<ScrollPane>
<BoxPane bxml:id="checkboxBoxPane" orientation="vertical"
styles="{padding:4, spacing:4}"/>
</ScrollPane>
</Border>
</TablePane.Row>
</TablePane>
</Border>
</myex:RepeatableListButtons>
接下來是繼承Window類別的RepeatableListButtons.java
//myex@RepeatableLustButtons.java
package myex;
import java.awt.Color;
import java.net.URL;
import org.apache.pivot.beans.Bindable;
import org.apache.pivot.collections.ArrayList;
import org.apache.pivot.collections.Map;
import org.apache.pivot.util.Resources;
import org.apache.pivot.wtk.Button.State;
import org.apache.pivot.wtk.*;
import org.apache.pivot.wtk.content.ColorItem;
public class RepeatableListButtons extends Window implements Bindable {
private ListButton colorListButton = null;
private BoxPane checkboxBoxPane = null;
private int selectedCount = 0;
//自訂的動作,可以重複執行
private Action applyColorAction = new Action() {
@Override
public void perform(Component source) {
//取得使用者點選之項目,因為在ui.bxml中設定為ColorItem,故轉型為ColorItem
ColorItem colorItem = (ColorItem) colorListButton.getButtonData();
//取得顏色
Color color = colorItem.getColor();
for (Component component : checkboxBoxPane) {
Checkbox checkbox = (Checkbox) component;
if (checkbox.isSelected()) {
//取得bxml:id=CheckBoxPane(實際上是在BoxPane)中的所有CheckBox
//若有選取則重複設定顏色
checkbox.getStyles().put("color", color);
checkbox.setSelected(false);
}
}
}
};
public RepeatableListButtons() {
//建構子
//1.首先將ui.bxml中的<ListButton action="applyColor"></ListButton>
// applyColor和自動的動作applyColorAction進行mapping
Action.getNamedActions().put("applyColor", applyColorAction);
//2.程式一開始不允許按ListButton,只有使用者按了CheckBox之後才允許
applyColorAction.setEnabled(false);
}
@Override
public void initialize(Map<String, Object> namespace, URL location, Resources resources) {
//get wtk components references
colorListButton = (ListButton) namespace.get("colorListButton");
checkboxBoxPane = (BoxPane) namespace.get("checkboxBoxPane");
//自訂的Checkbox事件處理機制
ButtonStateListener buttonStateListener = new ButtonStateListener() {
@Override
public void stateChanged(Button button, State previousState) {
if (button.isSelected()) {
selectedCount++;
} else {
selectedCount--;
}
//唯有使用者點選1個以上的checkbox才動作
applyColorAction.setEnabled(selectedCount > 0);
}
};
//會顯示在checkbox中的字串
ArrayList<String> numbers = new ArrayList<String>("One 一", "Two 二", "Three 三", "Four 四", "Five 五",
"Six 六", "Seven 七", "Eight 八", "Nine 九", "Ten 十");
for (String number : numbers) {
Checkbox checkbox = new Checkbox(number);
//指定checkbox的buttonstateListener為
checkbox.getButtonStateListeners().add(buttonStateListener);
//動態加入checkbox在ui.bxml設定的元件(bxml:id="checkboxBoxPane")
checkboxBoxPane.add(checkbox);
}
}
}
No comments:
Post a Comment