Слои много JPanels и добавление их на лету - PullRequest
1 голос
/ 12 июля 2009

Я разрабатываю симулятор на основе Theme Hospital, довольно старой игры. Я добился большого прогресса в основной работе, однако сейчас я перехожу к элементам графического интерфейса, чего раньше не делал. Я все еще довольно новичок в Java. Эффект, который я пытаюсь создать, показан здесь ...

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

Нажмите кнопку, откроется панель с вкладками для выбора из различных вариантов, а затем нажмите кнопку, чтобы построить комнату. Я считаю, что для «вкладок» я могу использовать макет карты? По фактическому строительству комнат я в значительной степени отсортирован. Основная проблема, с которой я столкнулся на данный момент, - это открытие панели одним нажатием кнопки.

На данный момент у меня есть 1 JFrame и 2 JPanels сверху, основная игровая панель и панель управления с несколькими кнопками.

Может кто-нибудь показать мне простой пример того, как я мог бы сделать такую ​​вещь? Я знаю, что это, вероятно, очень просто, и я уверен, что некоторые из вас могли бы даже написать код с ног на голову, но я новичок в Java, и до сих пор меня больше учили о логических элементах программирования, а не о том, как создавать более сложный многослойный графический интерфейс, необходимый для игры.

Я знаю, что это амбициозный проект, но я прошел долгий путь и даже реализовал пользовательский поиск пути с использованием A *, что меня радует (все, спасибо вам, сотрудники StackOverflow!)

Заранее благодарю за помощь.

Ответы [ 3 ]

2 голосов
/ 12 июля 2009

JDialogs будет работать, но они будут открывать новые окна верхнего уровня над окном вашей игры. Вы можете реализовать свой основной игровой дисплей и панель управления в качестве фона JDesktopPane (который расширяет JLayeredPane), и можете сделать всплывающие окна 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);


}
}
0 голосов
/ 12 июля 2009

Обработка кнопок довольно проста. У вас должен быть класс, реализующий интерфейс ActionListener, и он должен быть зарегистрирован вашей кнопкой. Вы можете увидеть несколько довольно четких примеров здесь .

Для панелей, которые вы хотите вызвать, похоже, что то, что вы ищете, может быть найдено в рамках Root Pane, встроенной в контейнеры Swing верхнего уровня. Вот учебник .

Структура Root Pane включает в себя Glass Pane, которая представляет собой прозрачную панель, которая находится на вершине стека z-порядка компонентов верхнего уровня. У вас также есть Многослойная панель, которая может удовлетворить ваши потребности немного больше. Для этого есть учебник .

0 голосов
/ 12 июля 2009

Основная проблема, с которой я столкнулся сейчас, это получить панель, чтобы открыть на щелчок кнопки.

Вы не открываете другую панель. Возможно, вы бы использовали JDialog, который содержит другую панель. Затем вы можете использовать CardLayout или JTabbedPane в диалоговом окне. Выбор дизайна зависит от вас.

Я предлагаю начать с чтения учебника Swing с примерами всех компонентов. Я не могу дать совет по графике программы. Для этого вам нужно начать задавать конкретные вопросы. Но строить диалоги с панелями и компонентами просто.

...