2

Ubuntu の Java には 2 つの問題があります。

  1. JTextField にアクセスできなくなり、何も入力できなくなります。再現するには、ラベルをクリックする必要があります (「このラベルをクリックしてください」)。拡張 JDialog が開きます。[キャンセル] ボタンで閉じた後、JTextField にアクセスできなくなります。問題は、それが常に起こるわけではないということです。10回に1回くらいだと思います。その場合は、ブラウザ ウィンドウの別の場所をクリックするか、もう一度ダイアログを開く必要があります。

  2. 2番目の問題は、ubuntuがJDialogを開くと、左側のアプリバーに表示される他のプロセスが作成されることです。ダイアログの下のアプレットのどこかをクリックすると、このダイアログがモーダルであり、一番上にあるはずなのに、ブラウザの下に移動します。

ubuntuで同様のエラーが発生し、修正方法を知っている人はいますか。Windowsでは、すべて正常に動作します。ubuntu-12.04-desktop と Java 1.6.0_34-b04 を使用します。firefox 11.0とGoogle chromeでテストされました(最新だと思います)

ここに私のコード TestApplet.java クラスがあります:

    import java.awt.FlowLayout;
    import java.awt.Frame;
    import java.awt.event.MouseAdapter;
    import java.awt.event.MouseEvent;

    import javax.swing.JApplet;
    import javax.swing.JComponent;
    import javax.swing.JLabel;
    import javax.swing.JTextField;
    import javax.swing.SwingUtilities;

    import client.utilities.GUIUtilities;


    @SuppressWarnings("serial")
    public class TestApplet extends JApplet {
        public void init() {
            try {
                SwingUtilities.invokeAndWait(new Runnable() {
                    public void run() {
                        JApplet applet = TestApplet.this;

                        applet.setLayout(new FlowLayout());

                        JTextField ts = new JTextField("Test text");
                        ts.setColumns(10);
                        applet.add(ts);

                        applet.add(getCallCalendarButton(ts));
                    }
                });
            } catch (Exception e) {
                System.err.println(e.getCause());
            }
        }

        private JLabel callCalendarButton;

        private MyDialog aDialog;

        protected JLabel getCallCalendarButton(final JComponent cmp) {
            if (callCalendarButton == null) {
                callCalendarButton = new JLabel("Click this label!!");

                callCalendarButton.addMouseListener(new MouseAdapter() {

                    public void mouseClicked(MouseEvent e) {
                        if (callCalendarButton.isEnabled()) {
                            Frame parentFrame = null;
                            if (parentFrame == null)
                                parentFrame = GUIUtilities.getParentFrame(cmp);

                            System.out.println(parentFrame);

                            aDialog = new MyDialog(parentFrame, cmp);
                            aDialog.setVisible(true);

                            System.out.println("qwewqe");
                            cmp.requestFocusInWindow();
                        }
                    }
                });
            }
            return callCalendarButton;
        }


    }

そして、拡張された JDialog クラス (MyDialog.java) は次のとおりです。

    import java.awt.BorderLayout;
    import java.awt.FlowLayout;
    import java.awt.Frame;
    import java.awt.event.ComponentAdapter;
    import java.awt.event.ComponentEvent;

    import javax.swing.JButton;
    import javax.swing.JComponent;
    import javax.swing.JDialog;
    import javax.swing.JPanel;
    import javax.swing.SwingUtilities;


    @SuppressWarnings("serial")
    public class MyDialog extends JDialog {

        private JButton okButton;

        private JButton cancelButton;

        private JComponent owner;

        private int WIDTH = 230;
        private int HEIGHT = 230;

        Frame parent;

        public MyDialog(Frame parent, JComponent owner) {
            super(parent);

            this.parent = parent;
            this.owner = owner;


            okButton = new JButton("OK");
            okButton.setMnemonic('O');
            okButton.addActionListener(new java.awt.event.ActionListener() {
                public void actionPerformed(java.awt.event.ActionEvent e) {
                    MyDialog.this.setVisible(false);
                    MyDialog.this.dispose();
                }
            });

            cancelButton = new JButton("Cancel");
            cancelButton.setMnemonic('C');
            cancelButton.addActionListener(new java.awt.event.ActionListener() {
                public void actionPerformed(java.awt.event.ActionEvent e) {
                    MyDialog.this.setVisible(false);
                }
            });

            this.setLayout(new BorderLayout());
            JPanel bottomPanel = new JPanel();
            bottomPanel.setLayout(new FlowLayout(FlowLayout.RIGHT));
            bottomPanel.add(okButton);
            bottomPanel.add(cancelButton);
            this.add(bottomPanel, BorderLayout.SOUTH);
            this.setModal(true);
            this.setBounds(100, 100, WIDTH, HEIGHT);
            //

            this.addComponentListener(new ComponentAdapter(){
                  @Override
                  public void componentHidden(ComponentEvent e){
                    SwingUtilities.invokeLater(new Runnable(){
                      @Override
                      public void run(){
                            MyDialog.this.owner.requestFocusInWindow();
                            //MyDialog.this.parent.toFront();
                            //MyDialog.this.parent.requestFocusInWindow();

                      }
                    });
                  }
                });
        }



    }

この html を使用してアプレットを実行するには:

    <html>
    <body>
    <Applet Code="TestApplet.class" width="200" height="100" >
    </Applet>
    </body>
    </html>
4

0 に答える 0