Domanda

Sto sviluppando un gioco di simulazione sulla base di Theme Hospital, che è piuttosto un vecchio gioco. Ho fatto un sacco di progressi sui meccanismi sottostanti, ma ora io vengo agli elementi GUI, che non ho fatto un sacco di prima. Sono ancora piuttosto nuovo a Java. L'effetto che sto cercando di creare è come mostrato qui ...

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

Fare clic su un pulsante, si apre un pannello con schede per scegliere tra diverse selezioni, e quindi fare clic su un pulsante per costruire una stanza. Credo che per le "schede" Posso usare un layout carta? Per la costruzione effettiva di camere, sto praticamente risolto. Il problema principale che ho in questo momento, sta ottenendo il pannello per aprire il clic di un pulsante.

A corrente, ho 1 JFrame e 2 JPanels ontop, pannello di gioco principale e il pannello di controllo con pochi pulsanti.

Qualcuno mi può mostrare qualche semplice esempio di come avrei fatto una cosa del genere? So che la sua probabilmente davvero semplice, e scommetto che alcuni di voi potrebbe anche scrivere il codice fuori dalla parte superiore della testa, ma io sono nuovo di Java, e è stato insegnato di più su elementi logici di programmazione finora piuttosto che come costruire una più complessa a più strati GUI come richiesto in un gioco.

Lo so che è un progetto ambizioso, ma ho percorso una lunga strada, e hanno anche implementato percorso personalizzato trovare usando A *, che ne sono felice (grazie a voi gente qui a StackOverflow!)

Grazie in anticipo per il vostro aiuto.

È stato utile?

Soluzione

JDialogs avrebbe funzionato, ma che stanno andando a pop-up di nuove finestre di livello superiore sopra la finestra di gioco. Si potrebbe implementare il pannello di visualizzazione di gioco e di controllo principale, come lo sfondo di un JDesktopPane (che si estende JLayeredPane), e potrebbe fare i pop up JInternalFrames.

Escogitato (ma di lavoro) esempio:

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


}
}

Altri suggerimenti

  

Il problema principale che ho in questo momento, è   ricevendo il pannello per aprire il   clic di un pulsante.

Non si apre un altro pannello. Si sarebbe probabilmente utilizzare un JDialog che contiene un altro pannello. È quindi possibile utilizzare un CardLayout o si potrebbe utilizzare un JTabbedPane nella finestra di dialogo. Le scelte progettuali sono da te.

Vi suggerisco di iniziare con la lettura della Altalena esercitazione per esempi di tutti i componenti. Non posso davvero offrire qualche consiglio sulla grafica del programma. Per questo è necessario per iniziare a fare domande specifiche. Ma la costruzione di finestre di dialogo, con pannelli e componenti è semplice.

L'elaborazione pulsante è abbastanza facile. È necessario disporre di una classe implementa l'interfaccia ActionListener, e ha bisogno di essere registrati con il tasto. È possibile vedere alcuni esempi abbastanza chiare qui .

Per i pannelli che si desidera far apparire, sembra che quello che stai cercando può essere trovato nel quadro Radice riquadro incorporato nei contenitori di Swing di livello superiore. Ecco un tutorial .

Il quadro pannello principale comprende la lastra di vetro, che è un riquadro chiaro che si trova in cima alla pila di ordine Z dei componenti di livello superiore. Hai anche il riquadro a strati, che potrebbe soddisfare le vostre esigenze un po 'di più. C'è un tutorial per quello pure .

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top