Создание внеэкранного кадра в Java (или: как избежать пустого меню на Mac, когда все окна приложения закрываются)?

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

Любой пользователь Mac знает, что строка меню должна быть в главном меню окна. Установка apple.laf.useScreenMenuBar кому: true в списке свойств файл избавляется от панелей в кадровом меню и перемещает строку меню текущего сфокусированного окна к меню окна.

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

Однако я получал загрузки проблем. Я, может казаться, не перемещаю окно от экрана, потому что Mac не позволят Вам установить координаты на что-то мимо размера экрана; это просто отключает его и располагает его в край вместо этого. Есть ли что-то еще, что я должен сделать для создания внеэкранного окна?

6
задан Arjan 3 February 2010 в 07:29
поделиться

4 ответа

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

Вы можете использовать одну и ту же соль для каждого пользователя вместе с хорошей идеей Юрая, чтобы объединить пароль с другими неизменяемыми полями базы данных (уникальными для пользователя). Но берегись, потому что эта информация привязывается к паролю. Если бы вы хэшировали имя пользователя + пароль вместе, чтобы гарантировать уникальный хэш, вы бы не смогли изменить имя пользователя, не создав нового пользователя и не потребовав от него установить новый пароль.

В качестве примера уникальной соли для каждого пользователя и сохранения ее вместе с хэшем пароля, я отмечу /etc/shadow в типичной системе Linux.

root@linux:/root# cat /etc/shadow | grep root
root:$1$oL5TTZxL$RhfGUZSbFwQN6jnX5D.Ck/:12139:0:99999:7:::

Здесь oL5TTZxL является солью, а RhfGUZSbFwQN6jnX5D.Ck/ является хэшем. Пароль обычного текста корень в этом случае, и алгоритм хеширования, который использует моя система, является алгоритмом пароля основанного на MD5 BSD. (более новые системы, чем мои, имеют лучшие алгоритмы хеширования)

-121--1010303-

Возможно, mathJAX является билетом. Он построен на jsMath , 2004 винтажной библиотеке JavaScript.

С 5 февраля 2015 я переключился бы, чтобы рекомендовать KaTeX - большая часть производительной ЛАТЕКСНОЙ библиотеки JavaScript из Академии Хана.

-121--658246-

Вы определенно должны рассмотреть очень полезный ответ WizardOfOds. Использование "Меню приложения" поможет правильно настроить минимальный Info.plist для начала работы. Постоянное меню File позволит приложению открыть новое окно при закрытии других окон. Этот ответ ссылается на простой пример .

Несмотря на то, что Human Interface Guidelines компании Apple являются отличным руководством к тому, что будут ожидать ваши пользователи, вы, безусловно, можете поэкспериментировать с подходом, который вы предложили в своем вопросе. В частности, можно попробовать setLocation (Short.MIN_VALUE, Short.MIN_VALUE) в невидимом окне. Кроме того, может потребоваться ответить на событие WindowEvent каким-либо особым образом, если оно сигнализирует о закрытии последнего видимого окна.

Добавление: Когда прослушиватель увидит последнее видимое окно, создайте новое пустое окно приложения. Либо переместите невидимое окно на экран и сделайте его видимым до тех пор, пока пользователь не решит, как действовать дальше.

Добавление: Mac OS X помогает предотвратить перемещение видимой формы окна с экрана, но легко поместить невидимое окно в подвешенное состояние, как показано ниже.

import java.awt.BorderLayout;
import java.awt.EventQueue;
import java.awt.event.ItemEvent;
import java.awt.event.ItemListener;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.JToggleButton;

public class FrameTest extends JFrame {

    private static FrameTest marco;
    private static FrameTest polo;

    private static class MyPanel extends JPanel {

        public MyPanel() {
            super(true);
            final JToggleButton b = new JToggleButton("Test");
            b.addItemListener(new ItemListener() {
                @Override
                public void itemStateChanged(ItemEvent e) {
                    if (b.isSelected()) {
                        polo.setLocation(100, 100);
                        polo.setVisible(true);
                    }
                    else {
                        polo.setVisible(false);
                        polo.setLocation(Short.MIN_VALUE, Short.MIN_VALUE);
                    }
                }
            });
            this.add(b);
        }
    }

    public FrameTest(String title) {
        super(title);
        this.setLayout(new BorderLayout());
        this.add(new MyPanel());
        this.pack();
        this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    }

    public static void main(final String[] args) {

        EventQueue.invokeLater(new Runnable() {
            @Override
            public void run() {
                marco = new FrameTest("Marco");
                marco.setLocationRelativeTo(null);
                marco.setVisible(true);
                polo = new FrameTest("Polo");
                polo.setLocation(Short.MIN_VALUE, Short.MIN_VALUE);
            }
        });
    }
}
4
ответ дан 17 December 2019 в 04:46
поделиться

Я верю, что вы хотите что-то такое:

public partial class Sample: UserControl
{
    public event EventHandler TextboxValidated;

    public Sample()
    {
        InitializeComponent();
    }


    private void TextBox_Validated(object sender, EventArgs e)
    {
        // invoke UserControl event here
        if (this.TextboxValidated != null) this.TextboxValidated(sender, e);
    }
}

И затем на вашей форме:

public partial class MainForm : Form
{
    private Sample sampleUserControl = new Sample();

    public MainForm()
    {
        this.InitializeComponent();
        sampleUserControl.TextboxValidated += new EventHandler(this.CustomEvent_Handler);
    }
    private void CustomEvent_Handler(object sender, EventArgs e)
    {
        // do stuff
    }
}
-121--1642055-
>>> [m.groupdict() for m in re.finditer('(?P<b>.b.)|(?P<i>.i.)', 'abcdefghijk')]
[{'i': None, 'b': 'abc'}, {'i': 'hij', 'b': None}]

Кажется, работает хорошо, хотя если у вас есть много групп, проверяющих, какая из них не Нет может стать утомительным.

При этом будут найдены все .b. и все .i. соответствует в последовательности. Если вы хотите быть уверены, что он нашел один из каждого вы должны будете проверить это вручную, тоже.

-121--4518441-

Не прямое решение, но я думаю, что некоторые создают окно размером 1 пиксел. Это приводит к жалобам, как описано в Super User: Хаотичное поведение мертвого пикселя на моем iMac 24 "...

0
ответ дан 17 December 2019 в 04:46
поделиться

Во-первых, примечание: ваш вопрос на самом деле выглядит так: «Как сделать меню« Окно »в соответствии с рекомендациями Apple Human Interface Guidelines», а не «создание закадрового кадра в Java», что кажется чудовищным взломом.

Я предлагаю проверить Apple « Интеграция Mac OS X для Java », которая в разделе « Меню окна » явно показывает, что именно вы пытаетесь достичь:

Рекомендации Apple Human Interface Guidelines предполагают, что все приложения Mac OS X должны иметь меню «Окно» для отслеживания всех открытых в данный момент окон. Меню «Окно» должно содержать список окон с галочкой рядом с активным окном.

0
ответ дан 17 December 2019 в 04:46
поделиться

Это комментарий к ответу trashgod. Он слишком большой, поэтому мне нужно переместить его сюда>. <


Еще проблемы!

Я получаю 2 ошибки:

строка 23: метод itemStateChanged (ItemEvent) типа new ItemListener () {} должен переопределять метод суперкласса

строка 50: метод run () типа new Runnable () {} должен переопределить метод суперкласса

Любая помощь? Я никогда раньше с этим не сталкивался. Я не знаю, что это значит.

РЕДАКТИРОВАТЬ: У меня еще проблемы! Мне нужно, чтобы окно за кадром было видимым, пока оно находится за кадром, чтобы оно создавало меню для перехода к строке меню экрана. Когда я использую код

offScreen = new JFrame("WTF?!  You can see me?");
offScreen.setSize(400,300);
offScreen.setLocation(0, java.awt.Toolkit.getDefaultToolkit().getScreenSize().height+50);
System.out.println(offScreen.getLocation());
offScreen.setVisible(true);
System.out.println(offScreen.getLocation());

, я получаю вывод:

java.awt.Point[x=0,y=1100]
java.awt.Point[x=0,y=961]

Он перемещает его обратно, когда он снова становится видимым!

Я искал целую вечность и ничего не нашел.

0
ответ дан 17 December 2019 в 04:46
поделиться
Другие вопросы по тегам:

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