سؤال

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

http://www.tubechop.com/watch/18438.

انقر على زر، ثم فتح لوحة مع علامات تبويب لتحديد من اختيارات مختلفة، ثم انقر فوق زر لإنشاء غرفة. أعتقد أن "علامات التبويب" يمكنني استخدام تخطيط البطاقة؟ بالنسبة للبناء الفعلي للغرف، أنا مرتبة كبيرة. المشكلة الرئيسية التي لدي الآن، هي الحصول على لوحة للفتح بنقرة زر واحدة.

في التيار، لدي 1 JFrame و 2 JPanels Ontop، لوحة اللعبة الرئيسية ولوحة التحكم مع عدد قليل من الأزرار.

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

أعلم أنه مشروع طموح، لكنني قطعت شوطا طويلا، وقد قامت بتنفيذ مسار مخصص في العثور على A *، الذي أسعد به (كل ذلك بفضل أشخاص هنا في Stackoverflow!)

شكرا لكم مقدما على مساعدتكم.

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

المحلول

ستعمل JDialogs، لكنهم ذاهبون إلى أن ينبثق نوافذ جديدة أعلى مستوى عبر نافذة اللعبة الخاصة بك. يمكنك تطبيق لوحة عرض اللعبة الرئيسية الخاصة بك والتحكم كخلفية من jdesktoppane (والتي تمتد Jlayeredpane)، ويمكن أن تجعل منبثقة ups jinternalframes.

مثال مفتون (ولكن العمل):

import javax.swing.*;
import java.awt.*;
import java.awt.event.ActionEvent;
import java.awt.event.ComponentEvent;
import java.awt.event.ComponentAdapter;
import java.awt.event.ActionListener;
import java.text.NumberFormat;

public class DesktopTest extends JFrame {

private JDesktopPane desktop;
private JPanel background;
private JInternalFrame firstFrame;
private JInternalFrame secondFrame;

public DesktopTest() {
    super("DesktopTest");

    desktop = new JDesktopPane();
    setContentPane(desktop);

    background = new JPanel(new BorderLayout());
    JToolBar toolbar = new JToolBar();
    toolbar.add(new AbstractAction("1") {

        public void actionPerformed(ActionEvent actionEvent) {
            firstFrame.setVisible(true);
        }
    });

    toolbar.add(new AbstractAction("2") {

        public void actionPerformed(ActionEvent actionEvent) {
            secondFrame.setVisible(true);
        }
    });
    AddPanel addPanel = new AddPanel();
    background.add(addPanel, BorderLayout.CENTER);
    background.add(toolbar, BorderLayout.SOUTH);
    addComponentListener(new ComponentAdapter() {

        public void componentResized(ComponentEvent componentEvent) {
            background.setSize(desktop.getSize());
            background.revalidate();
            background.repaint();
        }

        public void componentShown(ComponentEvent componentEvent) {
            background.setSize(desktop.getSize());
            background.revalidate();
            background.repaint();
        }
    });
    desktop.add(background);

    firstFrame = new TermFrame("First Term", "Update First Term: ", addPanel) {

        protected int getValue() {
            return addPanel.getFirst();
        }

        protected void update(int value) {
            addPanel.setFirst(value);
        }
    };
    firstFrame.pack();
    firstFrame.setBounds(10, 10, 200, 150);
    desktop.add(firstFrame);

    secondFrame = new TermFrame("Second Term", "Update Second Term: ", addPanel){

        protected int getValue() {
            return addPanel.getSecond();
        }

        protected void update(int value) {
            addPanel.setSecond(value);
        }
    };
    secondFrame.pack();
    secondFrame.setBounds(200, 200, 200, 150);
    desktop.add(secondFrame);

}

public static void main(String[] args) {
    JFrame f = new DesktopTest();
    f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    f.setSize(400, 400);
    f.setLocationRelativeTo(null);
    f.setVisible(true);
}

static class AddPanel extends JPanel {
    private JLabel first;
    private JLabel second;
    private JLabel result;

    public AddPanel() {
        first = new JLabel("0");
        second = new JLabel("0");
        result = new JLabel("0");

        Box vertical = Box.createVerticalBox();
        vertical.add(Box.createVerticalGlue());
        Box horizontal = Box.createHorizontalBox();
        horizontal.add(Box.createHorizontalGlue());
        horizontal.add(first);
        horizontal.add(new JLabel("+"));
        horizontal.add(second);
        horizontal.add(new JLabel("="));
        horizontal.add(result);
        horizontal.add(Box.createHorizontalGlue());
        vertical.add(horizontal);
        vertical.add(Box.createVerticalGlue());

        setLayout(new BorderLayout());
        add(vertical, BorderLayout.CENTER);
    }

    public void setFirst(int i) {
        first.setText(Integer.toString(i));
        updateResult();
    }

    public int getFirst() {
        return Integer.parseInt(first.getText());
    }

    public void setSecond(int j) {
        second.setText(Integer.toString(j));
        updateResult();
    }

    public int getSecond() {
        return Integer.parseInt(second.getText());
    }

    private void updateResult() {
        int i = Integer.parseInt(first.getText());
        int j = Integer.parseInt(second.getText());
        result.setText(Integer.toString(i + j));
        revalidate();
    }
}

static abstract class TermFrame extends JInternalFrame {

    protected AddPanel addPanel;
    private JFormattedTextField termField;

    public TermFrame(String title, String message, AddPanel addPanel) {
        super(title, true, true, true);
        this.addPanel = addPanel;
        NumberFormat format = NumberFormat.getNumberInstance();
        format.setMaximumFractionDigits(0);
        termField = new JFormattedTextField(format);
        termField.setColumns(3);
        termField.setValue(getValue());

        JPanel content = new JPanel(new FlowLayout());
        content.add(new JLabel(message));
        content.add(termField);
        JButton apply = new JButton("apply");
        apply.addActionListener(new ActionListener() {

            public void actionPerformed(ActionEvent actionEvent) {
                Integer value = Integer.parseInt(termField.getText());
                update(value);
            }
        });
        content.add(apply);
        setContentPane(content);

        setDefaultCloseOperation(JInternalFrame.HIDE_ON_CLOSE);
    }

    protected abstract int getValue();

    protected abstract void update(int value);


}
}

نصائح أخرى

المشكلة الرئيسية التي لدي الآن، هي الحصول على لوحة للفتح بنقرة زر واحدة.

أنت لا تفتح لوحة أخرى. ربما ستستخدم Jdialog يحتوي على لوحة أخرى. يمكنك بعد ذلك استخدام CardLayout أو يمكنك استخدام JTABBEDPANE على مربع الحوار. خيارات التصميم متروك لك.

أقترح عليك أن تبدأ بقراءة Swing Tutorial. للحصول على أمثلة على جميع المكونات. لا أستطيع حقا تقديم أي نصيحة حول رسومات البرنامج. لأنك تحتاج إلى البدء في طرح أسئلة محددة. لكن بناء الحوار، مع الألواح والمكونات مستقيم إلى الأمام.

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

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

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

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