سؤال

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

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

المحلول

أفضل رهان هو استخدام Jdialog بدلا من JFrame إذا كنت ترغب في جعل النافذة مشروط. الدفع تفاصيل حول إدخال وسيلة API في Java 6 للمعلومات. يوجد ايضا برنامج تعليمي.

هنا بعض رمز العينة الذي سيعرض JPanel panel في JDialog وهو مشروط ل Frame parentFrame. وبعد باستثناء المنشئ، هذا يتبع نفس النمط مثل فتح JFrame.

final JDialog frame = new JDialog(parentFrame, frameTitle, true);
frame.getContentPane().add(panel);
frame.pack();
frame.setVisible(true);

تحرير: مراقبة الوسيلة المحدثة وصلة برامج تعليمية إضافية (إيماءة إلى SSPork for the Bump).

نصائح أخرى

يمكنك إنشاء فئة تمرير مرجع إلى الوالد JFrame ويحملها في JFrame عامل. ثم يمكنك قفل الإطار الذي أنشأ إطارك الجديد.

parentFrame.disable();

//Some actions

parentFrame.enable();

فقط استبدل JFrame ل JDialog في الفصل

public class MyDialog extends JFrame // delete JFrame and write JDialog

ثم اكتب setModal(true); في المنشئ

بعد ذلك، ستكون قادرا على بناء النموذج الخاص بك في Netbeans ويصبح النموذج مشروطا

  1. إنشاء نموذج JPanel جديد
  2. أضف المكونات المرجوة ورمزك إليه

YourJPanelForm stuff = new YourJPanelForm();
JOptionPane.showMessageDialog(null,stuff,"Your title here bro",JOptionPane.PLAIN_MESSAGE);


حوار مشروط الخاص بك ينتظر ...

بقدر ما أعرف، لا يمكن ل JFrame القيام بوضع مشروط. استخدم Jdialog بدلا من ذلك والاتصال setModalityType(Dialog.ModalityType type) لتعيينها لتكون مشروط (أو غير مشروط).

إذا كنت مستعدا لاستخدام Jdialog بدلا من JFrame، يمكنك ضبط modalytype. ل application_modal..

يوفر هذا سلوكا متطابقا إلى Joptionpane النموذجي الخاص بك:

import java.awt.event.ActionEvent;
import javax.swing.*;
import java.awt.*;
import java.awt.event.ActionListener;

public class MyDialog extends JFrame {

public MyDialog() {
    setBounds(300, 300, 300, 300);
    setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    setVisible(true);
    setLayout(new FlowLayout());
    JButton btn = new JButton("TEST");
    add(btn);
    btn.addActionListener(new ActionListener() 
    {

        @Override
        public void actionPerformed(ActionEvent e) {
            showDialog();
        }
    });
}

private void showDialog() 
{

    JDialog dialog = new JDialog(this, Dialog.ModalityType.APPLICATION_MODAL);
    //OR, you can do the following...
    //JDialog dialog = new JDialog();
    //dialog.setModalityType(Dialog.ModalityType.APPLICATION_MODAL);

    dialog.setBounds(350, 350, 200, 200);
    dialog.setVisible(true);
}

public static void main(String[] args) 
{
    new MyDialog();
}
}

تعرض طريقة المرافق الثابتة هذه jeframe مشروط من خلال فتح سرا jdialog مشروط أيضا. استخدمت هذا بنجاح ومع السلوك المناسب على نظام التشغيل Windows 7 و 8 و 10 مع عدة أجهزة كمبيوتر سطح المكتب.

إنه مثال جميل على ميزة نادرا ما تستخدم محلي الطبقات.

import javax.swing.*;
import java.awt.Dialog;
import java.awt.Dimension;
import java.awt.Frame;
import java.awt.event.WindowAdapter;
import java.awt.event.WindowEvent;

// ... (class declaration)

/**
 * Shows an already existing JFrame as if it were a modal JDialog. JFrames have the upside that they can be
 * maximized.
 * <p>
 * A hidden modal JDialog is "shown" to effect the modality.
 * <p>
 * When the JFrame is closed, this method's listener will pick up on that, close the modal JDialog, and remove the
 * listener.
 *
 * made by dreamspace-president.com
 *
 * @param window the JFrame to be shown
 * @param owner  the owner window (can be null)
 * @throws IllegalArgumentException if argument "window" is null
 */
public static void showModalJFrame(final JFrame window, final Frame owner) {

    if (window == null) {
        throw new IllegalArgumentException();
    }
    window.setModalExclusionType(Dialog.ModalExclusionType.APPLICATION_EXCLUDE);
    window.setVisible(true);
    window.setAlwaysOnTop(true);

    final JDialog hiddenDialogForModality = new JDialog(owner, true);
    final class MyWindowCloseListener extends WindowAdapter {
        @Override
        public void windowClosed(final WindowEvent e) {
            window.dispose();
            hiddenDialogForModality.dispose();
        }
    }

    final MyWindowCloseListener myWindowCloseListener = new MyWindowCloseListener();
    window.addWindowListener(myWindowCloseListener);

    final Dimension smallSize = new Dimension(80, 80);
    hiddenDialogForModality.setMinimumSize(smallSize);
    hiddenDialogForModality.setSize(smallSize);
    hiddenDialogForModality.setMaximumSize(smallSize);
    hiddenDialogForModality.setLocation(-smallSize.width * 2, -smallSize.height * 2);
    hiddenDialogForModality.setVisible(true);
    window.removeWindowListener(myWindowCloseListener);
}

هناك القليل من التعليمات البرمجية التي قد تساعد:

import java.awt.Component;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.WindowAdapter;
import java.awt.event.WindowEvent;

import javax.swing.JFrame;
import javax.swing.JMenu;
import javax.swing.JMenuBar;
import javax.swing.JMenuItem;

public class ModalJFrame extends JFrame {

    Object currentWindow = this;

    public ModalJFrame() 
    {
        super();
        super.setTitle("Main JFrame");
        super.setSize(500, 500);
        super.setResizable(true);
        super.setLocationRelativeTo(null);

        JMenuBar menuBar = new JMenuBar();
        super.setJMenuBar(menuBar);

        JMenu fileMenu = new JMenu("File");
        JMenu editMenu = new JMenu("Edit");

        menuBar.add(fileMenu);
        menuBar.add(editMenu);

        JMenuItem newAction = new JMenuItem("New");
        JMenuItem openAction = new JMenuItem("Open");
        JMenuItem exitAction = new JMenuItem("Exit");
        JMenuItem cutAction = new JMenuItem("Cut");
        JMenuItem copyAction = new JMenuItem("Copy");
        JMenuItem pasteAction= new JMenuItem("Paste");

        fileMenu.add(newAction);
        fileMenu.add(openAction);
        fileMenu.addSeparator();
        fileMenu.add(exitAction);

        editMenu.add(cutAction);
        editMenu.add(copyAction);
        editMenu.addSeparator();
        editMenu.add(pasteAction);

        newAction.addActionListener(new ActionListener()
        {
            public void actionPerformed(ActionEvent arg0)
            {

                JFrame popupJFrame = new JFrame();

                popupJFrame.addWindowListener(new WindowAdapter()
                {
                      public void windowClosing(WindowEvent e) 
                      {
                          ((Component) currentWindow).setEnabled(true);                     }
                      });

                ((Component) currentWindow).setEnabled(false);
                popupJFrame.setTitle("Pop up JFrame");
                popupJFrame.setSize(400, 500);
                popupJFrame.setAlwaysOnTop(true);
                popupJFrame.setResizable(false);
                popupJFrame.setLocationRelativeTo(getRootPane());
                popupJFrame.setVisible(true);
                popupJFrame.setDefaultCloseOperation(JFrame.HIDE_ON_CLOSE);
            }
        });

        exitAction.addActionListener(new ActionListener()
        {
            public void actionPerformed(ActionEvent arg0)
            {
                System.exit(0);
            }
        });
    }
    public static void main(String[] args) {

        ModalJFrame myWindow = new ModalJFrame();
        myWindow.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        myWindow.setVisible(true);
    }
}

ما قمت به في هذه الحالة هو، في JFrame الأساسي الذي أريد الاحتفاظ به (على سبيل المثال، إطار القائمة)، أحل محل الخيار focusableWindowState في نافذة الملكية لذلك سيكون FALSE. وبعد بمجرد القيام بذلك، لا تفقد JFrames I اتصل على التركيز حتى أغلقها.

كما ذكر آخرين، يمكنك استخدام jdialog. إذا لم يكن لديك إمكانية الوصول إلى الإطار الأصل أو تريد تجميد تطبيق الحفرة، فالتقدير تماما كوالد:

final JDialog frame = new JDialog((JFrame)null, frameTitle, true); frame.setModal(true);
frame.getContentPane().add(panel);
frame.setDefaultCloseOperation(WindowConstants.DISPOSE_ON_CLOSE);
frame.pack();
frame.setVisible(true);

لست متأكدا من contetns من jeframe الخاص بك، إذا كنت تسأل بعض المدخلات من المستخدمين، يمكنك استخدام Joptionpane، وهذا يمكن أيضا تعيين JFrame كما مشروط

            JFrame frame = new JFrame();
            String bigList[] = new String[30];

            for (int i = 0; i < bigList.length; i++) {
              bigList[i] = Integer.toString(i);
            }

            JOptionPane.showInputDialog(
                    frame, 
                    "Select a item", 
                    "The List", 
                    JOptionPane.PLAIN_MESSAGE,
                    null,
                    bigList,
                    "none");
            }

الطريقة الأكثر بسيطة هي استخدام رزمة() الطريقة قبل تصور JFrame. هدف. هنا مثال:

myFrame frm = new myFrame();
frm.pack();
frm.setVisible(true);
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top