betacode

Руководство Java SWT Toggle Button

  1. SWT Toggle Button
  2. Пример с Toggle Button
  3. Обработка событий для Toggle Button
  4. Использовать разные Icon для разных состояний

1. SWT Toggle Button

В SWT, toggle является объектом класса Button со стилем SWT.TOGGLE.
Toggle button имеют два состояния выбраны и не выбраны. По умолчанию Toggle button не зависит от другой Toggle button.
// Create a radio button

Button radio = new Button(parent, SWT.TOGGLE);
Toggle при запуске на различных операционных системах, часто различаются по интерфейсу. Ниже изображается Toggle button при работе на Windows XP и Windows 8:
Toggle Button (Windows XP):
Toggle Button (Windows 8)
Действительность показывает, что на Windows 8 у вас есть затруднения при отличии выбранной Toggle Button по сравнению с невыбранной Toggle Button. Одно из возможных решений этой проблемы это использование различных иконок для выбранного состояния и невыбранного.
// Create a Toggle Button

Button appleButton = new Button(parent, SWT.TOGGLE);
appleButton.setText("Apple");
Вы также можете настроить иконки (icon) для toggle через метод setImage
InputStream input
    = RadioButtonDemo.class.getResourceAsStream("/org/o7planning/swt/icon/apple-16.png");
Image image = new Image(null, input);

toggleButton.setImage(image);

2. Пример с Toggle Button

В SWT, по умолчанию Toggle Button независимы друг от друга. Она отличается от поведения Radio Button, когда radio Button находятся в одном Composite или группе, если вы выбираете одну radio button, все другие radio button будут отменены.
ToggleButtonDemo.java
package org.o7planning.swt.togglebutton;

import org.eclipse.swt.SWT;
import org.eclipse.swt.graphics.Image;
import org.eclipse.swt.layout.RowLayout;
import org.eclipse.swt.widgets.Button;
import org.eclipse.swt.widgets.Display;
import org.eclipse.swt.widgets.Group;
import org.eclipse.swt.widgets.Label;
import org.eclipse.swt.widgets.Shell;
import org.o7planning.swt.utils.MyImageUtils;

public class ToggleButtonDemo {

    public static void main(String[] args) {

        Display display = new Display();
        Shell shell = new Shell(display);
        shell.setText("SWT Toggle Button (o7planning.org)");

        RowLayout rowLayout = new RowLayout();
        rowLayout.marginLeft = 10;
        rowLayout.marginTop = 10;
        rowLayout.spacing = 15;
        shell.setLayout(rowLayout);

        Group fruitGroup = new Group(shell, SWT.NONE);
        fruitGroup.setLayout(new RowLayout(SWT.HORIZONTAL));

        Label label = new Label(fruitGroup, SWT.NONE);
        label.setText("Fruits: ");

        // Apple
        Button appleButton = new Button(fruitGroup, SWT.TOGGLE);
        appleButton.setText("Apple");

        Image appleIcon = MyImageUtils.getImage(display, "/org/o7planning/swt/icon/apple-16.png");
        appleButton.setImage(appleIcon);

        // Grape
        Button grapeButton = new Button(fruitGroup, SWT.TOGGLE);
        grapeButton.setText("Grape");

        
        Image grapeIcon = MyImageUtils.getImage(display, "/org/o7planning/swt/icon/grape-16.png");
        grapeButton.setImage(grapeIcon);

        // Banana
        Button bananaButton = new Button(fruitGroup, SWT.TOGGLE);
        bananaButton.setText("Banana");

        Image bananaIcon = MyImageUtils.getImage(display, "/org/o7planning/swt/icon/banana-16.png");
        bananaButton.setImage(bananaIcon);

        shell.setSize(400, 250);
        shell.open();
        while (!shell.isDisposed()) {
            if (!display.readAndDispatch())
                display.sleep();
        }
        display.dispose();
    }

}
Запуск примеров (Посмотреть на Windows XP и Windows 8)

3. Обработка событий для Toggle Button

Следующий пример обрабатывает событие, когда пользователь выбирает Toggle button
RadioButtonEventDemo.java
package org.o7planning.swt.togglebutton;

import org.eclipse.swt.SWT;
import org.eclipse.swt.events.SelectionAdapter;
import org.eclipse.swt.events.SelectionEvent;
import org.eclipse.swt.events.SelectionListener;
import org.eclipse.swt.layout.RowLayout;
import org.eclipse.swt.widgets.Button;
import org.eclipse.swt.widgets.Composite;
import org.eclipse.swt.widgets.Display;
import org.eclipse.swt.widgets.Label;
import org.eclipse.swt.widgets.Shell;

public class ToggleButtonEventDemo {

    public static void main(String[] args) {

        Display display = new Display();
        Shell shell = new Shell(display);
        shell.setText("SWT Toggle Button (o7planning.org)");

        RowLayout rowLayout = new RowLayout(SWT.VERTICAL);
        rowLayout.marginLeft = 10;
        rowLayout.marginTop = 10;
        rowLayout.spacing = 15;
        shell.setLayout(rowLayout);

        // Composite
        Composite composite = new Composite(shell, SWT.NONE);
        composite.setLayout(new RowLayout(SWT.HORIZONTAL));

        Label label = new Label(composite, SWT.NONE);
        label.setText("Select Fruits: ");

        // Apple
        Button toggleApple = new Button(composite, SWT.TOGGLE);
        toggleApple.setText("Apple");

        // Grape
        Button toggleGrape = new Button(composite, SWT.TOGGLE);
        toggleGrape.setText("Grape");

        // Banana
        Button toggleBanana = new Button(composite, SWT.TOGGLE);
        toggleBanana.setText("Banana");

        Label labelAnswer = new Label(shell, SWT.NONE);
        labelAnswer.setForeground(display.getSystemColor(SWT.COLOR_BLUE));

        SelectionListener selectionListener = new SelectionAdapter() {
            @Override
            public void widgetSelected(SelectionEvent e) {
                Button source = (Button) e.getSource();

                if (source.getSelection()) {
                    labelAnswer.setText("You select " + source.getText());
                    labelAnswer.pack();
                } else {
                    labelAnswer.setText("You deselect " + source.getText());
                    labelAnswer.pack();
                }

            }
        };

        toggleApple.addSelectionListener(selectionListener);

        toggleGrape.addSelectionListener(selectionListener);
        toggleBanana.addSelectionListener(selectionListener);

        shell.setSize(400, 250);
        shell.open();
        while (!shell.isDisposed()) {
            if (!display.readAndDispatch())
                display.sleep();
        }
        display.dispose();
    }

}

4. Использовать разные Icon для разных состояний

Как уже упоминалось выше, на Windows 8, пользователям иногда трудно различить между этими двумя состояниями выбран и не выбран Toggle Button. Решение это использовать различные иконки для различных состояний.
IconStateDemo.java
package org.o7planning.swt.togglebutton;

import org.eclipse.swt.SWT;
import org.eclipse.swt.events.SelectionAdapter;
import org.eclipse.swt.events.SelectionEvent;
import org.eclipse.swt.graphics.Image;
import org.eclipse.swt.layout.RowLayout;
import org.eclipse.swt.widgets.Button;
import org.eclipse.swt.widgets.Display;
import org.eclipse.swt.widgets.Label;
import org.eclipse.swt.widgets.Shell;
import org.o7planning.swt.utils.MyImageUtils;

public class IconStateDemo {

    public static void main(String[] args) {

        Display display = new Display();
        Shell shell = new Shell(display);
        shell.setText("SWT Toggle Button (o7planning.org)");

        RowLayout rowLayout = new RowLayout();
        rowLayout.marginLeft = 10;
        rowLayout.marginTop = 10;
        rowLayout.spacing = 15;
        shell.setLayout(rowLayout);

        Label label = new Label(shell, SWT.NONE);
        label.setText("Fruits: ");

        Image iconSelect = MyImageUtils.getImage(display, "/org/o7planning/swt/icon/apple-select-32.png");
        Image iconDeselect = MyImageUtils.getImage(display, "/org/o7planning/swt/icon/apple-deselect-32.png");

        // Apple
        Button appleButton = new Button(shell, SWT.TOGGLE);
        appleButton.setText("Apple");

        appleButton.setImage(iconDeselect);

        appleButton.addSelectionListener(new SelectionAdapter() {
            @Override
            public void widgetSelected(SelectionEvent e) {
                Button source = (Button) e.getSource();

                if (source.getSelection()) {
                    appleButton.setImage(iconSelect);
                } else {
                    appleButton.setImage(iconDeselect);
                }

            }
        });

        shell.setSize(400, 250);
        shell.open();
        while (!shell.isDisposed()) {
            if (!display.readAndDispatch())
                display.sleep();
        }
        display.dispose();
    }

}