2009-07-11 13 views
1

Ich entwickle ein Sim-Spiel auf der Grundlage von Theme Hospital, die ein ziemlich altes Spiel ist. Ich habe viele Fortschritte bei den zugrunde liegenden Arbeiten gemacht, aber jetzt komme ich zu den GUI-Elementen, die ich vorher nicht sehr oft gemacht habe. Ich bin immer noch ziemlich neu in Java. Der Effekt, den ich zu schaffen versuche ist wie hier ...Layering viele JPanels und fügen sie im laufenden Betrieb

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

Klicken Sie auf eine Schaltfläche, ein Panel mit Registerkarten aus verschiedenen Auswahlen auswählen eröffnet gezeigt, und klicken Sie dann auf eine Schaltfläche, um einen Raum zu bauen . Ich glaube für die "Tabs" kann ich ein Kartenlayout verwenden? Für den eigentlichen Zimmerbau bin ich ziemlich sortiert. Das Hauptproblem, das ich gerade habe, besteht darin, das Panel auf Knopfdruck zu öffnen.

Zur Zeit habe ich 1 JFrame und 2 JPanels ontop, das Hauptspielfeld und das Bedienfeld mit ein paar Tasten.

Kann mir jemand ein einfaches Beispiel zeigen, wie ich so etwas tun würde? Ich weiß, dass es wahrscheinlich sehr einfach ist, und ich wette, einige von Ihnen könnten sogar den Code von Kopf bis Fuß schreiben, aber ich bin neu in Java und habe mehr über die logischen Elemente der Programmierung gelernt, als über das Bauen eine komplexere mehrschichtige GUI, wie sie in einem Spiel benötigt wird.

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.

+0

Ich kann nicht helfen, aber viel Glück! Was für ein großartiges Spiel das war. Wird dies eine kommerzielle Veröffentlichung sein? – JoshJordan

+0

Danke. Auf keinen Fall mein Freund, Freeware Open Source den ganzen Weg. Ich hoffe, dass es ein Projekt wird, das groß genug ist, um so etwas wie OTTD zu bemerken. Während OTTD mir viele Stunden Spaß brachte, war das erste Sim-Spiel, das ich spielte, das Theme Hospital. Ich möchte die Erinnerungen teilen, TH mit Leuten zu spielen, mit einem modernen Twist und aufregendem neuem Gameplay! :) – Relequestual

+0

Haben Sie eine Website für diese läuft? Ich wage zu sagen, dass ich daran interessiert sein könnte, etwas beizutragen. – JoshJordan

Antwort

2

JDialogs würde funktionieren, aber sie werden neue Top-Level-Fenster über Ihr Spielfenster öffnen. Sie könnten Ihr Hauptspiel-Anzeige- und Kontrollfeld als Hintergrund eines JDesktopPane (der JLayeredPane erweitert) implementieren und die Pop-ups JInternalFrames erstellen.

Ausgeklügelte (aber funktioniert) 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); 


} 
} 
+0

Das sieht für mich genau das aus, was ich suche. Vielen Dank. Hat jemand irgendwelche Kommentare dazu? Ist es gut oder schlecht, so zu üben, oder nur bis zur individuellen Vorliebe? – Relequestual

+0

Hallo Nate. Ich habe Probleme, es in mein Projekt zu implementieren. Ich habe wahrscheinlich einen sehr dummen Fehler gemacht, aber habe jetzt seit ungefähr 2-3 Stunden gezweckt, also dachte ich es ist Zeit zu fragen, bevor ich es wieder vermassle ... hier ist ein Link zu dem, was ich für die relevanten Bits des Codes halte ... http://sniptor.org/kpJ Vielen Dank im Voraus – Relequestual

+0

Mein schlechtes, ich habe das MainPane zweimal definiert. Fortschritt! :) jetzt habe ich ein anderes lustiges Problem, aber hoffentlich werde ich es bekommen! – Relequestual

0

Das Hauptproblem ich jetzt habe, ist das Panel immer auf dem auf Knopfdruck zu öffnen.

Sie öffnen kein anderes Panel. Sie würden wahrscheinlich einen JDialog verwenden, der ein anderes Panel enthält. Sie könnten dann ein CardLayout verwenden oder Sie könnten ein JTabbedPane im Dialog verwenden. Die Designauswahl liegt bei Ihnen.

Ich schlage vor, Sie beginnen mit dem Lesen der Swing tutorial für Beispiele aller Komponenten. Ich kann keine Ratschläge zu den Grafiken des Programms geben. Dafür müssen Sie bestimmte Fragen stellen. Der Aufbau von Dialogen mit Panels und Komponenten ist jedoch unkompliziert.

0

Die Schaltfläche Verarbeitung ist ziemlich einfach. Sie müssen eine Klasse implementieren die ActionListener Schnittstelle, und es muss mit Ihrer Schaltfläche registriert werden. Sie können einige ziemlich klare Beispiele sehen here.

Für die Panels, die Sie anzeigen möchten, sieht es aus, als ob Sie nach dem suchen, was Sie suchen, innerhalb des Root Pane-Frameworks, das in die Swing-Container der obersten Ebene integriert ist. Here is a tutorial.

Das Stammbereich-Framework enthält die Glasfläche, bei der es sich um eine übersichtliche Fläche handelt, die sich auf der obersten Ebene des Z-Reihenfolge-Stacks der Top-Level-Komponenten befindet. Sie haben auch den Layered Pane, der Ihren Bedürfnissen ein bisschen mehr entspricht. Es gibt eine tutorial for that as well.

Verwandte Themen