Почему мой код настроек Java работает не на всех компьютерах?

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

Расположение кадра не сохраняется, оно всегда будет отображаться в левом верхнем углу экрана.

Это мой первый раз, когда я использую настройки, я несколько раз просматривал API и, кажется, не вижу, что я делаю неправильно. Может кто-нибудь объяснить, почему это работает только на моем компьютере?

Настройки предпочтений находятся внизу класса.

SSCCE:

public class PreferencesTest implements ActionListener {
private JButton wrongButton, level1Button, level2Button, level3Button,
        level4Button, level5Button, dontInterruptButton, reviewCardButton;
private JLabel frontTextLabel, reverseTextLabel, frontLabel;
private JPanel frontOfCardPanel, reverseOfCardPanel, buttonPanel,
        reverseButtonPanel, reverseTextPanel, frontLabelPanel;
private JFrame frame;
private String windowTitle;
private int windowX;
private int windowY;
private Preferences preferences = null;

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


public PreferencesTest() {

    this.windowX = getPreferences().getInt("window_x", -1);
    this.windowY = getPreferences().getInt("window_y", -1);

    frame = new JFrame();
    frontOfCardPanel = new JPanel(new BorderLayout());
    reverseOfCardPanel = new JPanel(new BorderLayout());

    wrongButton = new JButton("Wrong");
    level1Button = new JButton("Almost");
    level2Button = new JButton("OK");
    level3Button = new JButton("Good");
    level4Button = new JButton("Great");
    level5Button = new JButton("Excellent");
    dontInterruptButton = new JButton("Don't interrupt this program");
    reviewCardButton = new JButton("Review");

    frontTextLabel = new JLabel("test", JLabel.CENTER);
    reverseTextLabel = new JLabel("test", JLabel.CENTER);
    frontLabel = new JLabel("test", JLabel.CENTER);

    frontTextLabel.setFont(new Font("Serif", Font.PLAIN, 20));
    frontLabel.setFont(new Font("Serif", Font.PLAIN, 40));
    reverseTextLabel.setFont(new Font("Serif", Font.PLAIN, 40));

    buttonPanel = new JPanel(new FlowLayout());
    reverseButtonPanel = new JPanel(new FlowLayout());
    reverseTextPanel = new JPanel(new GridLayout(2, 1));

    reverseButtonPanel.add(wrongButton);
    reverseButtonPanel.add(level1Button);
    reverseButtonPanel.add(level2Button);
    reverseButtonPanel.add(level3Button);
    reverseButtonPanel.add(level4Button);
    reverseButtonPanel.add(level5Button);

    frontLabelPanel = new JPanel();
    frontLabelPanel.add(frontLabel);

    frontOfCardPanel.add(buttonPanel, BorderLayout.SOUTH);
    frontOfCardPanel.add(frontLabelPanel, BorderLayout.NORTH);

    frame.pack();
    frame.setContentPane(frontOfCardPanel);

    reverseTextPanel.add(reverseTextLabel);
    reverseTextPanel.add(frontTextLabel);

    buttonPanel.add(reviewCardButton);
    buttonPanel.add(dontInterruptButton);

    reverseOfCardPanel.add(reverseTextPanel, BorderLayout.CENTER);
    reverseOfCardPanel.add(reverseButtonPanel, BorderLayout.SOUTH);

    wrongButton.addActionListener(this);
    level1Button.addActionListener(this);
    level2Button.addActionListener(this);
    level3Button.addActionListener(this);
    level4Button.addActionListener(this);
    level5Button.addActionListener(this);
    dontInterruptButton.addActionListener(this);
    reviewCardButton.addActionListener(this);

    frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);


    frame.setSize(500, 220);
    frame.setResizable(false);

    frame.toFront();
    frame.repaint();

    frame.addWindowListener(new java.awt.event.WindowAdapter() {
        public void windowClosing(java.awt.event.WindowEvent e) {
            setWindowXY();

            frame.setVisible(false);
        }
    });

    frame.setLocation(windowX, windowY);
    frame.setVisible(true);

}

@Override
public void actionPerformed(ActionEvent event) {
    if (event.getActionCommand() == "Review") {
        frame.remove(frontOfCardPanel);
        frame.setContentPane(reverseOfCardPanel);
        frame.validate();
        frame.repaint();
    } else if (event.getActionCommand() == "Wrong") {
        setWindowXY();
        System.exit(1);
        flashcardAction(0);
    } else if (event.getActionCommand() == "Almost") {
        setWindowXY();
        System.exit(1);
        flashcardAction(1);
    } else if (event.getActionCommand() == "OK") {
        setWindowXY();
        System.exit(1);
        flashcardAction(2);
    } else if (event.getActionCommand() == "Good") {
        setWindowXY();
        System.exit(1);
        flashcardAction(3);
    } else if (event.getActionCommand() == "Great") {
        setWindowXY();
        System.exit(1);
        flashcardAction(4);
    } else if (event.getActionCommand() == "Excellent") {
        setWindowXY();
        System.exit(1);
        flashcardAction(5);
    } else if (event.getActionCommand() == "Don't interrupt this program") {
        System.exit(1);
        System.out.println(" window title in event = " + windowTitle);
        frame.setVisible(false);
    }
}

public void flashcardAction(int userResponse) {
    System.out.println(frame.getLocationOnScreen());
    setVisible(false);
}



public void setVisible(Boolean visible) {

    frame.setVisible(visible);
}

// ////// preferences

public Preferences getPreferences() {
    if (preferences == null) {
        preferences = Preferences
                .systemNodeForPackage(PreferencesTest.class);
    }
    return preferences;
}

public int getWindowX() {
    return windowX;
}

public int getWindowY() {
    return windowY;
}

public void setWindowXY() {
    windowX = frame.getX();
    getPreferences().putInt("window_x", windowX);

    windowY = frame.getY();
    getPreferences().putInt("window_y", windowY);
}
}

РЕДАКТИРОВАТЬ: я не объяснил, что не так с его поведением.


person rød ræv    schedule 04.03.2013    source источник
comment
Так что ошибка на 3 других компьютерах? У них установлена ​​JRE   -  person cowls    schedule 04.03.2013
comment
Определить не работает. Нам нужно поведение, трассировка стека... что-то в этом роде.   -  person pcalcao    schedule 04.03.2013
comment
Проблема в том, что он не сохраняет местоположение, рамка появится в верхнем левом углу, а не там, где она была в последний раз. Извиняюсь за то, что не сделал это ясно.   -  person rød ræv    schedule 04.03.2013


Ответы (1)


Вы используете systemNodeForPackage. Это вернет системные настройки, а не пользовательские настройки.

Причина, по которой он работает в одной системе, вероятно, заключается в том, что вы запускаете его там как пользователь-администратор (я предполагаю, что вы используете WinXP или что-то в этом роде, где обычно работает пользователь-администратор). Пользователь с правами администратора может без проблем писать в дерево настроек системы.

В других, более зрелых операционных системах запись на системный узел невозможна без повышенного доступа. Правильным подходом было бы использование вместо этого узла пользователя (метод userNodeForPackage).

Java имеет два отдельных корня предпочтений: один для системы и один для пользователя. Используйте правильный в зависимости от вашей ситуации. Положение окна явно является предпочтением пользователя.

См. https://blogs.oracle.com/CoreJavaTechTips/entry/the_preferences_api.

person Joeri Hendrickx    schedule 04.03.2013