Warum machen Radio-Buttons nicht ordnungsgemäß in einem java.awt.Dialog auf dem Mac, wenn der Dialog modal ist?

StackOverflow https://stackoverflow.com/questions/1002394

  •  05-07-2019
  •  | 
  •  

Frage

Ich bin in dem Prozess auf dem Mac meine Java-Anwendung zu testen und ich habe in eine sehr seltsame Frage laufen. Checkbox, die in einem erscheinen modal Dialog falsch machen, wenn auch nicht modale Dialoge funktionieren.

Zum Beispiel, sagen, ich habe ein Fenster mit zwei Radio-Buttons. Wenn der Dialog die erste öffnet ausgewählt ist. Wenn ich auf den zweiten Knopf klicken sieht es plötzlich wie beide ausgewählt sind. Durch Klicken auf anderswo im Dialog führt dazu, dass die Wiedergabe selbst zu beheben und nur die ausgewählte Taste wird angezeigt.

Der folgende Code reproduziert das für mich:

package mactest;

import java.awt.Checkbox;
import java.awt.CheckboxGroup;
import java.awt.Dialog;
import java.awt.FlowLayout;
import java.awt.Frame;
import java.awt.event.WindowAdapter;
import java.awt.event.WindowEvent;

public class Main {
  public static void main(String[] args) {
    boolean modal = false;
    if(args.length > 0) {
      modal = args[0].toLowerCase().equals("true");
    }

    TestDialog dlg = new TestDialog(new Frame(), modal);

    dlg.setVisible(true);
  }

  private static class TestDialog extends Dialog {
    private Checkbox cb1;
    private Checkbox cb2;

    private CheckboxGroup cbg;

    public TestDialog(Frame owner, boolean modal) {
      super(owner);

      cbg = new CheckboxGroup();

      cb1 = new Checkbox("One", true, cbg);
      cb2 = new Checkbox("Two", false, cbg);

      this.setLayout(new FlowLayout());
      this.add(cb1);
      this.add(cb2);

      this.setModal(modal);
      this.pack();

      this.addWindowListener(new WindowAdapter() {
        public void windowClosing(WindowEvent e) {
          TestDialog.this.setVisible(false);
          System.exit(0);
        }
      });
    }
  }
}

Wenn ich das nennen wie folgt:

  

java -cp MacTest.jar mactest.Main false

der Dialog ist nicht modal und alles funktioniert. Wenn ich es jedoch sagen sein modal:

  

java -cp MacTest.jar mactest.Main true

dann treten die Rendering-Probleme.

Ich habe jeden Trick versuchte ich mir vorstellen kann, um zu versuchen, das Problem zu beheben (ungültig machen, doLayout, Fokus anfordert, explizit den Zustand jeder Taste einstellen, wenn man gewählt ist, etc.)., Aber bisher das einzige, was ich habe kommen mit, dass funktioniert, ist der Dialog nicht modal zu machen. Leider, das ist keine Option in meiner Anwendung.

Falls es darauf ankommt, ist dies auf einem MacBook mit OS X 10.5 laufen Java 1.5.0_16.

War es hilfreich?

Lösung 2

ich etwas gefunden, das es zu beheben scheint, obwohl es eine hässliche Hack ist. Ich habe Artikel Zuhörer zu jedem des Ankreuzfelder. Wenn diese Trigger ich das Fenster um 1 Pixel Größe ändern, dann tun ein invokeLater () auf pack () (meine Dialoge nicht veränderbare sind). Hier ist der modifizierte Testcode:

package mactest;

import java.awt.Checkbox;
import java.awt.CheckboxGroup;
import java.awt.Dialog;
import java.awt.EventQueue;
import java.awt.FlowLayout;
import java.awt.Frame;
import java.awt.Rectangle;
import java.awt.event.ItemEvent;
import java.awt.event.ItemListener;
import java.awt.event.WindowAdapter;
import java.awt.event.WindowEvent;

public class Main {
  public static void main(String[] args) {
    boolean modal = false;
    boolean tweak = false;
    if(args.length > 0) {
      modal = args[0].toLowerCase().equals("true");
    }
    if(args.length > 1) {
      tweak = args[1].toLowerCase().equals("true");
    }

    TestDialog dlg = new TestDialog(new Frame(), modal, tweak);

    dlg.setVisible(true);
  }

  private static class TestDialog extends Dialog {
    private Checkbox cb1;
    private Checkbox cb2;

    private CheckboxGroup cbg;

    public TestDialog(Frame owner, boolean modal, boolean tweak) {
      super(owner);

      cbg = new CheckboxGroup();

      cb1 = new Checkbox("One", true, cbg);
      cb2 = new Checkbox("Two", false, cbg);

      this.setLayout(new FlowLayout());
      this.add(cb1);
      this.add(cb2);

      this.setModal(modal);
      this.pack();

      if(tweak) {
        cb1.addItemListener(new ItemListener() {
          public void itemStateChanged(ItemEvent e) {
            onSelection();
          }
        });
        cb2.addItemListener(new ItemListener() {
          public void itemStateChanged(ItemEvent e) {
            onSelection();
          }
        });
      }

      this.addWindowListener(new WindowAdapter() {
        public void windowClosing(WindowEvent e) {
          TestDialog.this.setVisible(false);
          System.exit(0);
        }
      });
    }

    private void onSelection() {
      Rectangle bounds = this.getBounds();
      this.setBounds(bounds.x, bounds.y, bounds.width + 1, bounds.height);
      EventQueue.invokeLater(new Runnable() {
        public void run() {
          TestDialog.this.pack();
        }
      });
    }
  }
}

Für veränderbare Komponenten müssen Sie die Größe Pre-zwicken zu speichern und wiederherzustellen, dass anstelle dem Aufruf pack ().

Im Fenster ich das Dialog Flimmern jeden einmal in einer Weile sehen konnte, wenn ich die Auswahl geändert, wenn auch auf dem Mac es überhaupt nicht erkennbar ist.

Andere Tipps

Sind Sie fragen über Kontrollkästchen oder Optionsfelder? Sie erwähnen beide.

So erstellen Sie eine multiple-Ausschluss Umfang Sie ButtonBroup Klasse verwenden

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top