Pregunta

Estoy desarrollando un juego de simulación basado en Theme Hospital, que es muy un viejo juego. He hecho muchos progresos en el funcionamiento subyacentes, sin embargo, ahora estoy llegando a los elementos de la GUI, que no he hecho mucho antes. Estoy todavía bastante nuevo en java. El efecto que estoy tratando de crear es como se muestra aquí ...

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

Haga clic en un botón, se abre un panel con pestañas para seleccionar entre diferentes selecciones y, a continuación, haga clic en un botón para construir una habitación. Creo que para las "pestañas" Puedo usar un diseño de la tarjeta? Para la construcción real de habitaciones, estoy más o menos ordenada. El principal problema que tengo en este momento, se está poniendo el panel para abrir en el clic de un botón.

En la actual, tengo 1 JFrame y 2 JPanels sábana, el panel de juego principal y el panel de control con un par de botones.

¿Alguien puede mostrar algún ejemplo sencillo de cómo iba a hacer tal cosa? Sé que es probablemente muy simple, y apuesto a que algunos de ustedes incluso podría escribir el código de la parte superior de la cabeza, pero yo soy nuevo en java, y han enseñado más sobre los elementos lógicos de programación hasta ahora en lugar de cómo construir una interfaz gráfica de usuario más compleja de múltiples capas como se requiere en un juego.

Sé que es un proyecto ambicioso, pero he recorrido un largo camino, e incluso han implementado ruta personalizada encontrar usando A *, que estoy feliz por (todo gracias a ustedes aquí en StackOverflow!)

Gracias de antemano por su ayuda.

¿Fue útil?

Solución

JDialogs funcionarían, pero van a aparecer nuevas ventanas de nivel superior sobre su ventana de juego. Se podría implementar su principal pantalla del juego y panel de control como el fondo de un JDesktopPane (que se extiende JLayeredPane), y podría hacer que los JInternalFrames pop ups.

Contrived (pero trabajando) ejemplo:

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


}
}

Otros consejos

  

El principal problema que tengo en este momento, es   conseguir el panel para abrir el   clic de un botón.

No abrir otro panel. Es probable que utilice un JDialog que contiene otro panel. A continuación, podría utilizar un CardLayout o se puede utilizar un JTabbedPane en el diálogo. Las opciones de diseño son de usted.

Le sugiero que comience por leer el oscilación tutorial para ejemplos de todos los componentes. Realmente no puedo ofrecer algún consejo sobre los gráficos del programa. Para que usted necesita para empezar a hacer preguntas específicas. Pero la construcción de diálogos, con paneles y componentes es sencillo.

El procesamiento de botón es bastante fácil. Es necesario tener una clase implementa la interfaz ActionListener, y tiene que estar registrado en el botón. Puede ver algunos ejemplos bastante claros aquí .

Para los paneles que desea que aparezca, parece que lo que está buscando se pueden encontrar en el marco panel raíz incorporado en los contenedores Swing de alto nivel. Aquí hay un tutorial .

El marco panel raíz incluye la hoja de vidrio, que es un panel transparente que se encuentra en la parte superior de la pila z-orden de los componentes de nivel superior. También tiene la layeredpane, lo que podría satisfacer sus necesidades un poco más. Hay una tutorial para que así .

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top