سؤال

أرغب في إجراء حوار داخلي (بدون نافذة) لطلب إدخال الأعضاء.أرغب في وضع مربع الحوار مركزيًا على لوحة JPanel الموجودة.

لقد نظرت Layeredpanes ويبدو أن هذه العناصر غير قابلة للاستخدام نظرًا لوجود مدير تخطيط واحد فقط (أو عدم وجود مدير تخطيط) عبر جميع الأجزاء.أعتقد أنه يمكنني محاولة تجاوز JLayeredPane وتوفير تخطيط مخصص ولكن هذا يبدو متطرفًا.

الألواح الزجاجية لا يبدو مناسبًا أيضًا.

كيف يمكن القيام بذلك؟ألا يوجد مفهوم قابل للاستخدام لفهارس z في Swing؟

يحرر

السبب وراء عدم ملاءمة الأجزاء ذات الطبقات هو عدم وجود مدير تخطيط لكل طبقة.يمكن تغيير حجم اللوحة، ويجب أن تظل اللوحة A عند 100% من المساحة ويجب أن تظل اللوحة B مركزية.

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

المحلول

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

public class Main {
    private JFrame frame = new JFrame();
    private JLayeredPane lpane = new JLayeredPane();
    private JPanel panelBlue = new JPanel();
    private JPanel panelGreen = new JPanel();
    public Main()
    {
        frame.setPreferredSize(new Dimension(600, 400));
        frame.setLayout(new BorderLayout());
        frame.add(lpane, BorderLayout.CENTER);
        lpane.setBounds(0, 0, 600, 400);
        panelBlue.setBackground(Color.BLUE);
        panelBlue.setBounds(0, 0, 600, 400);
        panelBlue.setOpaque(true);
        panelGreen.setBackground(Color.GREEN);
        panelGreen.setBounds(200, 100, 100, 100);
        panelGreen.setOpaque(true);
        lpane.add(panelBlue, new Integer(0), 0);
        lpane.add(panelGreen, new Integer(1), 0);
        frame.pack();
        frame.setVisible(true);
    }


    /**
     * @param args the command line arguments
     */
    public static void main(String[] args) {
        new Main();
    }

}

يمكنك استخدام setBounds لوضع اللوحات داخل الجزء ذو الطبقات وأيضًا لتعيين أحجامها.

تحرير لتعكس التغييرات على المشاركة الأصليةستحتاج إلى إضافة مستمعي المكونات الذين يكتشفون متى يتم تغيير حجم الحاوية الأصلية ثم تغيير حدود اللوحة A وB ديناميكيًا.

نصائح أخرى

اعتقدت فقط أنني سأضيف ذلك هناك يكون فكرة Z-order in Swing ، انظر [java.awt.component#setComponentzorder] [1

مما يؤثر على مواضع المكون في مصفوفة المكونات الأصلية، والتي تحدد ترتيب الطلاء.

لاحظ أنه يجب عليك تجاوز javax.swing.JComponent#isOptimizedDrawingEnabled لإرجاع خطأ في الحاوية الأصلية لإعادة طلاء المكونات المتداخلة بشكل صحيح، وإلا فإن عمليات إعادة الطلاء سوف تصطدم ببعضها البعض.(تفترض JComponents عدم وجود أطفال متداخلين ما لم يُرجع isOptimizedDrawingEnabled خطأ)

[1]: http://java.sun.com/j2se/1.5.0/docs/api/java/awt/Container.html#setComponentZOrder(java.awt.Component, ، كثافة العمليات)

يمكنك إضافة JDialog غير مزخرف مثل هذا:

import java.awt.event.*;

import javax.swing.*;

public class TestSwing {
  public static void main(String[] args) throws Exception {
    JFrame frame = new JFrame("Parent");
    frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    frame.setSize(800, 600);
    frame.setVisible(true);

    final JDialog dialog = new JDialog(frame, "Child", true);    
    dialog.setSize(300, 200);
    dialog.setLocationRelativeTo(frame);
    JButton button = new JButton("Button");
    button.addActionListener(new ActionListener() {
      @Override
      public void actionPerformed(ActionEvent e) {
        dialog.dispose();
      }
    });
    dialog.add(button);
    dialog.setUndecorated(true);
    dialog.setVisible(true);
  }
}

استخدم GridLayout 1 × 1 على لوحة JPanel الحالية، ثم قم بإضافة اللوحة الخاصة بك إلى لوحة JPanel تلك.المشكلة الوحيدة في GridLayout التي تكون 1 × 1 هي أنك لن تتمكن من وضع عناصر أخرى على JPanel.في هذه الحالة، سيكون عليك معرفة التصميم المناسب.يمكن لكل لوحة تستخدمها استخدام تخطيطها الخاص، لذا لن تكون هناك مشكلة.

هل أفهم هذا السؤال بشكل صحيح؟

ربما يقوم JOptionPane.showInternalInputDialog بما تريد.إذا لم يكن الأمر كذلك، سيكون من المفيد أن نفهم ما هو مفقود.

يوجد مدير تخطيط آخر قد يكون موضع اهتمام هنا: تخطيط التراكبوهنا برنامج تعليمي بسيط: تخطيط التراكب:لإدارة تخطيط المكونات التي تقع فوق بعضها البعض.يتيح لك Overlay Layout وضع اللوحات فوق بعضها البعض، وتعيين تخطيط داخل كل لوحة.يمكنك أيضًا ضبط حجم وموضع كل لوحة على حدة.

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

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