Изменение Jpanels

Я пытаюсь сделать так, чтобы он отображал один JPanel и удалял другой, в зависимости от того, какой таймер выключен в Java. вот фрагмент кода. mainMenu и pongField являются JPanels, и это внутри таймера, который действует каждую миллисекунду;

if (SwingUtilities.getAncestorOfClass(JFrame.class, pongField) != null){
    if (!pongField.getTimer().isRunning())
    {
        mainMenu = new MainMenu(screenX, screenY, myColor, background, contentPane);
        contentPane.remove(pongField);
    }}
    if (SwingUtilities.getAncestorOfClass(JFrame.class, mainMenu) != null){
    if (!mainMenu.getTimer().isRunning())
    {
        switch(mainMenu.getButton())
        {
        case 1:
            pongField = new PongField(screenX, screenY, 0, moderator, player1UpControl, player2UpControl, player1DownControl, player2DownControl, myColor, background, contentPane, speed);
            mainMenu.setButton(0);
            contentPane.remove(mainMenu);
            break;
        case 2:

            break;
        case 3:

            break;
        case 4:

            break;
        }
    }}

позвольте мне быть немного более конкретным. Я пытаюсь сделать Понг, и одна JPanel - это настоящая игра, а другая - главное меню. если игра заканчивается, таймер останавливается, и если я нажимаю кнопку в главном меню, таймер останавливается и устанавливает для getButton() число, зависящее от того, какая кнопка нажата. например, если кнопка однопользовательской игры нажата, она создает игру и избавляется от текущей Jpanel. но если игра заканчивается, она избавляется от текущего JPanel и отображает главное меню. Также каждый JPanel при создании устанавливает свои собственные границы, цвет фона и добавляет себя в JFrame.

Проблема в том, что когда я запускаю игру и игра заканчивается, она не меняется обратно, если я не сверну ее и не верну обратно, но тогда кнопка не будет работать. Вот код для MainMenu. Код PongField слишком длинный, но я думаю, что суммировал то, что он сделал достаточно хорошо, но я также могу опубликовать его, если хотите.

открытый класс MainMenu extends JPanel {частная статическая конечная длинная serialVersionUID = 1L;

//JButtons
private JButton singleJButton, multiJButton, settingsJButton, exitJButton;

//timer if game is still on
private Timer runningTimer;

//JLabel for title
private JLabel titleJLabel;

//screen size
int screenX, screenY;

//color of text and background
private Color myColor, background;

//Container of the JFrame
private Container contentPane;

//which button was clicked
private int buttonPressed;

public MainMenu(int x, int y, Color myC, Color backg, Container contentP)
{
    super();

    //Initialize all given variables
    screenX = x;
    screenY = y;
    myColor = myC;
    background = backg;
    contentPane = contentP;


    setBounds(0,0,screenX,screenY);
    setBackground(background);
    contentPane.add(this);
    setFocusable(true);
    requestFocusInWindow();

    singleJButton = new JButton();
    singleJButton.setBounds(100, 100, 100, 50);
    singleJButton.setText("Single Player");
    singleJButton.setFocusable(false);
    contentPane.add(singleJButton);
    singleJButton.addActionListener(new ActionListener()
    {public void actionPerformed( ActionEvent event )
    {singleJButtonAction(event);}});

    runningTimer = new Timer( 30, new ActionListener() 
    {public void actionPerformed( ActionEvent event )
    {}});

    runningTimer.start();
}

public Timer getTimer()
{
    return runningTimer;
}

public int getButton()
{
    return buttonPressed;
}

public void setButton(int val)
{
    buttonPressed = val;
}

private void singleJButtonAction(ActionEvent e)
{
    runningTimer.stop();
    buttonPressed = 1;
}

//make this panel have focus
public void focus()
{
    requestFocusInWindow();
}

2 ответа

Решение

Что, это не работает? Я просто догадываюсь, потому что ты не говоришь.

Первое, что я вижу, если вы создаете и удаляете панели динамически. Было бы эффективнее просто спрятать их. Конечно, я не знаю, как выглядит ваш макет. Другой вариант состоит в том, чтобы просто создать их при запуске со всеми другими элементами графического интерфейса, добавить и удалить их, но не создавать их заново по таймеру. Просто покажи их и спрячь как нужно. Как это:

mainMenu.setVisible( true );
mainMenu.setVisible( false );

Каждую миллисекунду, если тоже довольно быстро. Я смотрю на ускорение, скажем, одну секунду или около того. Конечно, это зависит от того, что вы делаете.

НТН

У меня все еще есть проблема с пониманием, что ваш вопрос?

Одна вещь, которая, кажется, отсутствует в коде, это то, где вы добавляете mainMenu и pongField, которые вы создаете. Вы удаляете их из панели содержимого contentPane.remove(pongField); а также contentPane.remove(mainMenu); это твоя проблема?

Другие вопросы по тегам