4

jframeを使用してヘルプ コンテンツを表示するためのパブリック クラスAppHelperがあります。同じ JFrame に終了ボタンがあり、クリックすると jframe が破棄されます。ActionListener は、上記のクラスの静的なネストされたクラスとして実装されます。

また、ヘルプ ウィンドウのすべてのコンポーネントは外部クラスで定義されており、それらはすべてプライベートで静的です。また、ヘルプ ウィンドウを表示するメソッドも静的です。

ここに私が実装したいくつかのコードがあります:

public class AppHelper {
// helper frame
private static JFrame appHelperFrame;
// helper panel
private static JPanel appHelperPanel;
// helper pane
private static JEditorPane appHelperPane;
// exit helper button
private static JButton exitAppHelperButton;
// constraints
private static GridBagConstraints appHelperPaneCons, exitAppHelperButtonCons;

/**
  set layout
 */
private static void setLayoutConstraints () {
    // defines layout
}
/**
 * initialize the helper elements
 * @param void
 * @return void
*/
public static void initializeElements () {
    // initialize constraints
    setLayoutConstraints();
    // handler
    AppHelper.AppHelperHandler appHelpHandler = new AppHelper.AppHelperHandler();

    appHelperFrame = new JFrame("App Help");
    appHelperPanel = new JPanel();
    appHelperPanel.setLayout(new GridBagLayout());

    appHelperPane = new JEditorPane();
    exitAppHelperButton = new JButton("Exit");

    exitAppHelperButton.addActionListener(appHelpHandler);
    java.net.URL helpURL = null;
    try {
        helpURL = new File("AppHelp.html").toURI().toURL();
    } catch (MalformedURLException ex) {
        Logger.getLogger(AppHelper.class.getName()).log(Level.SEVERE, null, ex);
    }
    try {
        appHelperPane.setPage(helpURL);
    } catch (IOException ex) {
        Logger.getLogger(AppHelper.class.getName()).log(Level.SEVERE, null, ex);
    }
    appHelperPane.setEditable(false);
    appHelperFrame.add(appHelperPanel);
    appHelperPanel.add(appHelperPane, appHelperPaneCons);
    appHelperPanel.add(exitAppHelperButton, exitAppHelperButtonCons);
    appHelperFrame.setSize(350, 400);
    appHelperFrame.setResizable(false);
    appHelperFrame.setVisible(true);
}

/**
 * TODO
 */
public static void showAboutApp() {
    //throw new UnsupportedOperationException("Not yet implemented");

}

/**
 *
 * Acts as the handler for the help window components
 * Implement actionListener interface.
 */
private static class AppHelperHandler implements ActionListener {

    @Override
    public void actionPerformed(ActionEvent e) {
        Object source = e.getSource();
        if(source == exitAppHelperButton)  {
            appHelperFrame.dispose();
        }
    }
}
}

JFrame を非表示に設定する代わりに破棄する理由は、この JFrame が使用されていないときに、この JFrame がメモリを消費したくないからです。

今問題は、JFrameが表示されている(他のウィンドウで)ヘルプボタンをクリックしたときです。このヘルプ ウィンドウの終了ボタンをクリックすると、JFrame がハンドラによって破棄されます。次にもう一度ヘルプ ボタンをクリックすると、ヘルプ ウィンドウが表示されません。コードにエラーがあるかどうか、または何か他のことをする必要があるかどうかを知りたかったのです。

4

1 に答える 1

0

Window.dispose()の javadoc には、次のように記載されています。

Window とそのサブコンポーネントは、その後 pack または show を呼び出してネイティブ リソースを再構築することにより、再び表示可能にすることができます。

それもうまくいきます、私はそれを試しました。電話appHelperFrame.setVisible(true)するだけです。ウィンドウがアクティブ化されていない場合は、ウィンドウをアクティブ化する呼び出しappHelperFrame.setState(Frame.NORMAL)を試してください。

initializeElementsただし、メソッドを呼び出す必要があるのは 1 回だけです。メソッドshowAboutApp()は次のようになります。

public static void showAboutApp() {
    if (appHelperFrame == null)
        initializeElements(); // This also makes the frame visible
    else {
        appHelperFrame.setVisible(true);
        appHelperFrame.setState(Frame.NORMAL);
    }
}

最後の注意:

これを常にshowAboutApp()EDT (Event Dispatching Thread) から呼び出す場合は問題ありません。これを複数のスレッドから呼び出す場合は、EDT で likeSwingUtilities.invokeAndwait()またはSwingUtilities.invokeLater()を使用して実行することをお勧めします。これにより、複数のスレッド間の同期も保証されます。

于 2014-07-25T07:30:38.143 に答える