2

2 つのモニターで実行できるアプリケーションを作成しています。そのために、2 つの JFrame を作成しました。1 つ目は、私が見なければならない情報だけを表示するクライアント アプリケーションです。2 つ目 (TweetForm と呼びましょう) は、誰もが見ることができる情報を表示する jframe です。(おそらくモニターはテレビになります)。これを 2 つの別々の画面に配置する方法を検索したところ、次の解決策が見つかりました: デュアル モニター構成で特定の画面に JFrame を表示する

これは問題なく動作しますが、「mainmonitor」に何かをフォーカスすると、TV に表示されている tweetForm が最小化されます。jframe が最小化されないようにして、常に表示されるようにするにはどうすればよいですか? (最初の jframe が最小化されているかどうかに関係なく)

2番目のJFRAMEからのコード

/**
 * Creates new form TweetForm
 */
public TweetForm()  
{
    initComponents();
    dispose();
    setUndecorated(true);
    pack();
    setExtendedState(Frame.MAXIMIZED_BOTH);
    setTitle("Serious Request");
    this.setAlwaysOnTop(true);

    showOnScreen(1, this);
}

public static void showOnScreen( int screen, JFrame frame )
{
    GraphicsEnvironment ge = GraphicsEnvironment
        .getLocalGraphicsEnvironment();
    GraphicsDevice[] gs = ge.getScreenDevices();
    if( screen > -1 && screen < gs.length )
    {
        gs[screen].setFullScreenWindow( frame );
    }
    else if( gs.length > 0 )
    {
        gs[0].setFullScreenWindow( frame );
    }
    else
    {
        throw new RuntimeException( "No Screens Found" );
    }
}
4

2 に答える 2

3

と組み合わせて使用setFullScreenWindow​​するよりも使用することの利点を理解しているのかわかりません。とにかく、私が使用するかどうかにかかわらず、私はあなたが言及する振る舞いを観察しません(以下のサンプルコードを参照してください、アプリケーションを終了するために使用してください)。setExtendedState(MAXIMIZED)setUndecorated(true)setFullScreenWindow()ESC

コンストラクターを呼び出す理由はdispose()ありますか?私には非常に奇妙に思えます。

import java.awt.GraphicsDevice;
import java.awt.GraphicsEnvironment;
import java.awt.event.ActionEvent;
import java.awt.event.KeyEvent;

import javax.swing.AbstractAction;
import javax.swing.JComponent;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.KeyStroke;
import javax.swing.SwingUtilities;

public class Test2JFrame {

    protected void initUI() {
        GraphicsEnvironment ge = GraphicsEnvironment.getLocalGraphicsEnvironment();
        int i = 1;
        for (GraphicsDevice gd : ge.getScreenDevices()) {
            JFrame frame = new JFrame();
            frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
            frame.add(createLabel(String.valueOf(i)));
            frame.getRootPane().getInputMap(JComponent.WHEN_IN_FOCUSED_WINDOW).put(KeyStroke.getKeyStroke(KeyEvent.VK_ESCAPE, 0), "exit");
            frame.getRootPane().getActionMap().put("exit", new AbstractAction() {

                @Override
                public void actionPerformed(ActionEvent e) {
                    System.exit(0);
                }
            });
            frame.setLocation(gd.getDefaultConfiguration().getBounds().getLocation());
            frame.setUndecorated(true);
            frame.setExtendedState(frame.getExtendedState() | JFrame.MAXIMIZED_BOTH);
            frame.setVisible(true);
            gd.setFullScreenWindow(frame);
            i++;
        }
    }

    private JLabel createLabel(String label) {
        JLabel jLabel = new JLabel(label);
        jLabel.setHorizontalAlignment(JLabel.CENTER);
        jLabel.setFont(jLabel.getFont().deriveFont(48.0f));
        jLabel.setFocusable(true);
        return jLabel;
    }

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

}
于 2013-01-30T16:00:31.220 に答える
3

1 つだけ使用してくださいJFrame。他のものをJDialog作成し、フレームに関してダイアログでデータを更新します。

また、参照してください。

複数の JFrame の使用

複数の JFrame の操作

于 2013-01-30T15:08:21.310 に答える