Nano Hash - криптовалюты, майнинг, программирование

Получить нормальные границы JFrame при максимизации

Я пытаюсь создать JFrame, который запоминает положение своего окна, размер и было ли оно развернуто или нет. Должно быть достаточно просто использовать WindowListener для события windowClosing и сохранить его границы в Preferences.

Чтобы это работало (как указано ниже), мне нужно было бы извлечь нормальные границы JFrame (NORMAL ExtendedState), пока он развернут (MAXIMIZED_BOTH ExtendedState). Это вообще возможно? Учитывая, что нормальные границы где-то хранятся, чтобы вернуться обратно.

//...
addWindowListener(new WindowListener() {
    ///...
    @Override
    public void windowClosing(WindowEvent e) {
        prefs.putBoolean("win_max",win_max);
        if(winmax)
        {
            //win_x=?
            //win_y=?
            //win_w=?
            //win_h=?
        }
        else
        {
            win_x=getX();
            win_y=getY();
            win_w=getWidth();
            win_h=getHeight();
        }
        prefs.putInt("win_x",win_x);
        prefs.putInt("win_y",win_y);
        prefs.putInt("win_w",win_w);
        prefs.putInt("win_h",win_h);
    }
});
//...

Прошу прощения, если это действительно простой вопрос. Любая помощь приветствуется.


  • Просто сохраните и восстановите свойства extendedState и bounds (используя соответствующие геттеры/сеттеры) 31.01.2013

Ответы:


1

Вот что я сделал. Экземпляр модели сохранил исходную точку кадра, границы кадра и состояние кадра.

protected int           state;

protected Point         frameOrigin;

protected Rectangle     frameBounds;

Это прослушиватель компонентов, который я создал для захвата изменений данных кадра.

    frame.addComponentListener(new ComponentAdapter() {
        @Override
        public void componentMoved(ComponentEvent event) {
            if (isMaximized()) {
                model.setFrameOrigin(frame.getLocation());
            } else {
                model.setFrameBounds(frame.getBounds());
            }
            model.setFrameState(frame.getExtendedState());
        }
        @Override
        public void componentResized(ComponentEvent event) {
            model.setFrameState(frame.getExtendedState());
        }
    });

Это код, который мне пришлось выполнить после упаковки фрейма, чтобы установить фрейм в последнее использованное состояние.

    frame.pack();
    if (options.getFrameBounds().getWidth() > 0) {
        frame.setExtendedState(options.getState());
        if (isMaximized()) {
            frame.setLocation(options.getFrameOrigin());
        } else {
            frame.setBounds(options.getFrameBounds());
        }
    }
    model.setFrameState(frame.getExtendedState());
    model.setFrameBounds(frame.getBounds());
    model.setFrameOrigin(frame.getLocation());

А вот и метод isMaximized.

public boolean isMaximized() {
    return (frame.getExtendedState() & JFrame.MAXIMIZED_BOTH) 
            == JFrame.MAXIMIZED_BOTH;
}

Я сохранил данные кадра в файле свойств, но вы можете сохранять и восстанавливать данные кадра по своему усмотрению.

30.01.2013

2

Внутри вашего класса, производного от JFrame, добавьте следующий код...

private Rectangle m_normalBounds;

@Override
public void setExtendedState(int state)
{
   if (getExtendedState() == 0)
      m_bounds = getBounds();        // Capture the normal bounds since the state is changing

   super.setExtendedState(state);
}

private Rectangle getNormalBounds()  // Always returns the normal bounds
{
   Rectangle bounds;

   if (getExtendedState() == 0)
      return(getBounds());

   return(m_normalBounds);
}
06.02.2016
Новые материалы

Кластеризация: более глубокий взгляд
Кластеризация — это метод обучения без учителя, в котором мы пытаемся найти группы в наборе данных на основе некоторых известных или неизвестных свойств, которые могут существовать. Независимо от..

Как написать эффективное резюме
Предложения по дизайну и макету, чтобы представить себя профессионально Вам не позвонили на собеседование после того, как вы несколько раз подали заявку на работу своей мечты? У вас может..

Частный метод Python: улучшение инкапсуляции и безопасности
Введение Python — универсальный и мощный язык программирования, известный своей простотой и удобством использования. Одной из ключевых особенностей, отличающих Python от других языков, является..

Как я автоматизирую тестирование с помощью Jest
Шутка для победы, когда дело касается автоматизации тестирования Одной очень важной частью разработки программного обеспечения является автоматизация тестирования, поскольку она создает..

Работа с векторными символическими архитектурами, часть 4 (искусственный интеллект)
Hyperseed: неконтролируемое обучение с векторными символическими архитектурами (arXiv) Автор: Евгений Осипов , Сачин Кахавала , Диланта Хапутантри , Тимал Кемпития , Дасвин Де Сильва ,..

Понимание расстояния Вассерштейна: мощная метрика в машинном обучении
В обширной области машинного обучения часто возникает необходимость сравнивать и измерять различия между распределениями вероятностей. Традиционные метрики расстояния, такие как евклидово..

Обеспечение масштабируемости LLM: облачный анализ с помощью AWS Fargate и Copilot
В динамичной области искусственного интеллекта все большее распространение получают модели больших языков (LLM). Они жизненно важны для различных приложений, таких как интеллектуальные..