Java JPanel转换,我的代码有什么问题?

Java JPanel转换,我的代码有什么问题?,java,swing,user-interface,jframe,jpanel,Java,Swing,User Interface,Jframe,Jpanel,我是java新手,每天都在学习新东西。 今天我偶然发现了一个错误,我就是无法纠正。 所以我有一个JFrame,里面有一个JPanel,现在我想在点击我的开始游戏JLabel时删除这个JPanel,并将它转换到我的游戏JPanel(现在我使用一个测试JPanel) JFrame类: import javax.swing.*; import java.awt.*; import java.awt.event.ActionEvent; import java.awt.event.ActionListe

我是java新手,每天都在学习新东西。 今天我偶然发现了一个错误,我就是无法纠正。 所以我有一个JFrame,里面有一个JPanel,现在我想在点击我的开始游戏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;
   }
}
游戏类别:

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初学者。

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

添加到JButton:
您的JB.addActionListener(此)(不要忘记对类实现
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();
Swing很难制作好的UI。您只需要在
remove()
之后使用
validate()


我希望它能有所帮助。

您的代码中有很多问题

  • 在事件分派线程上创建GUI
  • 不要扩展JFrame(你有三(三!)个JFrame漂浮在那里!)
  • 遵循命名约定
  • 不要过度使用静态方法
  • 只存储表示类状态真正需要的实例变量
  • 不要使用手动
    setSize
    setBounds
    调用。改用LayoutManager
  • 调用
    frame.setVisible(true)
    应该是框架完全组装后的最后一次调用
  • 考虑在面板之间切换的卡片布局()
稍微清理一下,但确切的结构取决于您最终想要实现的目标:

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命名为playlabel。playlabel=新的JButton(“Nieuw Spel”);对不起,谢谢!我知道我的代码仍然凌乱难看,但我正在努力做得更好!所以tnx对于你的帮助,我一定会查看卡片布局。