Java JPanel有时只显示组件

Java JPanel有时只显示组件,java,swing,jframe,jpanel,Java,Swing,Jframe,Jpanel,我和杰帕内尔有点问题。我对Swing和所有东西都是新手,所以有些可能是不正确的。任何帮助都将不胜感激。当调用battleGUISelection方法时,问题发生在第二个类中。有时会显示,但其他时候,如通过teachMove方法添加新移动后,它会显示为空白。JLabel将完全不可见,直到我将光标悬停在按钮上,按钮才会出现 这是我到目前为止所拥有的 import java.util.*; @SuppressWarnings("unchecked") public class Battle { p

我和杰帕内尔有点问题。我对Swing和所有东西都是新手,所以有些可能是不正确的。任何帮助都将不胜感激。当调用battleGUISelection方法时,问题发生在第二个类中。有时会显示,但其他时候,如通过teachMove方法添加新移动后,它会显示为空白。JLabel将完全不可见,直到我将光标悬停在按钮上,按钮才会出现

这是我到目前为止所拥有的

import java.util.*;

@SuppressWarnings("unchecked")
public class Battle {

public int hp;
public String name;
public ArrayList<String> moves = new ArrayList<String>();   
public ArrayList<Integer> damages = new ArrayList<Integer>();

public Battle(String name_in)
{
    name = name_in;

    moves.add("punch");
    moves.add("kick");
    moves.add("slam");

    damages.add(10);
    damages.add(15);
    damages.add(20);
}



public void setHp(Battle player, int amt)
{
    player.hp = amt;
}

public void revive(Battle player, String difficulty_in)
{
    if(difficulty_in.equals("beginner"))
    {
        player.hp = 50;
    }
    else if(difficulty_in.equals("intermediate"))
    {
        player.hp = 75;
    }
    else if(difficulty_in.equals("expert"))
    {
        player.hp = 100;
    }
}
}
import java.util.*;
@抑制警告(“未选中”)
公开阶级斗争{
公共int hp;
公共字符串名称;
public ArrayList moves=new ArrayList();
公共ArrayList损害赔偿=新ArrayList();
公共战斗(字符串名称_in)
{
name=name_in;
移动。添加(“冲压”);
移动。添加(“踢”);
移动。添加(“猛击”);
增加第(10)款;
增加(15);
增加(20);
}
公共无效setHp(战斗玩家,智力值)
{
player.hp=amt;
}
公共虚空复活(战斗玩家,弦乐难度)
{
如果(难度等于(“初学者”))
{
player.hp=50;
}
否则如果(难度等于(“中间”))
{
player.hp=75;
}
否则(难度等于(“专家”))
{
player.hp=100;
}
}
}
还有gui类

import java.awt.*;
import java.util.*;
import java.awt.event.*;
import javax.swing.*;

public class GUIFrameTest extends JFrame {

        JPanel panel = new JPanel();
        JButton begButton = new JButton("Beginner");
        JButton intermButton = new JButton("Intermediate");
        JButton expertButton = new JButton("Expert");
        JButton okButton = new JButton("OK");
        JLabel title = new JLabel("SELECT DIFFICULTY");
        JLabel label = new JLabel();
        JLabel txtLabel = new JLabel();
        TextField name = new TextField();    

    static Battle newPlayer = new Battle("");
    static Battle enemyBeginner = new Battle("OPPONENT");
    static Battle enemyIntermediate = new Battle("OPPONENT");
static Battle enemyExpert = new Battle("OPPONENT");
static Battle enemy;
static String difficulty;

public GUIFrameTest(String windowName) 
{
    super(windowName);

    final Container c = getContentPane();
    panel.setLayout(null);

    //panel.setBounds(0, 0, 500, 500);

    begButton.setBounds(0, 25, 100, 50);
    intermButton.setBounds(125, 25, 110, 50);
    expertButton.setBounds(255, 25, 100, 50);
    label.setBounds(0, 100, 200, 50);
    name.setBounds(188, 225, 125, 25);
    txtLabel.setBounds(188, 178, 125, 50);
    okButton.setBounds(200, 255, 100, 25);
    title.setBounds(0, 0, 150, 15);

    txtLabel.setText("Enter name of player: ");


    begButton.addActionListener(new AbstractAction("add"){
        @Override
        public void actionPerformed(ActionEvent e){
            label.setText("Difficulty set to beginner");
            difficulty = "beginner";
            newPlayer.setHp(newPlayer, 50);
            enemyBeginner.setHp(enemyBeginner, 50);
            enemyBeginner.moves.add("punch");
            enemyBeginner.moves.add("kick");
            enemyBeginner.damages.add(10);
            enemyBeginner.damages.add(10);
            enemy = enemyBeginner;
        }
    });
    intermButton.addActionListener(new AbstractAction("add"){
        @Override
        public void actionPerformed(ActionEvent e){
            label.setText("Difficulty set to intermediate");
            difficulty = "intermediate";
            newPlayer.setHp(newPlayer, 75);
            enemyIntermediate.setHp(enemyIntermediate, 75);
            enemyIntermediate.moves.add("punch");
            enemyIntermediate.moves.add("kick");
            enemyIntermediate.moves.add("slam");
            enemyIntermediate.damages.add(20);
            enemyIntermediate.damages.add(15);
            enemyIntermediate.damages.add(25); 
            enemy = enemyIntermediate;
        }
    });
    expertButton.addActionListener(new AbstractAction("add"){
        @Override
        public void actionPerformed(ActionEvent e){
            label.setText("Difficulty set to expert");
            difficulty = "expert";
            newPlayer.setHp(newPlayer, 100);
            enemyExpert.setHp(enemyExpert, 100);
            enemyExpert.moves.add("super punch");
            enemyExpert.moves.add("smash");
            enemyExpert.moves.add("jump kick");
            enemyExpert.damages.add(20);
            enemyExpert.damages.add(25);
            enemyExpert.damages.add(30); 
            enemy = enemyExpert;

        }
    });
    okButton.addActionListener(new AbstractAction("add"){
        @Override
        public void actionPerformed(ActionEvent e){
            newPlayer.name = name.getText();
            panel.removeAll();
            panel.updateUI();
            battleGUISelection(c);
        }
    });

    panel.add(begButton);
    panel.add(intermButton);
    panel.add(expertButton);
    panel.add(label);
    panel.add(name);
    panel.add(txtLabel);
    panel.add(okButton);
    panel.add(title);

    panel.setBackground(Color.WHITE);

    c.add(panel);           
}

public static void battleGUISelection(final Container c)
{       
    int yCoord = 100;

    final JPanel nextPanel = new JPanel();
    JLabel title = new JLabel();

    nextPanel.updateUI();

    ArrayList<JLabel> moveLabelList = new ArrayList<JLabel>();
    ArrayList<JLabel> damageLabelList = new ArrayList<JLabel>();

    title.setText("Moves Known: ");
    title.setBounds(200, 75, 100, 30);

    nextPanel.setLayout(null);  

    JButton battleButton = new JButton("Battle");
    JButton moveButton = new JButton("Teach Moves");
    JButton healButton = new JButton("Heal");

    battleButton.setBounds(0, 360, 500, 30);
    moveButton.setBounds(0, 390, 500, 30);
    healButton.setBounds(0, 420, 500, 30);

    moveButton.addActionListener(new AbstractAction("add"){
        @Override
        public void actionPerformed(ActionEvent e){
            nextPanel.removeAll();
            nextPanel.updateUI();
            teachMove(c, nextPanel);

        }
    });

    nextPanel.add(battleButton);
    nextPanel.add(moveButton);
    nextPanel.add(healButton);
    nextPanel.add(title);

    for(int i=0; i<newPlayer.moves.size(); i++)
    {
        moveLabelList.add(new JLabel(newPlayer.moves.get(i).toString()));
        moveLabelList.get(i).setBounds(185, yCoord, 100, 15);
        yCoord=yCoord+25;
        nextPanel.add(moveLabelList.get(i));
    }

    yCoord = 100;

    for(int x=0; x<newPlayer.damages.size(); x++)
    {
        damageLabelList.add(new JLabel(newPlayer.damages.get(x).toString() + " damage"));
        damageLabelList.get(x).setBounds(280, yCoord, 100, 15);
        yCoord=yCoord+25;
        nextPanel.add(damageLabelList.get(x));
    }


    nextPanel.setBackground(Color.WHITE);
    //nextPanel.setVisible(true);
    c.setVisible(true); 
    c.add(nextPanel);
}

public static void teachMove(final Container x, final JPanel newPanel)
{
    final int confirmYOrN = 0;

    final JTextField moveName = new JTextField();
    final JSlider moveDamage = new JSlider(0, 30);
    final JLabel confirm = new JLabel("Great! Your move has been added.");

    JLabel entryLabel = new JLabel("Enter the new move's name: ");
    JLabel damageEntryLabel = new JLabel("Enter the new move's damage: ");
    JButton enterButton = new JButton("OK");

    confirm.setBounds(160, 350, 200, 15);

    enterButton.addActionListener(new AbstractAction("add"){
        @Override
        public void actionPerformed(ActionEvent e){
            final String mName = moveName.getText();
            final int mDam = moveDamage.getValue();
            newPlayer.moves.add(mName);
            newPlayer.damages.add(mDam);

            newPanel.removeAll();
            newPanel.updateUI();

            battleGUISelection(x);

        }
    });

    moveDamage.setMajorTickSpacing(10);
    moveDamage.setMinorTickSpacing(5);
    moveDamage.setPaintTicks(true);
    moveDamage.setPaintLabels(true);

    entryLabel.setBounds(160, 125, 175, 25);
    damageEntryLabel.setBounds(160, 200, 200, 25);
    moveName.setBounds(160, 155, 175, 25);
    moveDamage.setBounds(160, 230, 175, 45);
    enterButton.setBounds(225, 290, 60, 50);

    newPanel.add(entryLabel);
    newPanel.add(moveName);
    newPanel.add(damageEntryLabel);
    newPanel.add(moveDamage);
    newPanel.add(enterButton);

    x.add(newPanel);
    x.setVisible(true); 
}
public static void main(String[] args)
{
    GUIFrameTest window = new GUIFrameTest("BattleGUI");
     //Window properties
    window.setBounds(300, 300, 500, 500);
    window.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    window.setVisible(true);
}    
}
import java.awt.*;
导入java.util.*;
导入java.awt.event.*;
导入javax.swing.*;
公共类GUIFrameTest扩展了JFrame{
JPanel面板=新的JPanel();
JButton begButton=新JButton(“初学者”);
JButton intermButton=新JButton(“中间”);
JButton expertButton=新JButton(“专家”);
JButton-okButton=新JButton(“OK”);
JLabel title=新JLabel(“选择难度”);
JLabel标签=新的JLabel();
JLabel txtLabel=新的JLabel();
TextField name=新的TextField();
静态战斗newPlayer=新战斗(“”);
静态战斗敌人初学者=新战斗(“对手”);
静态战斗enemyIntermediate=新战斗(“对手”);
静态战斗enemyExpert=新战斗(“对手”);
静态对抗敌人;
静态串难度;
公共GUI框架测试(字符串windowName)
{
超级(窗口名);
最终容器c=getContentPane();
panel.setLayout(空);
//面板立根(0,0,500,500);
begButton.setBounds(0,25,100,50);
立根(125,25,110,50);
expertButton.setBounds(255,25,100,50);
标签.立根(0,100,200,50);
名称.立根(188、225、125、25);
txtlab.setBounds(18817812550);
okButton.setBounds(2002551025);
标题.立根(0,0,150,15);
setText(“输入玩家名称:”);
begButton.addActionListener(新的AbstractAction(“添加”){
@凌驾
已执行的公共无效操作(操作事件e){
label.setText(“难度设置为初学者”);
难度=“初学者”;
setHp(newPlayer,50);
灌肠初学者。setHp(灌肠初学者,50);
Enemy初学者。移动。添加(“冲压”);
Enemy初学者。移动。添加(“踢”);
Enemy初学者。伤害。增加(10);
Enemy初学者。伤害。增加(10);
敌人=敌人的初学者;
}
});
intermButton.addActionListener(新的AbstractAction(“添加”){
@凌驾
已执行的公共无效操作(操作事件e){
label.setText(“难度设置为中级”);
难度=“中级”;
setHp(newPlayer,75岁);
setHp(enemyIntermediate,75);
enemyIntermediate.moves.add(“punch”);
enemyIntermediate.moves.add(“kick”);
enemyIntermediate.moves.add(“slam”);
enemyIntermediate.损害赔偿。添加(20);
enemyIntermediate.损害赔偿。添加(15);
enemyIntermediate.损害赔偿。添加(25);
敌人=敌人;
}
});
addActionListener(新的AbstractAction(“添加”){
@凌驾
已执行的公共无效操作(操作事件e){
label.setText(“难度设置为专家”);
难度=“专家”;
setHp(newPlayer,100);
enemyExpert.setHp(enemyExpert,100);
enemyExpert.moves.add(“超级冲孔”);
enemyExpert.moves.add(“粉碎”);
enemyExpert.moves.add(“跳踢”);
enemyExpert.损害赔偿增加(20);
enemyExpert.损害赔偿增加(25);
enemyExpert.损害赔偿增加(30);
敌人=专家;
}
});
okButton.addActionListener(新的AbstractAction(“添加”){
@凌驾
已执行的公共无效操作(操作事件e){
newPlayer.name=name.getText();
panel.removeAll();
panel.updateUI();
选择(c);
}
});
面板。添加(begButton);
面板。添加(按钮);
面板。添加(专家按钮);
面板。添加(标签);
面板。添加(名称);
面板。添加(txtlab);
面板。添加(确定按钮);
小组.添加(标题);
面板.立根背景(颜色.白色);
c、 添加(面板);
}
公共静态选择(最终容器c)
{       
int yCoord=100;
final JPanel nextPanel=新JPanel();
JLabel title=新的JLabel();
nextPanel.updateUI();
ArrayList moveLabelList=新的ArrayList();
ArrayList damageLabelList=新的ArrayList();
title.setText(“已知移动:”);
标题.立根(200,75,100,30);
nextPanel.setLayout(空);
JButton battleButton=新JButton(“战斗”);
JButton moveButton=新JButton(“示教动作”);
JButton healButton=新JButton(“Heal”);
战斗按钮。后退(0,360,500,30);
移动按钮。立根(0390500,30);
综钮.立根(0,420,500,30);
addActionListener(新的AbstractAction(“添加”){
@凌驾
已执行的公共无效操作(操作事件e){
nextPanel.removeAll();
nextPanel.upda
nextPanel.setLayout(null);
public class GUICompoundLayout extends JFrame {

    JPanel panel = new JPanel();
    JButton begButton = new JButton("Beginner");
    JButton intermButton = new JButton("Intermediate");
    JButton expertButton = new JButton("Expert");
    JButton okButton = new JButton("OK");
    JLabel title = new JLabel("SELECT DIFFICULTY");
    JLabel label = new JLabel();
    JLabel txtLabel = new JLabel();
    TextField name = new TextField(10);
    static Battle newPlayer = new Battle("");
    static Battle enemyBeginner = new Battle("OPPONENT");
    static Battle enemyIntermediate = new Battle("OPPONENT");
    static Battle enemyExpert = new Battle("OPPONENT");
    static Battle enemy;
    static String difficulty;

    public GUICompoundLayout(String windowName) {
        super(windowName);

        JPanel pnlTop = new JPanel(new FlowLayout(FlowLayout.LEFT));
        JPanel pnlMiddle = new JPanel(new FlowLayout(FlowLayout.LEFT));
        JPanel pnlBody = new JPanel(new GridBagLayout());

        pnlTop.setBackground(Color.WHITE);
        pnlMiddle.setBackground(Color.WHITE);
        pnlBody.setBackground(Color.WHITE);

        pnlTop.add(title);
        pnlMiddle.add(begButton);
        pnlMiddle.add(intermButton);
        pnlMiddle.add(expertButton);

        txtLabel.setText("Enter name of player: ");

        GridBagConstraints gbc = new GridBagConstraints();
        gbc.gridx = 0;
        gbc.gridy = 0;
        gbc.insets = new Insets(2, 2, 2, 2);
        pnlBody.add(txtLabel, gbc);

        gbc.gridy++;
        pnlBody.add(name, gbc);

        gbc.gridy++;
        pnlBody.add(okButton, gbc);

        setLayout(new GridBagLayout());
        gbc = new GridBagConstraints();
        gbc.weightx = 1;
        gbc.fill = GridBagConstraints.HORIZONTAL;
        gbc.gridx = 0;
        gbc.gridy = 0;

        add(pnlTop, gbc);
        gbc.gridy++;
        add(pnlMiddle, gbc);
        gbc.gridy++;
        gbc.weightx = 1;
        gbc.weighty = 1;
        gbc.fill = GridBagConstraints.BOTH;
        add(pnlBody, gbc);

//        begButton.setBounds(0, 25, 100, 50);
//        intermButton.setBounds(125, 25, 110, 50);
//        expertButton.setBounds(255, 25, 100, 50);
//        label.setBounds(0, 100, 200, 50);
//        name.setBounds(188, 225, 125, 25);
//        txtLabel.setBounds(188, 178, 125, 50);
//        okButton.setBounds(200, 255, 100, 25);
//        title.setBounds(0, 0, 150, 15);
//
//        txtLabel.setText("Enter name of player: ");


        begButton.addActionListener(new AbstractAction("add") {
            @Override
            public void actionPerformed(ActionEvent e) {
                label.setText("Difficulty set to beginner");
                difficulty = "beginner";
                newPlayer.setHp(newPlayer, 50);
                enemyBeginner.setHp(enemyBeginner, 50);
                enemyBeginner.moves.add("punch");
                enemyBeginner.moves.add("kick");
                enemyBeginner.damages.add(10);
                enemyBeginner.damages.add(10);
                enemy = enemyBeginner;
            }
        });
        intermButton.addActionListener(new AbstractAction("add") {
            @Override
            public void actionPerformed(ActionEvent e) {
                label.setText("Difficulty set to intermediate");
                difficulty = "intermediate";
                newPlayer.setHp(newPlayer, 75);
                enemyIntermediate.setHp(enemyIntermediate, 75);
                enemyIntermediate.moves.add("punch");
                enemyIntermediate.moves.add("kick");
                enemyIntermediate.moves.add("slam");
                enemyIntermediate.damages.add(20);
                enemyIntermediate.damages.add(15);
                enemyIntermediate.damages.add(25);
                enemy = enemyIntermediate;
            }
        });
        expertButton.addActionListener(new AbstractAction("add") {
            @Override
            public void actionPerformed(ActionEvent e) {
                label.setText("Difficulty set to expert");
                difficulty = "expert";
                newPlayer.setHp(newPlayer, 100);
                enemyExpert.setHp(enemyExpert, 100);
                enemyExpert.moves.add("super punch");
                enemyExpert.moves.add("smash");
                enemyExpert.moves.add("jump kick");
                enemyExpert.damages.add(20);
                enemyExpert.damages.add(25);
                enemyExpert.damages.add(30);
                enemy = enemyExpert;

            }
        });
        okButton.addActionListener(new AbstractAction("add") {
            @Override
            public void actionPerformed(ActionEvent e) {
                newPlayer.name = name.getText();
                panel.removeAll();
                panel.updateUI();
                battleGUISelection(getContentPane());
            }
        });

//        panel.add(begButton);
//        panel.add(intermButton);
//        panel.add(expertButton);
//        panel.add(label);
//        panel.add(name);
//        panel.add(txtLabel);
//        panel.add(okButton);
//        panel.add(title);

//        panel.setBackground(Color.WHITE);

//        c.add(panel);
    }

    public static void battleGUISelection(final Container c) {
        int yCoord = 100;

        final JPanel nextPanel = new JPanel();
        JLabel title = new JLabel();

        nextPanel.updateUI();

        ArrayList<JLabel> moveLabelList = new ArrayList<JLabel>();
        ArrayList<JLabel> damageLabelList = new ArrayList<JLabel>();

        title.setText("Moves Known: ");
        title.setBounds(200, 75, 100, 30);

        nextPanel.setLayout(null);

        JButton battleButton = new JButton("Battle");
        JButton moveButton = new JButton("Teach Moves");
        JButton healButton = new JButton("Heal");

        battleButton.setBounds(0, 360, 500, 30);
        moveButton.setBounds(0, 390, 500, 30);
        healButton.setBounds(0, 420, 500, 30);

        moveButton.addActionListener(new AbstractAction("add") {
            @Override
            public void actionPerformed(ActionEvent e) {
                nextPanel.removeAll();
                nextPanel.updateUI();
                teachMove(c, nextPanel);

            }
        });

        nextPanel.add(battleButton);
        nextPanel.add(moveButton);
        nextPanel.add(healButton);
        nextPanel.add(title);

        for (int i = 0; i < newPlayer.moves.size(); i++) {
            moveLabelList.add(new JLabel(newPlayer.moves.get(i).toString()));
            moveLabelList.get(i).setBounds(185, yCoord, 100, 15);
            yCoord = yCoord + 25;
            nextPanel.add(moveLabelList.get(i));
        }

        yCoord = 100;

        for (int x = 0; x < newPlayer.damages.size(); x++) {
            damageLabelList.add(new JLabel(newPlayer.damages.get(x).toString() + " damage"));
            damageLabelList.get(x).setBounds(280, yCoord, 100, 15);
            yCoord = yCoord + 25;
            nextPanel.add(damageLabelList.get(x));
        }


        nextPanel.setBackground(Color.WHITE);
        //nextPanel.setVisible(true);
        c.setVisible(true);
        c.add(nextPanel);
    }

    public static void teachMove(final Container x, final JPanel newPanel) {
        final int confirmYOrN = 0;

        final JTextField moveName = new JTextField();
        final JSlider moveDamage = new JSlider(0, 30);
        final JLabel confirm = new JLabel("Great! Your move has been added.");

        JLabel entryLabel = new JLabel("Enter the new move's name: ");
        JLabel damageEntryLabel = new JLabel("Enter the new move's damage: ");
        JButton enterButton = new JButton("OK");

        confirm.setBounds(160, 350, 200, 15);

        enterButton.addActionListener(new AbstractAction("add") {
            @Override
            public void actionPerformed(ActionEvent e) {
                final String mName = moveName.getText();
                final int mDam = moveDamage.getValue();
                newPlayer.moves.add(mName);
                newPlayer.damages.add(mDam);

                newPanel.removeAll();
                newPanel.updateUI();

                battleGUISelection(x);

            }
        });

        moveDamage.setMajorTickSpacing(10);
        moveDamage.setMinorTickSpacing(5);
        moveDamage.setPaintTicks(true);
        moveDamage.setPaintLabels(true);

        entryLabel.setBounds(160, 125, 175, 25);
        damageEntryLabel.setBounds(160, 200, 200, 25);
        moveName.setBounds(160, 155, 175, 25);
        moveDamage.setBounds(160, 230, 175, 45);
        enterButton.setBounds(225, 290, 60, 50);

        newPanel.add(entryLabel);
        newPanel.add(moveName);
        newPanel.add(damageEntryLabel);
        newPanel.add(moveDamage);
        newPanel.add(enterButton);

        x.add(newPanel);
        x.setVisible(true);
    }

    public static void main(String[] args) {
        GUICompoundLayout window = new GUICompoundLayout("BattleGUI");
        //Window properties
        window.setBounds(300, 300, 500, 500);
        window.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        window.setVisible(true);
    }
}