لماذا أزرار تجعل غير صحيح في java.awt.Dialog على ماك عندما الحوار مشروط؟

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

  •  05-07-2019
  •  | 
  •  

سؤال

وأنا في عملية اختبار بلدي تطبيق جافا على ماك ولقد واجهت مشكلة غريبة جدا. مربعات التي تظهر في مشروط الحوار تقديم بشكل غير صحيح، على الرغم من الحوارات غير مشروط تعمل بشكل جيد.

وعلى سبيل المثال، ويقول لدي نافذة مع 2 أزرار الراديو. عندما يفتح مربع الحوار تحديد أول واحد. عندما اضغط على الزر الثاني يبدو فجأة مثل كل من يتم اختيارهم. يؤدي النقر في أي مكان آخر داخل الحوار تتسبب في جعل لإصلاح نفسه وسيتم عرض الزر المحدد فقط.

والتعليمة البرمجية التالية يستنسخ هذا بالنسبة لي:

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);
        }
      });
    }
  }
}

إذا أنا أسمي هذا مثل ذلك:

<اقتباس فقرة>   

وجافا -cp MacTest.jar mactest.Main كاذبة

والحوار ليس مشروط ويعمل كل شيء على ما يرام. ومع ذلك، إذا أنا أقول ذلك ليكون مشروط:

<اقتباس فقرة>   

وجافا -cp MacTest.jar mactest.Main صحيح

وبعد ذلك تحدث الأمور التقديم.

ولقد حاول كل خدعة أستطيع أن أفكر في محاولة لعلاج هذه المشكلة (إبطال، doLayout، وطلب التركيز، ووضع صراحة ولاية كل زر عند اختيار واحد، وما إلى ذلك)، ولكن حتى الآن الشيء الوحيد الذي يمكنني 'لقد حان حتى مع أن يعمل هو جعل الحوار لا يكون مشروط. للأسف، هذا ليس خيارا في طلبي.

في حالة يهم، وهذا هو على ماك تشغيل OS X 10.5 تشغيل جافا 1.5.0_16.

هل كانت مفيدة؟

المحلول 2

ولقد وجدت شيء يبدو لإصلاحه، على الرغم من انها الإختراق القبيح. وأضاف لي المستمعين البند إلى كل من خانات. عندما تكون تلك الزناد I تغيير حجم نافذة من 1 بكسل، ثم القيام invokeLater () على حزمة () (بلدي الحوارات ليست يمكن تغيير حجم). هنا هو رمز اختبار تعديل:

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();
        }
      });
    }
  }
}

لمكونات يمكن تغيير حجم كنت بحاجة لتخزين حجم ما قبل قرص واستعادة ذلك بدلا من استدعاء حزمة ().

في النوافذ يمكن أن أرى وميض الحوار كل مرة واحدة في حين عندما غيرت التحديد، وإن كان ذلك على لجنة الهدنة العسكرية لم يكن ملحوظا على الإطلاق.

نصائح أخرى

هل يسأل عن مربعات أو radiobuttons؟ أذكر لكم على حد سواء.

لإنشاء نطاق الاستبعاد متعددة لديك لاستخدام الطبقة ButtonGroup

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top