Как заставить слушателей вызывать свои действия на одной конкретной модели (MVC Pattern) - PullRequest
0 голосов
/ 15 июня 2019

У меня проблема с программой, для которой я хочу создать пользовательский интерфейс. У него есть одна «модель», а точнее HDR-конвертер с определенным интерфейсом. Я должен прочитать несколько переменных с помощью Swing, а затем нужно передать их все в конвертер для преобразования изображения. Я могу читать переменные и уже запрограммировал некоторые специальные слушатели и JPanels для пользовательского интерфейса. Проблема, с которой я столкнулся, заключается в том, как я могу получить всю информацию из разных возможностей ввода в одном месте, чтобы представить ее модели.

public class MainFrame extends javax.swing.JFrame {

    private static final long serialVersionUID = 8971599546866585146L;
    JButton loadDir = new JButton("LOAD DIR");
    JButton runHDrize = new JButton("RUN Converter");
    JButton saveHDR = new JButton("SAVE HDR");
    JScrollBar inputScroller = new JScrollBar(JScrollBar.HORIZONTAL);
    JPanel curve = initCurve();
    JPanel mapping = initMapping();
    JPanel lambda = initLambda();
    JPanel samples = initSamples();

    public MainFrame() {
        this.setLayout(new GridBagLayout());
        this.setSize(800, 700);
        this.setResizable(false);
        initFrame();
        setDefaultCloseOperation(EXIT_ON_CLOSE);
    }

    public void initFrame() {
        GridBagConstraints gbc = new GridBagConstraints();

        gbc.gridx = 0;
        gbc.gridy = 1;
        gbc.gridwidth = 1;
        add(inputScroller, gbc);

        gbc.gridx = 3;
        gbc.gridy = 1;
        add(saveHDR, gbc);
        saveHDR.addActionListener(new OutputDialogListener(null));  //TODO Get image

        gbc.gridx = 0;
        gbc.gridy = 2;
        add(curve, gbc);

        gbc.gridx = 1;
        gbc.gridy = 2;
        gbc.gridwidth = 2;
        add(samples, gbc);
        samples.setVisible(true);

        gbc.gridwidth = 1;
        gbc.gridx = 3;
        gbc.gridy = 2;
        add(lambda, gbc);
        lambda.setVisible(true);

        gbc.gridx = 0;
        gbc.gridy = 3;
        add(mapping, gbc);

        gbc.gridx = 1;
        gbc.gridy = 3;
        add(loadDir, gbc);
        loadDir.addActionListener(new InputDialogListener());

        gbc.gridx = 3;
        gbc.gridy = 3;
        add(runHDrize, gbc);
    }

    private JPanel initCurve() {
        Code to initialize a JCombobox to choose which camera curve to use
    }

    private JPanel initMapping() {
        Code to initialize a JCombobox with a description field over it to select the mapping used for conversion from HDR to RGB
    }

    private JPanel initLambda() {
        Code to initialize a field turning red when an invalid value is entered

    }

    private JPanel initSamples() {
        Code to initialize a slider with field showing current value above
    }
}

Проблема, которую я хочу решить, состоит в том, как я могу получить все значения, когда «Run Converter» будет передан в модель, чтобы он мог преобразовать ее.

Я думал о программировании слушателя в «Run Converter», но не совсем знаю, как получить все данные. Должен ли я реализовать класс «Controller», который передается всем слушателям и сохраняет все данные, чтобы пользовательский интерфейс и «Run Converter» могли получить к нему доступ и прочитать его?
Или есть более элегантная версия, чем просто ссылка на всех слушателей?

Заранее спасибо за помощь! Если вам нужно больше моего кода или больше информации, просто спросите.

Редактировать: я не был уверен, стоит ли мне публиковать какой-то код, поэтому я просто опубликовал некоторые части своего основного класса GUI

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...