Swing на OSX: Как Захватить команду-Q?

Будучи убежденным ("обученный"), что приложения Swing на Mac действительно выглядят собственными, я пытаюсь сделать мой взглядом максимально собственный. Все выглядит большим, но когда я поразил command+Q или делаю это из меню, моего windowStateChanged(WindowEvent e) не стреляет в мой основной JFrame (если я выхожу каким-либо другим способом, он действительно стреляет). Как я могу ответить на реальный выход Apple?

23
задан Community 23 May 2017 в 12:09
поделиться

3 ответа

Вы можете реализовать COM.apple.eawt.Appliclistener и отвечать на событие Quit . Пример можно найти пример Mac OS X Reference Library osxAdapter .

Дополнение: см. Java для Mac OS X 10.6 Обновление 3 и 10.5 Обновление 8 Отзыв Примечания Для информации о снижении, переработанные COM.apple.awt.Apt.Application Класс, а также Расположение Документации API для расширений Apple Java. Control-Click или щелкните правой кнопкой мыши на файле .jdk на Содержание пакета . Вы можете просматривать классы com.apple.eawt среди источников OpenJDK.

Как показано в этом разделе пример , вы можете указать желаемое QuitStrategy ; A WindowListener ответит на ⌘Q :

Application.getApplication().setQuitStrategy(QuitStrategy.CLOSE_ALL_WINDOWS);

Как отмечено здесь , вы можете установить свойство из командной строки

java -Dapple.eawt.quitStrategy=CLOSE_ALL_WINDOWS -cp build/classes gui.QuitStrategyTest

или в начале программы Перед публикацией каких-либо мероприятий GUI:

System.setProperty("apple.eawt.quitStrategy", "CLOSE_ALL_WINDOWS");
EventQueue.invokeLater(new QuitStrategyTest()::display);

image

Console, после ⌘Q :

java.vendor: Oracle Corporation
java.version: 1.8.0_60
os.name: Mac OS X
os.version: 10.11
apple.eawt.quitStrategy: CLOSE_ALL_WINDOWS
java.awt.event.WindowEvent[WINDOW_CLOSING,opposite=null,oldState=0,newState=0] on frame0

код:

package gui;

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

/**
 * @see https://stackoverflow.com/a/7457102/230513
 */
public class QuitStrategyTest {

    private void display() {
        JFrame f = new JFrame("QuitStrategyTest");
        f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        f.addWindowListener(new WindowAdapter() {

            @Override
            public void windowClosing(WindowEvent e) {
                System.out.println(e);
            }
        });
        f.add(new JTextArea(getInfo()));
        f.pack();
        f.setLocationRelativeTo(null);
        f.setVisible(true);
    }

    private String getInfo() {
        String[] props = {
            "java.vendor",
            "java.version",
            "os.name",
            "os.version",
            "apple.eawt.quitStrategy"
        };
        StringBuilder sb = new StringBuilder();
        for (String prop : props) {
            sb.append(prop);
            sb.append(": ");
            sb.append(System.getProperty(prop));
            sb.append(System.getProperty("line.separator"));
        }
        System.out.print(sb);
        return sb.toString();
    }

    public static void main(String[] args) {
        System.setProperty("apple.eawt.quitStrategy", "CLOSE_ALL_WINDOWS");
        EventQueue.invokeLater(new QuitStrategyTest()::display);
    }
}
15
ответ дан 29 November 2019 в 02:30
поделиться

Это довольно хороший вопрос, и я должен признать, что у меня нет ответа . Однако, пару лет назад, когда я работал над Java-приложением и столкнулся с этой проблемой, я решил ее, зарегистрировав крючок выключения с временем выполнения, который бы делал то, что я хотел, чтобы приложение делало перед выходом. Это тяжелое решение, но оно сработало. Вы можете взглянуть на мой код и посмотреть, поможет ли он.

4
ответ дан 29 November 2019 в 02:30
поделиться

Я не слышал об использовании LCG для генерации фиксированного веса удара (я не получил этого глубоко в коды удара в школе, поэтому я тоже не слишком удивлен:).

В любом случае достаточно просто генерировать кучу битов с фиксированным ударным весом. Вот немного кода питона, который возвращает n -разрядное число с определенным весом. Это должно легко переводиться и на другие языки (помимо того, что питоновые целые числа произвольно велики).

from random import randrange

def get_ham_and_bits(weight, nbits=32):
    "Get n-bits with a fixed hamming weight"
    if weight > nbits: 
        return 1 < nbits

    result = 0
    for i in xrange(weight):
        bit = 1 << randrange(nbits)

        # only flip bits that aren't already flipped. delete the loop to
        # make this return a random weight instead of a fixed weight
        while bit & result != 0: 
            bit = 1 << randrange(nbits)

        # An XOR might be a better idea here, especially if you remove the loop.
        result |= bit
    return result
-121--4529253-

По источникам , scipy.io.wavfile.read (somfile) возвращает кортеж из двух предметов: первый - частота дискретизации в выборках в секунду, второй - массив numpy со всеми данными, считанными из файла. Выглядит довольно легко в использовании!

eg:

from scipy.io import wavfile
fs, data = wavfile.read('./output/audio.wav')
-121--870558-

Пробовали ли вы установить в меню команду - Q в качестве акселератора? Можете ли вы заставить ваше приложение ответить на него?

Я не положительный, но я думаю, что это работает в Linux и, вероятно, Windows с эквивалентным Alt - F4 . Мое приложение отвечает на «убойный» нажатие клавиши, я обрабатываю некоторый код очистки, а затем делаю программный System.exit () .

Если вы «просто» после изящной обработки выхода, вы можете также захотеть поймать WindowEvent WINDOW _ CLOSING , где традиционно «вы уверены?» все делается.

3
ответ дан 29 November 2019 в 02:30
поделиться
Другие вопросы по тегам:

Похожие вопросы: