Java Структура программы Eclipse Composite Layout - PullRequest
0 голосов
/ 02 августа 2020

Немного новичок в программировании, я пытаюсь написать GUI для небольшого проекта дрона, созданного на заказ. Надеюсь, я смогу заставить его отображать телеметрию / камеру и кнопки для команд. Я не хочу зайти слишком далеко, не понимая, какую структуру я должен использовать. Пока я создал составной макет с несколькими заполнителями. Я нормально использую события для кнопок и клавиш и т. Д. c, но не вижу, как легко настроить 'main l oop', который запускает каждый цикл. Например, я хочу показать секунды, прошедшие для gui / flight et c в правом нижнем углу, которые обновляются с учетом разницы между временем начала и текущим временем. Любая помощь по структуре была бы потрясающей, спасибо.

Я знаю, что макет - это rubbi sh, а некоторый импорт не нужен et c, это просто тест, чтобы получить правильную настройку для начала :)

package testGUI;

import org.eclipse.swt.widgets.Composite;
import org.eclipse.swt.widgets.Display;
import org.eclipse.swt.widgets.Event;
import org.eclipse.swt.layout.GridLayout;
import org.eclipse.swt.widgets.ToolBar;

import org.eclipse.swt.SWT;
import org.eclipse.swt.graphics.Image;
import org.eclipse.swt.widgets.Label;
import org.eclipse.swt.widgets.Listener;
import org.eclipse.swt.widgets.Shell;
import org.eclipse.swt.widgets.Text;
import org.eclipse.swt.widgets.Group;
import org.eclipse.ui.forms.widgets.FormToolkit;
import org.eclipse.swt.widgets.Canvas;
import org.eclipse.swt.custom.CLabel;
import org.eclipse.swt.events.MouseMoveListener;
import org.eclipse.swt.events.MouseEvent;

public class TestComposite extends Composite {
    private final FormToolkit formToolkit = new FormToolkit(Display.getDefault());

    static int elapsedSecondsGUI;

    public static void main(String[] args) {
        System.out.println("Working Directory = " + System.getProperty("user.dir"));
        long startTimeGUI = System.currentTimeMillis();
        elapsedSecondsGUI = 0;
        Display display = new Display();
        Shell shell = new Shell(display);
        shell.setLayout(new GridLayout(1, false));

        TestComposite myNewGUI = new TestComposite(shell, SWT.NONE);

        shell.pack();
        shell.open();
        
        display.addFilter(SWT.None, new Listener() {
            
            @Override
            public void handleEvent(Event event) {
                char c = event.character;
                System.out.println(c);
            }
            
        });
        
        while (!shell.isDisposed()) {

            // main loop
            elapsedSecondsGUI = (int) ((System.currentTimeMillis() - startTimeGUI) / 1000);
            //TestComposite.autoUpdate();

            if (!display.readAndDispatch())
                display.sleep();
        }
        display.dispose();
    }


    
    /**
     * Create the composite.
     * 
     * @param parent
     * @param style
     */
    public TestComposite(Composite parent, int style){
        
        super(parent, style);
        setLayout(null);

        Group grpCurrentRawData = new Group(this, SWT.BORDER | SWT.SHADOW_ETCHED_IN);
        grpCurrentRawData.setText("Current Raw Data");
        grpCurrentRawData.setBounds(10, 91, 233, 251);

        Label lblNewLabel_1 = new Label(grpCurrentRawData, SWT.NONE);
        lblNewLabel_1.setBounds(86, 116, 70, 20);
        lblNewLabel_1.setText("New Label");

        Label lblGpsX = new Label(grpCurrentRawData, SWT.NONE);
        lblGpsX.setBounds(10, 64, 70, 20);
        lblGpsX.setText("GPS X");

        Label lblGpsY = new Label(grpCurrentRawData, SWT.NONE);
        lblGpsY.setBounds(10, 90, 70, 20);
        lblGpsY.setText("GPS Y");

        Label lblAltitude = new Label(grpCurrentRawData, SWT.NONE);
        lblAltitude.setBounds(10, 116, 70, 20);
        lblAltitude.setText("Altitude");

        Label lblNewLabel = new Label(grpCurrentRawData, SWT.NONE);
        lblNewLabel.setBounds(86, 64, 70, 20);
        lblNewLabel.setText("New Label");

        Label lblNewLabel_2 = new Label(grpCurrentRawData, SWT.NONE);
        lblNewLabel_2.setBounds(86, 90, 70, 20);
        lblNewLabel_2.setText("New Label");

        Group grpMisc = new Group(this, SWT.BORDER | SWT.SHADOW_ETCHED_IN);
        grpMisc.setText("Misc");
        grpMisc.setBounds(10, 357, 233, 143);

        Label label = new Label(grpMisc, SWT.NONE);
        label.setText("New Label");
        label.setBounds(109, 116, 70, 20);

        Label lblLocalTime = new Label(grpMisc, SWT.NONE);
        lblLocalTime.setText("Local time");
        lblLocalTime.setBounds(10, 64, 70, 20);

        Label lblFlightTime = new Label(grpMisc, SWT.NONE);
        lblFlightTime.setText("Flight time");
        lblFlightTime.setBounds(10, 90, 70, 20);

        Label lblSomethingElse = new Label(grpMisc, SWT.NONE);
        lblSomethingElse.setText("Something else");
        lblSomethingElse.setBounds(10, 116, 70, 20);

        Label label_4 = new Label(grpMisc, SWT.NONE);
        label_4.setText("New Label");
        label_4.setBounds(109, 64, 70, 20);

        Label label_5 = new Label(grpMisc, SWT.NONE);
        label_5.setText("New Label");
        label_5.setBounds(109, 90, 70, 20);

        Group grpBattery = new Group(this, SWT.BORDER | SWT.SHADOW_ETCHED_IN);
        grpBattery.setText("Battery");
        grpBattery.setBounds(10, 506, 233, 143);

        Label label_1 = new Label(grpBattery, SWT.NONE);
        label_1.setText("New Label");
        label_1.setBounds(109, 116, 70, 20);

        Label lblRemaining = new Label(grpBattery, SWT.NONE);
        lblRemaining.setText("% remaining");
        lblRemaining.setBounds(10, 64, 93, 20);

        Label lblDischargeRate = new Label(grpBattery, SWT.NONE);
        lblDischargeRate.setText("Discharge");
        lblDischargeRate.setBounds(10, 90, 70, 20);

        Label lblTimeRemaining = new Label(grpBattery, SWT.NONE);
        lblTimeRemaining.setText("Time remaining");
        lblTimeRemaining.setBounds(10, 116, 70, 20);

        Label label_7 = new Label(grpBattery, SWT.NONE);
        label_7.setText("New Label");
        label_7.setBounds(109, 64, 70, 20);

        Label label_8 = new Label(grpBattery, SWT.NONE);
        label_8.setText("New Label");
        label_8.setBounds(109, 90, 70, 20);

        Image drone_file = new Image(getDisplay(), "src/testGUI/images/drone.jpg");

        Label lblNewLabel_3 = new Label(this, SWT.NONE);
        lblNewLabel_3.setBounds(283, 91, 660, 266);
        formToolkit.adapt(lblNewLabel_3, true, true);
        lblNewLabel_3.setText("New Label");
        lblNewLabel_3.setImage(drone_file);

        Canvas canvasAltitude = new Canvas(this, SWT.NONE);
        canvasAltitude.setBounds(283, 395, 267, 183);
        formToolkit.adapt(canvasAltitude);
        formToolkit.paintBordersFor(canvasAltitude);

        CLabel labelBRTime = new CLabel(this, SWT.NONE);
        labelBRTime.setBounds(844, 664, 146, 26);
        formToolkit.adapt(labelBRTime);
        formToolkit.paintBordersFor(labelBRTime);
        labelBRTime.setText("No data");
    
    }

    @Override
    protected void checkSubclass() {
        // Disable the check that prevents subclassing of SWT components
    }
}

1 Ответ

0 голосов
/ 02 августа 2020

Вы не можете использовать циклы для обновления пользовательского интерфейса, потому что ваш код должен возвращаться к display.readAndDispatch l oop как можно быстрее. L oop остановит это, и пользовательский интерфейс перестанет отвечать.

Вместо этого вы должны использовать синхронизированные события. Вы делаете это, используя метод timerExec из Display:

public void timerExec(int milliseconds, Runnable runnable)

runnable запускается после задержки milliseconds миллисекунд.

Итак, чтобы обновить элемент управления с именем label через секунду вы можете использовать:

label.getDisplay().timerExec(1_000, () -> label.setText("Text afer a second"));

Обратите внимание, что runnable вызывается только один, если вы хотите периодически обновлять, вам нужно вызывать timerExec снова каждый раз, когда происходит событие.

...