سؤال

سؤال بسيط:

هل يمكن أن يكون الإطار المتأرجح مشروطًا بالكامل (يمنع جميع النوافذ الأخرى)؟

لقد جربت ما يلي، ولكن لا يزال بإمكاني النقر على نوافذ التطبيقات الأخرى (مثل هذا المتصفح)

JDialog myDialog  = .... 
myDialog.setModalityType(Dialog.ModalityType.APPLICATION_MODAL);

يرجى لصق بعض التعليمات البرمجية إذا كان ذلك ممكنًا.

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

المحلول

لا تهدف JFrame أن يكون مشروط. استخدام JDialog لذلك، ولكن سوف تفقد بعض الوظائف JFrame تفعل ذلك. إذا كنت لا تستطيع العيش مع الخسارة، لديك لمنع EventQueue واستبدالها بنفسك لأحداث تقبل سوى من حظر واحد.

إنشاء مشروط إطارات الداخلية للحصول على تفسير باستخدام الإطارات الداخلية التي يجب أن تكون قابلة للتطبيق لJFrame أيضا.

وتحرير: Oups، جوابي يبدو قليلا قبالة، منذ المثال التعليمات البرمجية الخاصة بك يظهر لك تستخدم بالفعل فئة فرعية الحوار لذلك.

نصائح أخرى

ليس المقصود من مربعات الحوار أن تكون مشروطة عالميًا.لا يشجع كل نظام تشغيل حديث بشدة الطريقة العالمية في HIG الخاص به، وربما يكون قد أهمل الوظيفة (كما يتضح من حقيقة أنه لا يمكنك تشغيلها).ينبغي أن يكون تطبيقك أبداً سرقة الأحداث من النظام بأكمله؛هذا ليس تصميمًا سيئًا فحسب، بل إنه شبه إجرامي في كتابي.

تجاهل حقيقة أن معظم الأشخاص يحبون القيام بمهام متعددة بين عدة تطبيقات، فماذا عن السيناريو الذي تفتح فيه مربع حوار مشروطًا عالميًا ثم يتجمد تطبيقك؟يجب أن يعمل Ctrl+Alt+Del على نظام التشغيل Windows لإيقاف التطبيق، لكنني لست متأكدًا من استخدام Cmd+Opt+Escape على نظام Mac من خلال مربع حوار مشروط عالمي (هل يعمل Cocoa حتى يملك الطريقة العالمية؟).لا تمتلك أي من منصات Linux أي طريقة لطيفة لقتل التطبيقات التي سيطرت بشكل كامل على واجهة المستخدم كما تقترح (سيتعين عليك إيقاف X11 تمامًا وبدء مثيل جديد من الصفر).

إجابتي: تجد وسيلة أخرى. لا يهمني ما يطلبه عميلك، فهو لا يريد ذلك.

لا أعرف شيئًا عن الوسائط العالمية، لكن إليك فكرة.

  1. التقط لقطة شاشة لسطح المكتب.
  2. اذهب الي وضع مليء الشاشة.
  3. يطفو على السطح الحوار الخاص بك.

نظرًا لأن سطح المكتب عبارة عن لقطة شاشة مزيفة، يمكنك تجاهل أي محاولة للنقر عليها.

عينة ملء الشاشة:

private void toggleFullScreenWindow() {
  GraphicsEnvironment graphicsEnvironment
    = GraphicsEnvironment.getLocalGraphicsEnvironment();
  GraphicsDevice graphicsDevice
    = graphicsEnvironment.getDefaultScreenDevice();
  if(graphicsDevice.getFullScreenWindow()==null) {
    dialog.dispose(); //destroy the native resources
    dialog.setUndecorated(true);
    dialog.setVisible(true); //rebuilding the native resources
    graphicsDevice.setFullScreenWindow(dialog);
  }else{
    graphicsDevice.setFullScreenWindow(null);
    dialog.dispose();
    dialog.setUndecorated(false);
    dialog.setVisible(true);
    dialog.repaint();
  }
  requestFocusInWindow();
}

لعِلمِكَ: واجهة برمجة التطبيقات للوضع الحصري بملء الشاشة.

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