jpanel过渡,我的代码有什么问题



我是Java的新手,每天都在学习新事物。今天,我偶然发现了一个错误,我无法修复。因此,我在里面有一个带有jpanel的jframe,现在我想在单击"开始游戏" jlabel时删除jpanel,并将其过渡到我的游戏jpanel(现在我使用测试jpanel)

Jframe类:

import javax.swing.*;
import java.awt.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
public class MainMenu extends JFrame {
JPanel panel;
JFrame frame;
JButton playlabel;
 public void mainmenu()   {
    frame = new JFrame();
    panel = new JPanel();
    playlabel = new JButton ("Nieuw Spel");
//frame
    frame.setSize(new Dimension(800, 600));
    frame.getContentPane().setBackground(new Color(14,36,69));
    frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    frame.setMinimumSize(frame.getMinimumSize());  
    frame.setVisible(true);
//panel        
    Dimension expectedDimension = new Dimension(690, 540);
    panel.setLayout(new BoxLayout(panel, BoxLayout.Y_AXIS));
    panel.setPreferredSize(expectedDimension);
    panel.setMaximumSize(expectedDimension);
    panel.setMinimumSize(expectedDimension);
    panel.setBackground(new Color(14, 36, 69)); 
    panel.add(playlabel);
    playlabel.setAlignmentX(JComponent.CENTER_ALIGNMENT);
//playlabel        
    playlabel.setFont(new Font("Old English Text MT", Font.BOLD, 40));
    playlabel.setBounds(250, 350, 50, 20);
    playlabel.setForeground(new Color(217,144,39));
    playlabel.setBackground(new Color(14,36,69));
    playlabel.setBorderPainted(false);
    playlabel.setFocusPainted(false);
    playlabel.addActionListener(new PlayListener());
}
private class PlayListener extends JFrame implements ActionListener {
        public void actionPerformed(ActionEvent e) {
            JPanel panelgame = Game.Game();
            this.remove(panel);
            this.add(panelgame);
            this.revalidate();
        }
    }
}

游戏类:

package labyrinthproject.View;
import java.awt.Color;
import javax.swing.JPanel;
public class Game {
public static JPanel Game(){
    JPanel panel = new JPanel();
    panel.setSize(690, 540);
    panel.setBackground(new Color(255,36,69));
    return panel;
   }
}

如果有人可以向我解释为什么这不起作用,那将不胜感激!非常感谢!

真诚的,初学者Java学生。

您的代码中有很多问题

  • 在事件调度线程上创建GUI
  • 不要扩展jframe(您有三个(三个!)jframes浮在那里!)
  • 遵循命名约定
  • 不要过度使用静态方法
  • 仅存储您的实例变量需要表示您的类状态
  • 请勿使用手动setSizesetBounds调用。改用LayoutManager
  • 在完全组装框架之后,对frame.setVisible(true)的呼叫应为调用
  • 考虑用于在面板之间切换的纸牌仪(http://docs.oracle.com/javase/tutorial/uiswing/layout/card.html)

略微清理,但确切的结构取决于您最终要实现的目标:

import java.awt.Color;
import java.awt.Dimension;
import java.awt.Font;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import javax.swing.BoxLayout;
import javax.swing.JButton;
import javax.swing.JComponent;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.SwingUtilities;
public class MainMenu extends JPanel
{
    public static void main(String[] args)
    {
        SwingUtilities.invokeLater(new Runnable()
        {
            @Override
            public void run()
            {
                createAndShowGUI();
            }
        });
    }
    private static void createAndShowGUI()
    {
        JFrame mainFrame = new JFrame();
        mainFrame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        JPanel mainMenu = new MainMenu();
        mainFrame.getContentPane().add(mainMenu);
        mainFrame.pack();
        mainFrame.setLocationRelativeTo(null);
        mainFrame.setVisible(true);
    }
    MainMenu()
    {
        setLayout(new BoxLayout(this, BoxLayout.Y_AXIS));
        Dimension expectedDimension = new Dimension(690, 540);
        setPreferredSize(expectedDimension);
        setBackground(new Color(14, 36, 69));
        JButton newGameButton = new JButton ("Nieuw Spel");
        newGameButton.setAlignmentX(JComponent.CENTER_ALIGNMENT);
        newGameButton.setFont(new Font("Old English Text MT", Font.BOLD, 40));
        newGameButton.setForeground(new Color(217,144,39));
        newGameButton.setBackground(new Color(14,36,69));
        newGameButton.setBorderPainted(false);
        newGameButton.setFocusPainted(false);
        newGameButton.addActionListener(new PlayListener());
        add(newGameButton);
    }
    private class PlayListener implements ActionListener 
    {
        @Override
        public void actionPerformed(ActionEvent e) 
        {
            removeAll();
            GamePanel gamePanel = new GamePanel();
            add(gamePanel);
            revalidate();
        }
    }
}
class GamePanel extends JPanel
{
    GamePanel()
    {
        setBackground(new Color(255,36,69));
    }
}

您应该使用JButton而不是JLabel。然后:

您添加到jbutton: Your_JB.addActionListener(this);(别忘了在您的课程中实现ActionListener)。

现在,我们将添加检测器:

@Override
    public void actionPerformed(ActionEvent e){
        Object src = e.getSource();
                if(src == Your_JB){
                    panel.setVisible(false);
                }
    }

单击按钮时,它会使面板失去。

尝试以下:

this.remove(panel);
this.validate();
this.repaint();  //if you use paintComponent 
this.add(panelgame);
this.revalidate();

摇摆很难制作好UI。您只需要在remove()之后使用validate()

我希望它有帮助。

最新更新