Frage

Ich entwickle ein SIM-Spiel auf Theme Hospital, die ganz ein altes Spiel ist. Ich habe viele Fortschritte bei den zugrunde liegenden Arbeiten gemacht, aber jetzt habe ich auf die GUI-Elemente komme, die ich nicht eine Menge vorher getan. Ich bin noch recht neu zu Java. Der Effekt, den ich zu schaffen versuchen ist wie hier gezeigt ...

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

Klicken Sie auf eine Schaltfläche, erscheint ein Fenster mit Registerkarten aus verschiedenen Auswahlen auszuwählen, und klicken Sie dann auf eine Schaltfläche, um einen Raum zu bauen. Ich glaube, für die „Tabs“ Ich habe ein Kartenlayout verwenden kann? Für die eigentlichen Gebäude des Zimmers, ich bin ziemlich sortiert. Das Hauptproblem ich jetzt habe, ist immer das Panel auf dem Klick auf eine Schaltfläche zu öffnen.

Bei den derzeitigen, ich habe 1 JFrame und 2 JPanels ontop, das Hauptspielkonsole und das Bedienfeld mit ein paar Tasten.

Kann mir jemand zeigen Sie mir etwas einfaches Beispiel, wie ich so etwas tun würde? Ich weiß, dass es wahrscheinlich wirklich einfach, und ich wette, einige von Ihnen sogar den Code aus der Spitze des Kopfes schreiben könnte, aber ich bin neu in Java, und habe gelernt, mehr über die logischen Elemente der Programmierung so weit, anstatt wie zu bauen eine komplexere mehrschichtige GUI wie in einem Spiel erforderlich.

Ich weiß, es ist ein ehrgeiziges Projekt, aber ich habe einen langen Weg gegangen, und habe sogar eigenen Pfad implementiert finde A * mit, die ich bin glücklich über (alle dank sie Menschen hier bei Stackoverflow!)

Vielen Dank im Voraus für Ihre Hilfe.

War es hilfreich?

Lösung

JDialogs funktionieren würde, aber sie werden neue Top-Level-Fenster über das Spiel-Fenster öffnen. Sie könnten Ihre Hauptspiel Anzeige- und Bedienfeld als Hintergrund eines JDesktopPane (die sich JLayeredPane), implementieren und konnte die Pop-ups JInternalFrames machen.

Ausgeklügelte (aber in Betrieb) Beispiel:

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);


}
}

Andere Tipps

  

Das Hauptproblem ich jetzt haben, ist   die Platte immer auf das zu öffnen,   Klicken Sie auf eine Schaltfläche.

Sie öffnen nicht eine andere Platte. Sie würden wahrscheinlich eine JDialog verwenden, die ein anderes Panel enthält. Sie könnten dann ein Cardlayout verwenden oder Sie können eine JTabbedPane im Dialog verwenden. Die Design-Entscheidungen sind bis zu Ihnen.

Ich schlage vor, Sie beginnen mit der Tutorial Schwingen Beispiele für alle Komponenten. Ich kann nicht wirklich irgendwelche Ratschläge bietet auf der Grafik des Programms. Dafür benötigen Sie spezifische Fragen zu starten. Aber Dialoge bauen, mit Platten und Komponenten ist einfach.

Die Schaltfläche Verarbeitung ist recht einfach. Sie müssen eine Klasse haben die ActionListener-Schnittstelle zu implementieren, und es muss mit Taste registriert werden. Sie können einige ziemlich klare Beispiele finden Sie unter hier .

Für die Elemente, die Sie bringen wollen, es sieht aus wie das, was Sie suchen kann im Wurzelbereich Rahmen in die Top-Level-Swing-Container gebaut gefunden werden. Hier ist ein Tutorial .

Der Wurzelbereich Framework umfasst die Glasscheibe, die eine klare Glasscheibe, die auf der Spitze des z-Ordnung Stapels der Top-Level-Komponenten sitzt, ist. Sie haben auch die Layered Pane, die Ihren Bedürfnissen ein bisschen mehr passen könnte. Es gibt ein Tutorial für das auch .

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top