Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/386.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 在单个JFrame中使用多个JPanel_Java_Swing_Jframe_Jpanel_Jbutton - Fatal编程技术网

Java 在单个JFrame中使用多个JPanel

Java 在单个JFrame中使用多个JPanel,java,swing,jframe,jpanel,jbutton,Java,Swing,Jframe,Jpanel,Jbutton,我基本上一直在尝试通过使用JFrame并切换出2个JPanel(一个用于菜单,一个用于实际游戏)来为游戏制作菜单。我正在尝试实现我能想到的最基本的格式,但似乎无法让它工作。如果有人能解释代码的错误,我将不胜感激 这是我的JFrame、菜单面板和ActionListener package buttonMenu; import java.awt.BorderLayout; import java.awt.Button; import java.awt.Color; import java.awt

我基本上一直在尝试通过使用JFrame并切换出2个JPanel(一个用于菜单,一个用于实际游戏)来为游戏制作菜单。我正在尝试实现我能想到的最基本的格式,但似乎无法让它工作。如果有人能解释代码的错误,我将不胜感激

这是我的JFrame、菜单面板和ActionListener

package buttonMenu;

import java.awt.BorderLayout;
import java.awt.Button;
import java.awt.Color;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;

import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JPanel;

public class Skeleton extends JFrame implements ActionListener{

JPanel menu;
JButton button;

public Skeleton(){

setDefaultCloseOperation(EXIT_ON_CLOSE);
setSize(400, 400);
setVisible(true);

menu = new JPanel();
button = new JButton("button");

menu.setSize(400, 400);
menu.setBackground(Color.BLACK);
menu.setVisible(true);
menu.add(button);

button.setLocation(200, 200);
button.addActionListener(this);

add(menu, BorderLayout.CENTER);

}

public void actionPerformed(ActionEvent a){
    JPanel panel = Game.Game();
    this.remove(menu);
    this.add(panel);   
}

public static void main(String args[]){
    new Skeleton();
}
}
actionPerformed调用在此类中创建的面板

package buttonMenu;
import java.awt.Color;
import javax.swing.JPanel;
public class Game{

public static JPanel Game(){
    JPanel panel = new JPanel();
    panel.setSize(400, 400);
    panel.setBackground(Color.WHITE);
    return panel;       
}

}

同样,如果有人能向我解释一下这段代码的错误,我将不胜感激。谢谢

在添加/删除组件时,您需要重新验证父容器,以强制它将自身中继出去

public void actionPerformed(ActionEvent a){
    JPanel panel = Game.Game();
    this.remove(menu);
    this.add(panel);   
    this.revalidate();
}
一个更好的解决方案是使用类似于
CardLayout

请查看以了解更多详细信息


我应该补充一点。您应该避免直接从
JFrame
扩展,而是在基本组件上创建整个应用程序,如
JPanel
。当需要显示它时,创建JFrame的实例并将应用程序组件添加到其中。这样,您的应用程序在部署和重用方面变得更加灵活

在添加/删除组件时,您需要对父容器进行重新验证,以强制它将自身中继出去

public void actionPerformed(ActionEvent a){
    JPanel panel = Game.Game();
    this.remove(menu);
    this.add(panel);   
    this.revalidate();
}
一个更好的解决方案是使用类似于
CardLayout

请查看以了解更多详细信息

我应该补充一点。您应该避免直接从
JFrame
扩展,而是在基本组件上创建整个应用程序,如
JPanel
。当需要显示它时,创建JFrame的实例并将应用程序组件添加到其中。这样,您的应用程序在部署和重用方面变得更加灵活

使用validate()方法查看更改

public void actionPerformed(ActionEvent a){
    JPanel panel = Game.Game();
    this.remove(menu);
    this.add(panel);   
    this.validate();
}
使用validate()方法查看更改

public void actionPerformed(ActionEvent a){
    JPanel panel = Game.Game();
    this.remove(menu);
    this.add(panel);   
    this.validate();
}
我的代码有什么问题可能是一个模糊的问题,但我会整理一些要点:

  • 扩展JFrame
    :您并没有真正扩展
    JFrame
    ,您只是在使用一个,作为GUI的一部分
  • 正如其他答案所提到的,在添加/删除组件后,您应该
    revalidate()
  • menu.setVisible(true)
    ,通常不需要这样做
  • 也许没有错,但我通常先构建所有界面(即创建和添加初始组件),然后再设置框架的尺寸和可见性
  • 您正在运行
    main
    线程中的所有代码;Swing组件不是线程安全的。请参阅,以了解有关这方面的更多信息
  • 我知道这是一个游戏,但你的面板绝对定位真的需要吗?如果可能,请使用布局管理器(游戏面板除外,它可能只进行自定义绘制)
我的代码有什么问题可能是一个模糊的问题,但我将对以下几点进行分类:

  • 扩展JFrame
    :您并没有真正扩展
    JFrame
    ,您只是在使用一个,作为GUI的一部分
  • 正如其他答案所提到的,在添加/删除组件后,您应该
    revalidate()
  • menu.setVisible(true)
    ,通常不需要这样做
  • 也许没有错,但我通常先构建所有界面(即创建和添加初始组件),然后再设置框架的尺寸和可见性
  • 您正在运行
    main
    线程中的所有代码;Swing组件不是线程安全的。请参阅,以了解有关这方面的更多信息
  • 我知道这是一个游戏,但你的面板绝对定位真的需要吗?如果可能,请使用布局管理器(游戏面板除外,它可能只进行自定义绘制)

啊,很抱歉,我刚刚意识到我忘了指定我的代码在做什么。不过,谢谢你的建议,它现在正在工作。啊,很抱歉,我刚刚意识到我忘了指定我的代码在做什么。不过,谢谢你的建议,它现在可以工作了。谢谢你的建议,我从未使用过重新验证,但它现在可以工作了。另外,谢谢你的链接,看起来卡片的布局就是最好的选择。谢谢你的建议,我从来没有使用过重新验证,但现在它已经开始工作了。另外,谢谢你的链接,看起来卡片的布局就是最好的选择。