Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/352.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 拆下JLabel中的按钮_Java_Swing_User Interface_Button_Jlabel - Fatal编程技术网

Java 拆下JLabel中的按钮

Java 拆下JLabel中的按钮,java,swing,user-interface,button,jlabel,Java,Swing,User Interface,Button,Jlabel,我有一个java swing项目,如下所示: import javax.swing.JFrame; import javax.swing.JButton; import javax.swing.JPanel; import javax.swing.ImageIcon; import javax.swing.Box; import javax.swing.BoxLayout; import java.awt.BorderLayout; import java.awt.Color; import

我有一个java swing项目,如下所示:

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

import javax.swing.ImageIcon;
import javax.swing.Box;
import javax.swing.BoxLayout;
import java.awt.BorderLayout;
import java.awt.Color;

import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.util.Random;


public class DiceGameReplaceDice extends JFrame
{  
    private JFrame gameFrame;
    private JPanel mainPanel;
    private JPanel centerPanel = new JPanel();
    private JButton diceArray[];
    private DiceListener diceListener = new DiceListener();
    private ButtonListener buttonListener = new ButtonListener();
    private Random rand = new Random();
    private int NUM_DICE = 2;


    private String diceImages[] = {"./src/1.png", "./src/2.png", "./src/3.png",
            "./src/4.png", "./src/5.png", "./src/6.png"};

    public static void main(String[] args)
    {       
        new DiceGameReplaceDice();
    }

    public DiceGameReplaceDice()    
    {
        // Initialize the frame that holds the game
        gameFrame = new JFrame();
        gameFrame.setSize(800, 600);
        gameFrame.setLocation(300, 100); 
        gameFrame.setTitle("Dice Game");
        gameFrame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

        // Add Panel
        mainPanel = new JPanel();
        mainPanel.setLayout(new BorderLayout());

        // Instantiate a ButtonListener
        buttonListener = new ButtonListener();


        // Add 1 Button and 1 Label to a newly created panel 
        // Add new panel to West 
        JButton buttonW1 = new JButton("Add Die");
        buttonW1.setName("W1");
        buttonW1.addActionListener(buttonListener);
        JPanel panelWest = new JPanel();
        panelWest.setLayout(new BoxLayout(panelWest,BoxLayout.Y_AXIS ));
        panelWest.setBackground(new Color(0, 0, 122));  // set to blue
        panelWest.add(Box.createVerticalGlue());
        panelWest.add(buttonW1);
        panelWest.add(Box.createVerticalGlue());

        mainPanel.add(panelWest, BorderLayout.WEST);


        // Create and display center panel with dice
        displayCenterPanel();

        // Add mainPanel to frame and display the frame
        gameFrame.add(mainPanel);
        gameFrame.setVisible(true);
    }

    private  void displayCenterPanel()
    {
        centerPanel = new JPanel();
        centerPanel.setLayout(new BoxLayout(centerPanel,BoxLayout.X_AXIS ));
        centerPanel.setBackground(new Color(0, 122, 0));  // set to green
        centerPanel.add(Box.createHorizontalGlue());

        diceArray = new JButton[NUM_DICE];

        // Add 2 Buttons to center panel with images of 2 random dice 
        for (int i=0; i<NUM_DICE; i++)
        {
            // Create dice button
            int dieNum = rand.nextInt(6)+1;
            diceArray[i] = new JButton(new ImageIcon(diceImages[dieNum-1]));
            diceArray[i].setName("Dice" + i); 
            diceArray[i].addActionListener(diceListener);

            // Add to center panel
            centerPanel.add(diceArray[i]);
            centerPanel.add(Box.createHorizontalGlue());
        }

        mainPanel.add(centerPanel, BorderLayout.CENTER);

        // Add mainPanel to frame and display the frame
        gameFrame.add(mainPanel);
        gameFrame.setVisible(true);
    }

    // Implement an (inner) class that implements ActionListener
    class DiceListener implements ActionListener
    {

        public void actionPerformed(ActionEvent e) 
        {
            NUM_DICE -= 1;
            displayCenterPanel();
        }
    }

    // Implement an (inner) class that implements ActionListener
    class ButtonListener implements ActionListener
    {

        public void actionPerformed(ActionEvent e) 
        {
            String button = ((JButton)e.getSource()).getName();
            System.out.println("Button Pressed: " + button);
            if (button.equals("W1"))
                NUM_DICE ++;
            System.out.println(NUM_DICE);
            displayCenterPanel();
        }
    }
}
import javax.swing.JFrame;
导入javax.swing.JButton;
导入javax.swing.JPanel;
导入javax.swing.ImageIcon;
导入javax.swing.Box;
导入javax.swing.BoxLayout;
导入java.awt.BorderLayout;
导入java.awt.Color;
导入java.awt.event.ActionEvent;
导入java.awt.event.ActionListener;
导入java.util.Random;
公共类DiceGameReplaceDice扩展了JFrame
{  
私有JFrame游戏框架;
私人JPanel主面板;
私有JPanel中心面板=新JPanel();
私有JButton数组[];
private DiceListener DiceListener=新DiceListener();
private ButtonListener ButtonListener=新建ButtonListener();
private Random rand=new Random();
私有整数=2;
私有字符串diceImages[]={“/src/1.png”、“/src/2.png”、“/src/3.png”,
“/src/4.png”、“/src/5.png”、“/src/6.png”};
公共静态void main(字符串[]args)
{       
新骰子gamereplacedice();
}
公共骰子gamereplacedice()
{
//初始化保存游戏的框架
gameFrame=newjframe();
游戏框架设置大小(800600);
游戏框架设置位置(300100);
游戏框架。设置标题(“骰子游戏”);
gameFrame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
//添加面板
mainPanel=新的JPanel();
setLayout(新的BorderLayout());
//实例化ButtonListener
buttonListener=新建buttonListener();
//向新创建的面板添加1个按钮和1个标签
//将新面板添加到西部
JButton buttonW1=新JButton(“添加模具”);
按钮1.设置名称(“W1”);
buttonW1.addActionListener(buttonListener);
JPanel panelWest=新的JPanel();
panelWest.setLayout(新的BoxLayout(panelWest,BoxLayout.Y_轴));
setBackground(新颜色(0,0,122));//设置为蓝色
add(Box.createVerticalGlue());
panelWest.add(按钮1);
add(Box.createVerticalGlue());
添加(panelWest,BorderLayout.WEST);
//使用骰子创建和显示中心面板
displayCenterPanel();
//将主面板添加到框架并显示框架
添加(主面板);
gameFrame.setVisible(true);
}
私有void displayCenterPanel()
{
centerPanel=新的JPanel();
centerPanel.setLayout(新的BoxLayout(centerPanel,BoxLayout.X_轴));
centerPanel.setBackground(新颜色(0,122,0));//设置为绿色
添加(Box.createHorizontalGlue());
diceArray=新的JButton[NUM_DICE];
//将2个按钮添加到中间面板,其中包含2个随机骰子的图像

对于(int i=0;i而言,快速修复方法是在添加新面板之前移除
中心面板

mainPanel.remove(centerPanel);
作为在
displayCenterPanel
中执行的第一件事

但是,您动态操作布局的方式还有很多需要改进的地方。与其每次都创建新面板,不如修改现有面板:

public class DiceGame {

    private JPanel centerPanel = new JPanel();
    private Random rand = new Random();
    private int numDice = 2;

    public static void main(String[] args) {

        SwingUtilities.invokeLater(() -> new DiceGame());
    }

    public DiceGame() {

        JFrame gameFrame = new JFrame();
        gameFrame.setSize(800, 600);
        gameFrame.setTitle("Dice Game");
        gameFrame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

        JPanel mainPanel = new JPanel();
        mainPanel.setLayout(new BorderLayout());

        JButton buttonW1 = new JButton("Add Die");
        buttonW1.addActionListener(e -> {
            numDice++;
            updateCenterPanel();
        });
        JPanel panelWest = new JPanel();
        panelWest.setLayout(new BoxLayout(panelWest, BoxLayout.Y_AXIS));
        panelWest.setBackground(new Color(0, 0, 122));
        panelWest.add(Box.createVerticalGlue());
        panelWest.add(buttonW1);
        panelWest.add(Box.createVerticalGlue());

        centerPanel.setLayout(new BoxLayout(centerPanel, BoxLayout.X_AXIS));
        centerPanel.setBackground(new Color(0, 122, 0));

        mainPanel.add(panelWest, BorderLayout.WEST);
        mainPanel.add(centerPanel);

        gameFrame.add(mainPanel);
        gameFrame.setVisible(true);
    }

    private void updateCenterPanel() {

        centerPanel.removeAll();
        centerPanel.add(Box.createHorizontalGlue());

        JButton[] diceArray = new JButton[numDice];

        for (int i = 0; i < numDice; i++) {
            diceArray[i] = new JButton(Integer.toString(rand.nextInt(6) + 1));
            diceArray[i].setName("Dice" + i);
            diceArray[i].addActionListener(e -> {
                numDice--;
                updateCenterPanel();
            });
            centerPanel.add(diceArray[i]);
            centerPanel.add(Box.createHorizontalGlue());
        }
        centerPanel.revalidate();
        centerPanel.repaint();
    }
}
公共类骰子游戏{
私有JPanel中心面板=新JPanel();
private Random rand=new Random();
私有整数=2;
公共静态void main(字符串[]args){
SwingUtilities.invokeLater(()->new DiceGame());
}
公众掷骰子游戏(){
JFrame gameFrame=新JFrame();
游戏框架设置大小(800600);
游戏框架。设置标题(“骰子游戏”);
gameFrame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
JPanel mainPanel=新的JPanel();
setLayout(新的BorderLayout());
JButton buttonW1=新JButton(“添加模具”);
按钮1.addActionListener(e->{
numDice++;
updateCenter面板();
});
JPanel panelWest=新的JPanel();
panelWest.setLayout(新的BoxLayout(panelWest,BoxLayout.Y_轴));
立根(新颜色(0,0,122));
add(Box.createVerticalGlue());
panelWest.add(按钮1);
add(Box.createVerticalGlue());
centerPanel.setLayout(新的BoxLayout(centerPanel,BoxLayout.X_轴));
中心面板。收进背景(新颜色(0,122,0));
添加(panelWest,BorderLayout.WEST);
主面板。添加(中心面板);
添加(主面板);
gameFrame.setVisible(true);
}
私有void updateCenter面板(){
centerPanel.removeAll();
添加(Box.createHorizontalGlue());
JButton[]diceArray=新JButton[numDice];
对于(int i=0;i{
数量--;
updateCenter面板();
});
添加(数组[i]);
添加(Box.createHorizontalGlue());
}
centerPanel.revalidate();
centerPanel.repaint();
}
}
在使组件层次结构无效后,需要重新验证和重新绘制

注意事项:

  • 当局部变量可用时,不要创建字段
  • numDice
    不是
    final
    ,因此应将其命名为
    numDice
  • 调用
    gameFrame.setVisible(true);
    当它已经可见时,什么也不做
  • 当您有一个工作版本时,请将
    JFrame
    上的
    setSize(…)
    替换为
    pack
    ,并确保正确计算其子项的大小
a)不要显示“近似”代码-您错过的部分可能是最重要的部分。b)在调用
displayCenter()
“再次”之前,您是否清除了面板中的所有现有子项?a)我知道,但是,如上所述,我正在手机上编写此代码,因此我没有访问权限