创建按钮GUI面板

时间:2012-05-17 11:35:33

标签: java swing

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

这是代码(问题是框架被清除,没有出现任何内容)

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 个答案:

答案 0 :(得分:2)

此代码有几个问题

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

    while(size != 0){
      myPanel.add(newButton);
      size --;
    }
    
  4. 您是否尝试过调试以查看size是否实际为>0。由于您默默地忽略了ParseException,因此最终可能会size 0清除内容窗格而不添加任何内容
  5. 然后按照金色表示建议并在添加组件后调用validate。请参阅Container#add方法的javadoc
      

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

  6.   

答案 1 :(得分:1)

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

您无需在单个组件上调用setVisible(),在框架本身pack()之后调用它,也不应使用validate()repaint()在构造函数中。即,用以下内容替换:

pack();
setVisible(true);

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

答案 2 :(得分:0)

尝试替换

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

通过

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

答案 3 :(得分: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);
         }
    });
}

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