Как отключить специальную кнопку управления окном JFrame в Java?

БА хочет окно, которое

  • есть кнопка закрытия
  • есть кнопка максимизировать
  • не имеет включенной кнопки свертывания

Он хочет, чтобы мы, разработчики Java, добились того же, что сделали ребята из C, а именно:

Учитывая требования к кнопкам управления окнами, кажется, другого выхода нет JFrame. Но как отключить кнопку сворачивания? Я рассмотрю возможность использования собственных методов, если это единственный способ (приложения устанавливаются на ПК с Windows).

Я могу сделать что-то подобное, но кнопка свертывания остается включенной - просто рамка снова появляется.

import javax.swing.*;
import java.awt.event.WindowAdapter;
import java.awt.event.WindowEvent;

public class NonMinimizableFrameDemo {

    public NonMinimizableFrameDemo() {
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        frame.setSize(300, 300);
        frame.setLocationRelativeTo(null);
        frame.addWindowListener(getWindowAdapter());
        frame.setVisible(true);
    }

    public static void main(String[] args) {
        SwingUtilities.invokeLater(NonMinimizableFrameDemo::new);
    }
    private final JFrame frame = new JFrame();

    private WindowAdapter getWindowAdapter() {
        return new WindowAdapter() {

            @Override
            public void windowIconified(WindowEvent we) {
                frame.setState(JFrame.NORMAL);
                JOptionPane.showMessageDialog(frame, "Cant Minimize");
            }
        };
    }
}

Вы можете использовать недекорированный JFrame со специальной строкой заголовка. Вы также можете переключиться с Java на более подходящий язык графического интерфейса Windows. За что клиент готов платить.

Gilbert Le Blanc 08.05.2024 12:39

@GilbertLeBlanc, можешь ли ты показать небольшую демонстрацию JFrame со специальной строкой заголовка?

Powet 08.05.2024 12:51

@GilbertLeBlanc о, вы имеете в виду отключение заголовка и замену его панелью с JButton. Извините, это не будет принято. Я имею в виду обычные, обычные кнопки управления окнами

Powet 08.05.2024 16:08

Вы можете рисовать фигуры на JPanel. Вы можете идентифицировать щелчки мышью в определенных местах JPanel. У Oracle есть полезное руководство Создание графического интерфейса с помощью Swing . Пропустите раздел «Обучение с использованием среды IDE NetBeans». Особое внимание обратите на раздел Выполнение индивидуальной росписи.

Gilbert Le Blanc 08.05.2024 17:32

Что такое «БА»? Избегайте бесполезных и нерелевантных сокращений.

Basil Bourque 09.05.2024 00:45

@BasilBourque Разве это не достаточно распространено, чтобы не требовать объяснений? Разве не все команды разработчиков имеют степени бакалавра (люди, которые переводят бизнес-требования в конкретные задачи для разработчиков)?

Powet 09.05.2024 12:59

Определите каждое сокращение при первом использовании. (Или ссылку на словарь/энциклопедию.)

Basil Bourque 09.05.2024 15:56
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
В компьютерном программировании биты играют важнейшую роль в представлении и манипулировании данными на двоичном уровне. Побитовые операции...
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Приходилось ли вам сталкиваться с требованиями, в которых вас могли попросить поднять тревогу или выдать ошибку, когда метод Java занимает больше...
Полный курс Java для разработчиков веб-сайтов и приложений
Полный курс Java для разработчиков веб-сайтов и приложений
Получите сертификат Java Web и Application Developer, используя наш курс.
1
8
76
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Минимизация отключена. Повторяющийся вопрос: Отключить кнопку сворачивания JFrame

package fenster;

import java.awt.event.WindowAdapter;
import java.awt.event.WindowEvent;
import javax.swing.JFrame;

public class Test
{
   public Test()
   {
      initComponents();
   }

   public static void main(String[] args)
   {
      javax.swing.SwingUtilities.invokeLater(new Runnable()
      {
         @Override
         public void run()
         {
            new Test();
         }
      });
   }

   private final JFrame frame = new JFrame();

   private void initComponents()
   {
      frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
      frame.addWindowListener(getWindowAdapter());
      frame.setSize(600, 400);
      frame.setVisible(true);
   }

   private WindowAdapter getWindowAdapter()
  {
      return new WindowAdapter()
      {

         @Override
         public void windowIconified(WindowEvent we)
         {
            frame.setState(JFrame.NORMAL);
         }
      };
   }
}

Спасибо. Я действительно подумал об этом и запустил небольшую демонстрацию с использованием специального оконного адаптера, такого как ваш. Проблема в том, что кнопка по-прежнему доступна для нажатия, а окно по-прежнему свернуто. Он просто сразу же всплывает обратно

Powet 09.05.2024 20:36

А как насчет другой идеи?

dragoness 13.05.2024 07:25
Ответ принят как подходящий

Сложный вариант — удалить декор JFrame и поместить внутрь JInternalFrame. С помощью прослушивателя вам необходимо максимизировать родительский JFrame, когда JInternalFrame развернут.

package fenster;

import java.awt.Toolkit;
import java.awt.event.MouseEvent;
import java.beans.PropertyChangeEvent;
import java.beans.PropertyChangeListener;
import java.util.EventObject;

import javax.swing.JFrame;
import javax.swing.JInternalFrame;
import javax.swing.UIManager;
import javax.swing.UnsupportedLookAndFeelException;
import javax.swing.event.InternalFrameAdapter;
import javax.swing.event.InternalFrameEvent;
import javax.swing.event.MouseInputAdapter;

public class Test
{
   public Test()
   {
      initComponents();
   }

   public static void main(String[] args)
   {
      javax.swing.SwingUtilities.invokeLater(new Runnable()
      {
         @Override
         public void run()
         {
            new Test();
         }
      });
   }

   private JFrame frame;

   private void initComponents()
   {
      try
      {
         
UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName());
      }
      catch (ClassNotFoundException | InstantiationException
        | IllegalAccessException | UnsupportedLookAndFeelException e)
      {
         // nothing
      }
  
      frame = new JFrame();
      frame.setUndecorated(true);
      frame.setResizable(true);
      frame.setSize(600, 400);
      frame.setLocationByPlatform(true);
      JInternalFrame iframe = new JInternalFrame();
      iframe.setResizable(true);
      iframe.setClosable(true);
      iframe.setMaximizable(true);
      iframe.setIconifiable(false);   
      iframe.setSize(600, 400);
      iframe.setDefaultCloseOperation(JFrame.DO_NOTHING_ON_CLOSE);
      iframe.addInternalFrameListener(getAdapter());
      iframe.addPropertyChangeListener(new MyPropertyChangeListener());
      iframe.addMouseMotionListener( new DragHandler() );
      frame.addMouseMotionListener( new DragHandler() );
      frame.add(iframe);
      iframe.setVisible(true);
      frame.setVisible(true);
   }

   private InternalFrameAdapter getAdapter()
   {
       return new InternalFrameAdapter()
       {
          @Override
          public void internalFrameClosing(InternalFrameEvent e)
          {
             System.exit(0);
          }
       };
    }

   private class MyPropertyChangeListener implements PropertyChangeListener
   {
      @Override
      public void propertyChange(PropertyChangeEvent evt)
      {
         dealWithEvent(evt);   
      }
   }

   private class DragHandler extends MouseInputAdapter
   {
       public void mouseDragged( MouseEvent evt )
       {
          dealWithEvent(evt);
       }
   }

   private void dealWithEvent (EventObject event)
   {      
      if (event instanceof PropertyChangeEvent)
      {
         PropertyChangeEvent e = (PropertyChangeEvent) event;
         if (e.getPropertyName().equalsIgnoreCase("maximum"))
         {
            if (Toolkit.getDefaultToolkit().getScreenSize().width == frame.getWidth())
            {
               frame.setExtendedState(JFrame.NORMAL);
            }
            else
            {
               frame.setExtendedState(JFrame.MAXIMIZED_BOTH);
            }
         }
      }
      else if (event instanceof MouseEvent && ((MouseEvent) event).getY() < 200)
      {
         MouseEvent e = (MouseEvent) event;
         int x = e.getX();
         int y = e.getY();
         int screenX = frame.getX();
         int screenY = frame.getY();
         screenX += x;
         screenY += y;
         frame.setLocation( screenX, screenY );
      }
      else if (event instanceof MouseEvent && ((MouseEvent) event).getY() > 200)
      {
         MouseEvent e = (MouseEvent) event;
         frame.setSize(e.getX(), e.getY());
      }  
   }
}

Спасибо! Хотя он не будет максимизироваться до размера экрана (только до размера его родителя)

Powet 14.05.2024 13:30

Вот почему с помощью слушателя я максимизирую родительский элемент, когда максимизируется внутренний фрейм.

dragoness 15.05.2024 18:32

Спасибо за ваш вклад. Вероятно, это лучший способ сделать что-то подобное в Swing.

Powet 16.05.2024 09:16

Другие вопросы по теме