9

私はかなり大きなスイングアプリケーションを持っていて、すべてのウィンドウ、jframes などのサイズを記憶させたいと思っています。

それを解決するためのより良いオプションがありますが、各ウィンドウの位置/サイズを [設定]に手動で書き込みますか? 列の順序を JTable に格納する便利な方法はありますか? 何らかのフレームワークでしょうか?定型文を書きたくないだけです。

残念ながら、大きなアプリ全体のシリアル化はオプションではありません。

4

5 に答える 5

8

いいえ、ありません。メイン JFrame の境界 (位置/サイズ) を記述することを忘れないでください。

また、ウィンドウの位置を復元した後、その位置が実際に表示されているデスクトップ領域にあるかどうかを確認することを忘れないでください。画面構成は、アプリケーションの実行間で変更される場合があります (たとえば、ユーザーがデスクトップ モニターからラップトップを切断した場合)。

于 2012-09-24T15:10:21.070 に答える
6

各ウィンドウの位置/サイズを に書き込むよりも良いオプションはありますPreferencesか?

いいえ、ありません。main の境界 (位置/サイズ) を書くことを忘れないでくださいJFrame。設定ファイルの代わりに XML ファイルにパラメーターを書き込むこともできますが、それは実装の詳細です。

に列の順序を保存する便利な方法はありますJTableか?

列の名前と位置を設定ファイルに書き込みます。

このタスクは一般的ですが、このタスクの実装は、GUI から何を保存したいかによって異なります。

これらの GUI パラメーターを保存する方法は、保存したいすべての境界とその他のパラメーターを含むモデル クラスを作成することです。これらのパラメーターを含む XML ファイルを読み取り、モデル クラスのフィールドに入力します。ファイルがない場合は、デフォルトを設定します。

GUI は、モデル クラスのフィールドを使用して GUI を構築します。ユーザーが GUI を変更すると、モデル クラスが新しい値で更新されます。

ユーザーが GUI を閉じたら、モデル クラスを XML ファイルに書き出します。

モデルの構造を確認しやすく、GUI が変更されたときに XML ファイルを変更しやすいので、私はプロパティ ファイルよりも XML ファイルを使用することを好みます。

于 2012-09-24T14:58:38.860 に答える
5

ここから始めます。次のコードは、最上位のコンテナーを見つけて、すべての子コンポーネントの境界を設定ファイルに保存し、復元に使用できるようにします。これはおそらくすべての状況を処理するわけではありませんが、私のアプリでは機能します。今後の変更はこちらで追跡できます。

public class WindowBoundsRestorer
{
    private final String filename;
    private Properties properties;

    public WindowBoundsRestorer( String filename )
    {
        this.filename = filename;
    }

    private void setBounds( String key, Component c )
    {
        key = key + c.getName();

        String position = properties.getProperty( key );
        if ( c.getName() != null && ! StringUtils.isBlank( position ) )
        {
            String[] nums = position.split( "," );
            c.setBounds( Integer.parseInt( nums[0] ), Integer.parseInt( nums[1] ),
                         Integer.parseInt( nums[2] ), Integer.parseInt( nums[3] ) );
        }

        if ( c instanceof Container )
        {
            key = key + "/";
            Container container = (Container) c;
            for ( Component child : container.getComponents() )
               setBounds( key, child );
        }
    }

    /**
     * Loads the properties from the .xml file and sets all named windows with a matching
     * name.
     *
     * @param component Any component in the Swing app.  The top-most container will be
     * determined from this component.
     */
    public void restore( Component component )
    {
        properties = new Properties();
        InputStream is = null;
        try
        {
            is = new FileInputStream( filename );
            properties.loadFromXML( is );
        }
        catch ( IOException e )
        {
            e.printStackTrace();
            return;
        }
        finally
        {
            IOUtils.closeQuietly( is );
        }

        Component top = component;
        while ( top.getParent() != null )
            top = top.getParent();

        setBounds( "", top );
    }

    private void getBounds( String key, Component c )
    {
        key = key + c.getName();
        String position = String.format( "%d,%d,%d,%d", c.getX(), c.getY(), c.getWidth(), c.getHeight() );
        properties.setProperty( key, position );
        if ( c instanceof Container )
        {
            key = key + "/";
            Container container = (Container) c;
            for ( Component child : container.getComponents() )
                getBounds( key, child );
        }
    }

    public void save( Component component )
    {
        Component top = component;
        while ( top.getParent() != null )
            top = top.getParent();

        properties = new Properties();
        getBounds( "", top );

        OutputStream os = null;
        try
        {
            os = new FileOutputStream( filename );
            properties.storeToXML( os, "Browser" );
        }
        catch ( IOException e )
        {
            e.printStackTrace();
        }
        finally
        {
            IOUtils.closeQuietly( os );
        }
    }
}
于 2014-08-24T18:59:03.480 に答える
3

次の呼び出しで覚えておきたいこと (ウィンドウの位置など) をファイルに書き込み、起動時にそのファイルを読み取ります。ディスクに永続化する必要があり、本当に保存したいものは誰にもわかりません(おそらく時間に敏感なデータではありません)。時間に敏感なデータも保存しない限り、「自動」ソリューションは機能しません。

削除されたレコードが表示された状態でアプリケーションを復元しますか? おそらくそうではありません。

于 2012-09-24T15:08:15.710 に答える
3

私はいつもこれに使用java.util.Preferencesしてきましたが、javax.jnlp.PersistenceService「制限された実行環境で実行されているアプリケーションでも」機能します。

于 2012-09-24T18:40:15.307 に答える