Как изменить размер кадра, из другого класса - PullRequest
0 голосов
/ 30 декабря 2018

Я создаю генератор лабиринта, который случайным образом генерирует лабиринт, учитывая, сколько строк / столбцов хочет пользователь.Я могу добиться этого только путем создания нового JFrame каждый раз, когда создаю лабиринт, а не меняю существующий фрейм.

Я попытался создать JFrame в главном, а затем использовать его для изменения размера, я попытался сделать его общедоступным и изменить его внутри кнопки.

Frame ()класс

public class Frame extends JFrame {
    private VariableDetails vDetails;
    private MazeArea mArea;

    private int width;
    private int height;

    public Frame(String title) {
        super(title);
        setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        setVisible(true);

        width = 500;
        height = 500;
        setSize(width,height);

        setLayout(new BorderLayout());

        mArea = new MazeArea();
        vDetails = new VariableDetails();

        Container c = getContentPane();

        c.add(mArea, BorderLayout.CENTER);
        c.add(vDetails, BorderLayout.EAST);
    }

    public void setSize2(int width, int height) {
        setSize(width,height);
    }

VariableDetails () класс

public class VariableDetails extends JPanel {
    public VariableDetails() {
        JButton genBtn = new JButton("Generate");
        genBtn.addActionListener(new ActionListener() {
        public void actionPerformed(ActionEvent e)
        {
            setSize2(UserInputWidth,UserInputHeight);
        }
});
}

В VariableDetails() У меня есть 2 JTextFields, который фиксирует ввод пользователя для высоты и ширины лабиринта.

Ответы [ 2 ]

0 голосов
/ 31 декабря 2018

Model-View-Controller , или более простой уровень, Передача информации в метод или конструктор и шаблон наблюдателя - это те концепции, которые вам нужныучиться и понимать.

По сути, ваше «представление» является визуальным представлением вашей «модели».«Представление» «наблюдает» за «моделью» изменений и обновляет себя соответственно.

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

Начните с определения модели ...

public class MazeModel {

    private List<ChangeListener> listeners = new ArrayList<>(25);

    private int rows;
    private int cols;

    public void setSize(int cols, int rows) {
        this.cols = cols;
        this.rows = rows;

        fireStateChanged();
    }

    public int getRows() {
        return rows;
    }

    public int getCols() {
        return cols;
    }

    public void addChangeListener(ChangeListener listener) {
        listeners.add(listener);
    }

    public void removeChangeListener(ChangeListener listener) {
        listeners.remove(listener);
    }

    protected void fireStateChanged() {
        ChangeEvent evt = new ChangeEvent(this);
        for (ChangeListener listener : listeners) {
            listener.stateChanged(evt);
        }
    }
}

Лично я бы предпочел начать с interface для определения договора, но для краткости.Модель должна содержать данные и логику, необходимые для управления лабиринтом.

Затем обновите ваши классы, чтобы экземпляр MazeModel можно было передать в ...

public class Frame extends JFrame {

    private VariableDetails vDetails;
    private MazeArea mArea;

    private int width;
    private int height;

    private MazeModel model;

    public Frame(String title, MazeModel model) {
        super(title);
        setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

        this.model = model;
        this.model.addChangeListener(new ChangeListener() {
            @Override
            public void stateChanged(ChangeEvent e) {
                // Update the state as required...
            }
        });

        width = 500;
        height = 500;
        // Prefer pack :/
        setSize(width, height);

        setLayout(new BorderLayout());

        // I'm guessing that model should be passed to this
        // and it should modify it's state accoridingly....
        mArea = new MazeArea();
        vDetails = new VariableDetails(model);

        Container c = getContentPane();

        c.add(mArea, BorderLayout.CENTER);
        c.add(vDetails, BorderLayout.EAST);
        setVisible(true);
    }

    public class VariableDetails extends JPanel {

        private MazeModel model;

        public VariableDetails(MazeModel model) {
            this.model = model;
            JButton genBtn = new JButton("Generate");
            genBtn.addActionListener(new ActionListener() {
                public void actionPerformed(ActionEvent e) {
                    model.setSize(cols, rows);
                }
            });
        }
    }
}

Теперь это дает классам независимый канал связи через ChangeListener, который гарантирует, что они остаются разъединенными.

Примечание об изменении размера окна

Я бы не стал.Вместо этого я передаю модель экземпляру MazeArea, чтобы он мог наблюдать за изменениями в модели и соответствующим образом обновлять себя.Затем я бы обернул MazeArea в JScrollPane, что позволило бы ему изменить размер на что угодно, и рамка могла бы остаться с относительным статическим размером.

См. Как использовать панели прокрутки для получения более подробной информации

Как пользователь, я бы без конца разозлился, если бы я сам установил размер окна, а вы пришли и изменили его

0 голосов
/ 31 декабря 2018

Если вы правильно поняли, что вы хотите сделать, это изменить размер кадра с панели.Для этого вам нужен объект Frame, размер которого вы хотите изменить в своем классе Panel.Вы можете достичь этого с помощью шаблона синглтона.Вы также можете сделать метод setSize2 статическим и вызвать его так: Frame.setSize(UserInputWidth,UserInputHeight)

Я переписал ваш код, используя шаблон синглтона.Надеюсь, это поможет.

public class Frame extends JFrame {
private VariableDetails vDetails;
private MazeArea mArea;

private int width;
private int height;
private static Frame instance;

public static Frame getInstance() {
  if(instance==null) {
    instance=new Frame();
  }
  return instance;
}

public Frame(String title) {
    super(title);
    setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    setVisible(true);

    width = 500;
    height = 500;
    setSize(width,height);

    setLayout(new BorderLayout());

    mArea = new MazeArea();
    vDetails = new VariableDetails();

    Container c = getContentPane();

    c.add(mArea, BorderLayout.CENTER);
    c.add(vDetails, BorderLayout.EAST);
}


public class VariableDetails extends JPanel {
    public VariableDetails() {
        JButton genBtn = new JButton("Generate");
        genBtn.addActionListener(new ActionListener() {
        public void actionPerformed(ActionEvent e)
        {
            Frame.getInstance().setSize(width,height);
        }
        });
    }
}
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...