java - 设置 JFrame 位置的最佳实践

标签 java swing user-interface jframe

我有一个(有点哲学上的)问题与 Swing 或一般的 GUI 编程有关。是否有关于在何处定位应用程序中使用的 JFrame 实例的公认最佳实践?

  1. 第一个框架和主框架应该放在哪里?始终位于中心 (setLocationRelativeTo(null))?
  2. JFrame 应该放在哪里?相对于它的父级JFrame,在屏幕的中心,我们想要的任何地方?

我一直认为有一些最佳实践,有点像关于此的“GUI 圣经”,我错了吗,我应该(喘气)任意决定做什么吗?

最佳答案

这是一个包含以下建议的示例:

  1. 装满鳗鱼的气垫船 - set location by platform .

  2. Aardvocate Akintayo Olu - 序列化位置。

但继续添加 2 个调整:

  1. 同时序列化宽度/高度。
  2. 如果框架在关闭时最大化,它会在获取边界之前恢复。 (我讨厌应用程序。那些序列化选项但没有考虑到这一点。用户坐在那里单击“最大化/恢复”按钮并想知道为什么没有任何反应!)

这 4 点相结合可提供最佳用户体验!

import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
import java.util.Properties;
import java.io.*;

class RestoreMe {

    /** This will end up in the current directory
    A more sensible location is a sub-directory of user.home.
    (left as an exercise for the reader) */
    public static final String fileName = "options.prop";

    /** Store location & size of UI */
    public static void storeOptions(Frame f) throws Exception {
        File file = new File(fileName);
        Properties p = new Properties();
        // restore the frame from 'full screen' first!
        f.setExtendedState(Frame.NORMAL);
        Rectangle r = f.getBounds();
        int x = (int)r.getX();
        int y = (int)r.getY();
        int w = (int)r.getWidth();
        int h = (int)r.getHeight();

        p.setProperty("x", "" + x);
        p.setProperty("y", "" + y);
        p.setProperty("w", "" + w);
        p.setProperty("h", "" + h);

        BufferedWriter br = new BufferedWriter(new FileWriter(file));
        p.store(br, "Properties of the user frame");
    }

    /** Restore location & size of UI */
    public static void restoreOptions(Frame f) throws IOException {
        File file = new File(fileName);
        Properties p = new Properties();
        BufferedReader br = new BufferedReader(new FileReader(file));
        p.load(br);

        int x = Integer.parseInt(p.getProperty("x"));
        int y = Integer.parseInt(p.getProperty("y"));
        int w = Integer.parseInt(p.getProperty("w"));
        int h = Integer.parseInt(p.getProperty("h"));

        Rectangle r = new Rectangle(x,y,w,h);

        f.setBounds(r);
    }

    public static void main(String[] args) {
        final JFrame f = new JFrame("Good Location & Size");
        f.setDefaultCloseOperation(JFrame.DO_NOTHING_ON_CLOSE);
        f.addWindowListener( new WindowAdapter() {
            public void windowClosing(WindowEvent we) {
                try {
                    storeOptions(f);
                } catch(Exception e) {
                    e.printStackTrace();
                }
                System.exit(0);
            }
        });
        JTextArea ta = new JTextArea(20,50);
        f.add(ta);
        f.pack();

        File optionsFile = new File(fileName);
        if (optionsFile.exists()) {
            try {
                restoreOptions(f);
            } catch(IOException ioe) {
                ioe.printStackTrace();
            }
        } else {
            f.setLocationByPlatform(true);
        }
        f.setVisible(true);
    }
}

关于java - 设置 JFrame 位置的最佳实践,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7777640/

相关文章:

java.lang.ClassCastException : [Ljava. lang.String;与 java.lang.String 不兼容

java - 如何用for循环创建N个ActionListener?

java - 如何确保 JTextField 只包含字母?

html - 填充父框的所有可用高度

c++ - 将应用程序的主窗口 GUI 布局更改为代码

java - 从文本文件导入Java问题

java - 在 Java 中处理 HTTP 调用的大文件

html - 是否建议在使用 Bootstrap 时使用媒体查询

java - 尝试在空对象引用上调用虚拟方法 'android.view.Window$Callback android.view.Window.getCallback()'

java - 方法减慢执行 paintComponent()