JPanel过渡,我的代码出了什么问题?

时间:2014-03-09 14:53:32

标签: java swing user-interface jframe 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学生。

3 个答案:

答案 0 :(得分:1)

您的代码中存在一些问题

  • 在事件派发线程上创建GUI
  • 不要扩展JFrame(你有三个(三个!)JFrame在那里漂浮!)
  • 遵循命名惯例
  • 不要过度使用静态方法
  • 仅存储真正需要代表您的班级状态的实例变量
  • 请勿使用手动setSizesetBounds来电。改为使用LayoutManager
  • 在框架完全组装完成后,对frame.setVisible(true)的调用应为最后调用
  • 考虑使用CardLayout在面板之间切换(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));
    }
}

答案 1 :(得分:0)

您应该使用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);
                }
    }

当您点击该按钮时,它将使您的面板消失。

答案 2 :(得分:0)

试试这个:

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

Swing很难做出漂亮的用户界面。您只需在validate()之后使用remove()

我希望它有用。