كيفية استدعاء setUndecorated () بعد تقديم إطار واضح؟

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

  •  22-08-2019
  •  | 
  •  

سؤال

في تطبيق سوينغ الخاص بي، أريد القدرة على التبديل بين زينت وغير مزخرف دون إعادة الإطار بأكمله. ومع ذلك، فإن API لا يسمح لي أن ندعو setUndecorated() بعد إجراء إطار مرئية.

وحتى لو أسميه setVisible(false)، isDisplayable() لا يزال يعود صحيحا. يقول API السبيل الوحيد لجعل إطار يست للعرض هي إعادة إنشائه. ومع ذلك، لا أريد لإعادة إطار فقط لإيقاف بعض أشرطة العناوين.

وأنا على صنع تطبيق كامل screenable التي يمكن أن تحول بين ملء الشاشة وسائط إطارات. وينبغي أن يكون قادرا على التبديل مع الحفاظ على الدولة، وما إلى ذلك.

وكيف يمكنني القيام بذلك بعد الإطار غير مرئية؟.

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

المحلول

وأنت لا تستطيع ذلك. وهذا ما كان تجربتي عندما حاولت تحقيق ذاته.

ولكن إذا كان لديك UI بأكمله في لوحة واحدة والتي هي في الإطار الخاص بك، يمكنك إنشاء إطار جديد وأضيف أن لوحة إلى الإطار. لا الكثير من العمل.

وشيء من هذا القبيل:

// to start with
JPanel myUI = createUIPanel();
JFrame frame = new JFrame();
frame.add(myUI);

// .. and later ...

JFrame newFrame = new JFrame();
newFrame.setUndecorated();
newFrame.add(myUI);

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

نصائح أخرى

هل حاولت يدعو Frame.dispose() ثم تغيير ذلك؟ لم أحاول بنفسي، لكنه قد عمل.

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

وإلقاء نظرة على https://tvbrowser.svn.sourceforge.net/svnroot/tvbrowser/trunk/tvbrowser/src/tvbrowser/ui/mainframe/MainFrame.java

في switchFullscreenMode() الطريقة:

dispose();
...
setFullScreenWindow(...);
setUndecorated(true/false);
setBounds(mXPos, mYPos, mWidth, mHeight);
...
setVisible(true);

وفي الواقع هناك الكثير المزيد من الأشياء يحدث لإخفاء مختلف sidepanels أن تعاود الظهور إذا الماوس يمس الجانبين.

لاحظ أيضا أنه يجب بوضوح تعيين حدود. Window.setExtendedState(MAXIMIZED_BOTH) تتعارض بشدة في المناطق المجاورة في الوقت المناسب من التصرف ()، لأن كلا منهما تعتمد على الأحداث المحلية متعددة من نظام التشغيل، والتي فقدت، ينبغي للنافذة لا يكون للعرض في ذلك جزء من الثانية.

وأنا لا نوصي بأخذ الشاشة الافتراضية مباشرة:

GraphicsEnvironment.getLocalGraphicsEnvironment().getDefaultScreenDevice();

وبدلا من استخدام الشاشة، JFrame الخاص بك هو حاليا فى:

setBounds(getGraphicsConfiguration().getBounds());
getGraphicsConfiguration().getDevice().setFullScreenWindow(this);

وعلى الرغم من أنه في الوقت الحالي نفسه، فإنه قد يتغير في المستقبل.

ويدعو النشرات dispose() الموارد نافذة الأم. ثم يمكنك تعديل خصائص مثل مزخرف وهلم جرا. ثم ما عليك سوى الاتصال setVisible(true) لإعادة الموارد نافذة ويعمل كل شيء على ما يرام (موقف وفاز 'ر أن تتغير كل compoenents)

dispose();
setUndecorated(true/false);
setVisible(true);

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

وجرب:

dispose();
setUndecorated(true);
setVisible(true);

والتحقق من ذلك. أمل أن يساعد ذلك !!

وهنا هو رمز في كيفية جعل ALT + أدخل يدخل الشاشة الكاملة من دون وضع شريط وقلل مع إظهار شريط العنوان وشريط البدء:

public class myTest extends JFrame{
 //Your codes...
     //if "ALT" key on hold and "Enter" key pressed with it
     if (evt.isAltDown() && evt.getKeyCode() == evt.VK_ENTER) {    
         //if the JFrame has Title bar
         if (isUndecorated()) {
             //this will dispose your JFrame
             dispose();
             //here to set it with no Title bar
             setUndecorated(false);
             pack();
             setLocationRelativeTo(null);
             //as you dispose your JFrame, you have to remake it Visible..
             setVisible(true);
          } else {
             dispose();
             setUndecorated(true);
             setExtendedState(MAXIMIZED_BOTH);
             setVisible(true);
        }
    }
//your codes
}
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top