Tôi muốn kết hợp một số ToggleButton và RadioButton. Tôi muốn phần "loại trừ lẫn nhau" của RadioButton, và giao diện gui và hành vi của ToggleButton (trạng thái lên và xuống). Có phải đã tồn tại?tiện ích gwt - nút chuyển đổi lẫn nhau độc quyền
Trả lời
Tôi đã thích nghi kirushik của giải pháp và tạo một widget "ToggleButtonPanel" đơn giản, có một số tùy ý ToggleButtons (và có thể là bất kỳ tiện ích con nào bạn muốn thêm) và bảng điều khiển bạn chọn (mặc định là VerticalPanel) và làm cho các nút loại trừ lẫn nhau.
Điều thú vị là bảng điều khiển tự kích hoạt ClickEvents khi các nút được nhấp. Bằng cách này, bạn có thể thêm một ClickHandler duy nhất để các ToggleGroupPanel và sau đó xác định nút mà được nhấp sử dụng event.getSource()
import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;
import com.google.gwt.event.dom.client.ClickEvent;
import com.google.gwt.event.dom.client.ClickHandler;
import com.google.gwt.event.dom.client.HasClickHandlers;
import com.google.gwt.event.shared.HandlerRegistration;
import com.google.gwt.user.client.ui.Composite;
import com.google.gwt.user.client.ui.HasWidgets;
import com.google.gwt.user.client.ui.Panel;
import com.google.gwt.user.client.ui.ToggleButton;
import com.google.gwt.user.client.ui.VerticalPanel;
import com.google.gwt.user.client.ui.Widget;
public class ToggleButtonPanel extends Composite implements HasWidgets, HasClickHandlers{
public ToggleButtonPanel() {
this(new VerticalPanel());
}
public ToggleButtonPanel(Panel panel){
this.panel = panel;
initWidget(panel);
}
@Override
public void add(Widget w) {
if(w instanceof ToggleButton){
ToggleButton button = (ToggleButton) w;
button.addClickHandler(handler);
}
panel.add(w);
}
@Override
public void clear() {
panel.clear();
}
@Override
public Iterator<Widget> iterator() {
return panel.iterator();
}
@Override
public boolean remove(Widget w) {
return panel.remove(w);
}
@Override
public void setWidth(String width) {
panel.setWidth(width);
};
@Override
public void setHeight(String height) {
panel.setHeight(height);
}
private final Panel panel;
private ClickHandler handler = new ClickHandler(){
@Override
public void onClick(ClickEvent event) {
Iterator<Widget> itr = panel.iterator();
while(itr.hasNext()){
Widget w = itr.next();
if(w instanceof ToggleButton){
ToggleButton button = (ToggleButton) w;
button.setDown(false);
if(event.getSource().equals(button)) {
button.setDown(true);
}
}
}
for(ClickHandler h : handlers){
h.onClick(event);
}
}
};
private List<ClickHandler> handlers = new ArrayList<ClickHandler>();
@Override
public HandlerRegistration addClickHandler(final ClickHandler handler) {
handlers.add(handler);
return new HandlerRegistration() {
@Override
public void removeHandler() {
handlers.remove(handler);
}
};
}
}
"Ví dụ này minh họa Chuyển đổi Buttons. Khi nhấn vào, Buttons như chuyển đổi 'ép' tình trạng của họ.
The Bold, Italic và gạch dưới Buttons chuyển đổi hoạt động độc lập liên quan đến trạng thái chuyển đổi của họ trong khi biểu tượng căn chỉnh văn bản Các nút thuộc cùng một nhóm chuyển đổi và do đó khi một trong số chúng được nhấp, nút được nhấn trước đó sẽ trở về trạng thái bình thường của nó. "
Đây là biến thể tinh khiết-gwt tôi:
class ThreeStateMachine extends FlowPanel{
// This is the main part - it will unset all the buttons in parent widget
// and then set only clicked one.
// One mutual handler works faster and is generally better for code reuse
private final ClickHandler toggleToThis = new ClickHandler() {
@Override
public void onClick(ClickEvent clickEvent) {
for(Widget b: ThreeStateMachine.this.getChildren()){
((ToggleButton)b).setDown(false);
}
((ToggleButton)clickEvent.getSource()).setDown(true);
}
};
private ThreeStateMachine() { // Create out widget and populat it with buttons
super();
ToggleButton b = new ToggleButton("one");
b.setDown(true);
b.addClickHandler(toggleToThis);
this.add(b);
b = new ToggleButton("two");
b.addClickHandler(toggleToThis);
this.add(b);
b = new ToggleButton("three");
b.addClickHandler(toggleToThis);
this.add(b);
}
}
Chắc chắn, one'll cần phong cách css cho gwt-ToggleButton với các biến thể (-up-lơ lửng, vv)
Tôi không nhớ tại sao tôi muốn điều này, nhưng 1 cho câu trả lời. –
Cảm ơn, đó không phải là một vấn đề lớn - đây chỉ là một dán từ dự án hiện tại của tôi :) – kirushik
tôi có cái gì đó là cả hai không trong một thư viện mở rộng, và không phụ thuộc vào một bảng điều khiển giống như các câu trả lời khác. Xác định lớp này quản lý các nút. Chúng tôi đang thêm một trình nghe nhấp chuột mới vào các nút, đó là ngoài bất kỳ trình xử lý nhấp chuột nào bạn đã đính kèm trong lớp "Nội dung GUI". Tôi không thể sao chép và dán nó vào, vì vậy hy vọng nó đúng về mặt cú pháp.
public class MutuallyExclusiveToggleButtonCollection {
List<ToggleButton> m_toggleButtons = new ArrayList<ToggleButton>();
public void add(ToggleButton button) {
m_toggleButtons.add(button);
button.addClickListener(new ExclusiveButtonClickHandler());
}
private class ExclusiveButtonClickHandler impelments ClickHandler {
public void onClick(ClickEvent event) {
for(ToggleButton button : m_toggleButtons) {
boolean isSource = event.getSource().equals(button);
button.setIsDown(isSource);
}
}
}
Đăng ký một ClickHandler bổ sung trên tất cả ToggleButtons. Ví dụ: ToggleButtons home, tree, summary, detail.
public class Abc extends Composite implements ClickHandler {
ToggleButton home, tree, summary, detail
public Abc() {
// all your UiBinder initializations... blah, blah....
home.addClickHandler(this);
tree.addClickHandler(this);
summary.addClickHandler(this);
detail.addClickHandler(this);
}
@Override
public void onClick(ClickEvent p_event) {
Object v_source = p_event.getSource();
home.setDown(home==v_source);
tree.setDown(tree==v_source);
summary.setDown(summary==v_source);
detail.setDown(detail==v_source);
}
}
Tất nhiên, bạn chỉ cần thêm tất cả mã boilerplate khác và đăng ký ClickHandlers bổ sung cho mỗi ToggleButton.
đi qua cùng một nhu cầu, heres một giải pháp mà không đi với xử lý riêng biệt và các công trình độc đáo trong UiBinder với một khai báo như sau:
<my:RadioToggleButton buttonGroup="btnGroup" text="Button 1" />
Đây là lớp mở rộng:
import java.util.HashMap;
import com.google.gwt.event.dom.client.ClickEvent;
import com.google.gwt.event.dom.client.ClickHandler;
import com.google.gwt.uibinder.client.UiConstructor;
import com.google.gwt.user.client.ui.ToggleButton;
public class RadioToggleButton extends ToggleButton
{
private static HashMap<String,ButtonGroup> buttonGroups = new HashMap<>();
private ButtonGroup buttonGroup;
public @UiConstructor RadioToggleButton(String buttonGroupName)
{
buttonGroup = buttonGroups.get(buttonGroupName);
if(buttonGroup == null){
buttonGroups.put(buttonGroupName, buttonGroup = new ButtonGroup());
}
buttonGroup.addButton(this);
}
@Override
public void setDown(boolean isDown)
{
if(isDown){
RadioToggleButton btn = buttonGroup.pressedBtn;
if(btn != null){
btn.setDown(false);
}
buttonGroup.pressedBtn = this;
}
super.setDown(isDown);
}
private class ButtonGroup implements ClickHandler
{
RadioToggleButton pressedBtn = null;
public void addButton(ToggleButton button)
{
button.addClickHandler(this);
}
@Override
public void onClick(ClickEvent event)
{
Object obj = event.getSource();
if(pressedBtn != null){
pressedBtn.setDown(false);
}
pressedBtn = (RadioToggleButton)obj;
pressedBtn.setDown(true);
}
}
}
- 1. Đặt id của tiện ích con GWT
- 2. GWT có tiện ích con Đoạn không?
- 3. Liệu argparse (python) có hỗ trợ các nhóm đối số độc quyền lẫn nhau không?
- 4. Python argparse: lẫn nhau nhóm độc quyền với một số đối số tương thích
- 5. Chèn tiện ích GWT vào phần tử div
- 6. Tiện ích Android: Cách thay đổi văn bản của nút
- 7. Linux: Tiện ích dòng lệnh Chuyển đổi RTF thành PDF?
- 8. Di chuyển nút "gốc" hoặc nút cha - tiện ích mở rộng Doctrine NestedSet
- 9. Chuyển đổi Tiện ích mở rộng của Google Chrome sang tiện ích mở rộng của Firefox hoặc Safari
- 10. Cập nhật nút tiện ích động - cảm hứng bắt buộc
- 11. Nút mặc định tkinter trong một tiện ích
- 12. Hai nút tiện ích Android gọi cùng Hoạt động với các mục đích khác nhau
- 13. PyQt - hiển thị tiện ích ở đầu tiện ích
- 14. NHibernate: khóa độc quyền
- 15. Cách nhóm các tiện ích tổng hợp gwt thay đổi sự kiện dưới dạng sự kiện thay đổi
- 16. GWT để Javascript chuyển đổi
- 17. Tại sao QHBoxLayout khiến tiện ích chồng lên nhau?
- 18. Thay đổi kích thước tiện ích con của Android
- 19. trình nghe nhấp chuột trên nút tiện ích con android
- 20. Mercurial Chuyển đổi tiện ích mở rộng thay đổi kết thúc dòng
- 21. Tiện ích WPF hữu ích
- 22. Sự khác nhau giữa tiện ích mở rộng Firefox và tiện ích bổ sung Firefox là gì?
- 23. Backbone.js Tiện ích
- 24. GWT: Làm cách nào để xóa chỉ báo tiêu điểm của tiện ích Canvas?
- 25. API tiện ích/tiện ích mở rộng Gmail - cách thêm nút vào thanh công cụ soạn thư?
- 26. id tiện ích twitter động
- 27. Tiện ích javascript riêng tư
- 28. chuyển đổi Chuỗi thành Ngày trên GWT
- 29. Qt QMainWindow xóa tiện ích trung tâm
- 30. Làm cách nào để căn giữa tiện ích ở giữa màn hình trong vanilla GWT?
Nhưng những không có thuộc tính loại trừ lẫn nhau của các nút radio (tức là bạn nhấp vào một nút, sau đó nhấp vào nút khác và bạn đã chọn hai nút). –