Наслоение множества JPanels и добавление их на лету

StackOverflow https://stackoverflow.com/questions/1114894

  •  12-09-2019
  •  | 
  •  

Вопрос

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

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

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

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

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

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

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

Это было полезно?

Решение

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


}
}

Другие советы

Основная проблема, с которой я сталкиваюсь прямо сейчас, заключается в том, чтобы панель открывалась при нажатии кнопки.

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

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

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

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

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top