0

我正在尝试为游戏创建一个棋盘,我首先制作了一个框架,然后如果用户//输入行和列作为数字并按下开始按钮,它应该删除所有//框架上的内容并添加一个面板到处都有按钮的网格布局

这是代码(问题是框架被清除并且没有出现)

import java.awt.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;

import javax.swing.*;

public class Frame extends JFrame implements ActionListener{
    private static final long serialVersionUID = 1L;


    JButton newButton;
    JButton Start;
    JTextArea row;
    JTextArea col;
    JLabel background;
    JLabel rows;
    JLabel columns;
    JLabel Error;
    JPanel myPanel;
    JCheckBox box;


    public Frame()
    {
                //adding frame


                setTitle("DVONN Game");
            setSize(1000, 700);
            setVisible(true);
            setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
            setLayout(null);
        //making start button
        Start = new JButton(new ImageIcon("Start"));
        Start.setBounds(500, 30, 300, 300);
        Start.setOpaque(true);
        Start.addActionListener(this);

            //make background
        background = new JLabel();
        background.setBounds(0, -300, 2000, 1500);
        background.setIcon(Color.BLUE));

        rows = new JLabel("Enter the rows");
        columns = new JLabel("Enter the columns");
        rows.setForeground(Color.WHITE);
        columns.setForeground(Color.WHITE);
        rows.setBounds(10,10,100,30);
        columns.setBounds(10,45,105,30);

        row = new JTextArea();
        col = new JTextArea();
        row.setBounds(120,10,100,30);
        col.setBounds(120,45,100,30);

        Error = new JLabel("Enter numbers plz!");
                Error.setBounds(10, 100, 400, 30);
        Error.setForeground(Color.RED);
        Error.setVisible(true);

        box = new JCheckBox("Enable Random Filling");
        box.setBounds(10, 200, 150, 20);
        box.setVisible(true);

        myPanel = new JPanel();
        myPanel.setBounds(30, 30, 700, 500);
        myPanel.setVisible(true);

        newButton = new JButton();
        newButton.setOpaque(true);

        getContentPane().add(box);
        getContentPane().add(rows);
        getContentPane().add(columns);
        getContentPane().add(row);
        getContentPane().add(col);
        getContentPane().add(Start);
        getContentPane().add(background);

        this.validate();
        this.repaint();

    }


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

      //adding actions for start button


      public void actionPerformed(ActionEvent e) {

        boolean flag = true;
        String r1 = row.getText();
        String c1 = col.getText();
        int x = 0,y = 0;

        try{
            x = Integer.parseInt(r1);
            y = Integer.parseInt(c1);
        } catch(NumberFormatException l) {
            flag = false;
        }

        int size = x * y;

        if (flag == true) {
            this.getContentPane().removeAll();
            this.validate();
            this.repaint();

            myPanel.setLayout(new GridLayout(x, y));

            while(size != 0)
            {
                myPanel.add(newButton);
                size --;
            }

            this.getContentPane().add(myPanel);

        } else {

            this.getContentPane().add(Error);
        }
    }
}
4

4 回答 4

2

这段代码有几个问题

  1. 是否真的需要发布那么多代码。一个简单的用户界面,只需按下一个按钮,然后应该出现另一个组件就足够了SSCCE
  2. null布局的使用。请学会使用LayoutManagers
  3. 每个 Swing 组件在层次结构中只能包含一次。所以这个循环是没有用的,因为你一遍又一遍地添加相同的组件(更不用说负大小会导致无限循环)

    while(size != 0){
      myPanel.add(newButton);
      size --;
    }
    
  4. 您是否尝试过调试以查看是否size实际上是>0. 由于您默默地忽略ParseExceptions 您最终可能会得到一个size0清理内容窗格并且不添加任何内容的结果
  5. 然后按照 goldilocks 的建议进行操作,并validate在添加组件后调用。Container#add查看方法 的javadoc

    此方法更改与布局相关的信息,因此使组件层次结构无效。如果容器已显示,则必须随后验证层次结构以显示添加的组件。

于 2012-05-17T15:35:58.843 回答
1

调用validate()andrepaint() 添加新元素之后而不是在删除旧元素之后。

您不需要调用setVisible()单个组件,pack()在 Frame 本身之后调用它,并且您不应该在构造函数中使用validate()and repaint()。即,将它们替换为:

pack();
setVisible(true);

或者您可以在调用构造函数后对对象执行此操作。

于 2012-05-17T11:38:24.450 回答
0

尝试更换

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

经过

   public static void main(String[]args)
{
    new Frame().setVisible(true);
}
于 2012-05-17T11:39:29.583 回答
0

删除构造函数中的调用this.setVisible并将其设为您的主要方法。

public static void main(String[] args) {  
    final Frame fr = new Frame();

    java.awt.EventQueue.invokeLater(new Runnable() {
         public void run() {
             fr.setVisible(true);
         }
    });
}

这将确保框架元素在可见之前就位。

于 2012-05-17T11:45:26.743 回答