1

JOptionPaneボタンをクリックすると、全画面表示に設定されているアプリケーションがタスクバー/最小化に移動するため、トリガーしたアプリケーションを表示する前に、タスクバーで最初にクリックする必要があります。これの何が問題だと思いますか?最小化したり、タスクバーに移動したりせずにスムーズに実行したいと思います。

public static void main(String[] args) {
        final JFrame frame = new JFrame();
        frame.setTitle("Sample");
        GraphicsDevice device = GraphicsEnvironment.getLocalGraphicsEnvironment().getDefaultScreenDevice();
        device.setFullScreenWindow(frame);
        device.setDisplayMode(new DisplayMode(800, 600, 32, 60)); 
        frame.setVisible(true);

        JButton btn = new JButton();
        btn.setText("Btn");
        JPanel panel = new JPanel();

        panel.add(btn);
        frame.add(panel);

        btn.addActionListener(new ActionListener() {

            @Override
            public void actionPerformed(ActionEvent e) {
                JOptionPane.showMessageDialog(frame, "Sample");
                throw new UnsupportedOperationException("Not supported yet.");
            }

        });
    }
4

2 に答える 2

1

私が考えることができる唯一の回避策は、をオーバーライドWindowAdpaterするを追加することです。表示されているためにウィンドウがアイコン化されたことをプログラムが知るためのフラグとしても使用されます。JFramewindowIconified(..)booleanJOptionPane

JOptionPaneしかし、それは本当にハッキーであり、数回の画面フラッシュの後でのみ、とJFrameがうまく連携していることがわかります。

コードは次のとおりです。

import java.awt.DisplayMode;
import java.awt.GraphicsDevice;
import java.awt.GraphicsEnvironment;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.WindowAdapter;
import java.awt.event.WindowEvent;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JOptionPane;
import javax.swing.JPanel;
import javax.swing.SwingUtilities;

public class Test {

    private static boolean programmatic = false;

    public static void main(String[] args) {
        SwingUtilities.invokeLater(new Runnable() {
            @Override
            public void run() {
                final JFrame frame = new JFrame();
                frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
                frame.setTitle("Sample");
                GraphicsDevice device = GraphicsEnvironment.getLocalGraphicsEnvironment().getDefaultScreenDevice();
                device.setFullScreenWindow(frame);
                device.setDisplayMode(new DisplayMode(800, 600, 32, 60));

                frame.addWindowListener(new WindowAdapter() {
                    @Override
                    public void windowIconified(WindowEvent we) {
                        //super.windowIconified(we);
                        if (programmatic) {
                            programmatic = false;
                            frame.setState(JFrame.NORMAL);
                        }
                    }
                });

                JButton btn = new JButton();
                btn.setText("Btn");
                final JPanel panel = new JPanel();

                panel.add(btn);
                frame.add(panel);

                btn.addActionListener(new ActionListener() {
                    @Override
                    public void actionPerformed(ActionEvent e) {
                        programmatic = true;
                        JOptionPane.showMessageDialog(panel, "Sample");
                    }
                });
                frame.setVisible(true);
            }
        });
    }
}

そしてそれをもっと考えて、JDialog結果も再現します、それはsとsのモダリティによるものだと思います。たぶん、モダリティを使用して設定することでうまくいくでしょう。JOptionPaneJDialogJDialog

于 2012-12-23T21:30:58.880 に答える
1

ここでの1つの回避策は、使用することです

frame.setExtendedState(JFrame.MAXIMIZED_BOTH);

それ以外の

device.setFullScreenWindow(frame);

また、コメントで述べたsetVisible(true)ように、すべてのコンポーネントが追加されたときに表示されるはずです。

于 2012-12-23T21:09:32.697 に答える