Search code examples
javaswinggrid-layoutillegalargumentexception

Swing - creating GridLayout using JTextfield input


I'm trying to create a Gridlayout. I'm using two parameters - m and n that are taken from JTextField components.

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

public class GUI extends JFrame
{
public static final int HEIGHT = 75;
public static final int WIDTH = 450;

    JLabel m_label, n_label;
    JTextField m_enter,n_enter;
    JButton generate;
    int m,n;
    GUI g;

public void draw()
{
    m=Integer.parseInt(m_enter.getText());
    n=Integer.parseInt(n_enter.getText());
    new Chess();
}

GUI()
{

    setPreferredSize(new Dimension(WIDTH,HEIGHT));
    setLayout(new FlowLayout());
    setVisible(true);
    setLocationRelativeTo(null);
    setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    setResizable(false);

    m_label = new JLabel("M:");
    m_enter = new JTextField(5);
    n_label = new JLabel("N:");
    n_enter = new JTextField(5);

    generate = new JButton("Generate!");

    add(m_label);
    add(m_enter);

    add(n_label);
    add(n_enter);

    add(generate);
    pack();

    generate.addActionListener(new ActionListener() {
        public void actionPerformed(ActionEvent e)
        {
            draw();
        }
    });
}

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

Chess Class

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

class Chess extends JDialog
{
GUI g;
public static final int HEIGHT = 600;
public static final int WIDTH = 600;
int m,n;

Chess()
{
    setPreferredSize(new Dimension(WIDTH,HEIGHT));
    setVisible(true);
    setLayout(new GridLayout(m,n));
    pack();
}
}

It creates following error:

Exception in thread "AWT-EventQueue-0" java.lang.IllegalArgumentException: rows and cols cannot both be zero
at java.awt.GridLayout.<init>(GridLayout.java:195)
at java.awt.GridLayout.<init>(GridLayout.java:166)
at Chess.<init>(Chess.java:15)
at GUI.draw(GUI.java:23)
at GUI$1.actionPerformed(GUI.java:55)
at javax.swing.AbstractButton.fireActionPerformed(AbstractButton.java:2022)
at javax.swing.AbstractButton$Handler.actionPerformed(AbstractButton.java:2348)
at javax.swing.DefaultButtonModel.fireActionPerformed(DefaultButtonModel.java:402)
at javax.swing.DefaultButtonModel.setPressed(DefaultButtonModel.java:259)
at javax.swing.plaf.basic.BasicButtonListener.mouseReleased(BasicButtonListener.java:252)
at java.awt.Component.processMouseEvent(Component.java:6535)
at javax.swing.JComponent.processMouseEvent(JComponent.java:3324)
at java.awt.Component.processEvent(Component.java:6300)
at java.awt.Container.processEvent(Container.java:2236)
at java.awt.Component.dispatchEventImpl(Component.java:4891)
at java.awt.Container.dispatchEventImpl(Container.java:2294)
at java.awt.Component.dispatchEvent(Component.java:4713)
at java.awt.LightweightDispatcher.retargetMouseEvent(Container.java:4888)
at java.awt.LightweightDispatcher.processMouseEvent(Container.java:4525)
at java.awt.LightweightDispatcher.dispatchEvent(Container.java:4466)
at java.awt.Container.dispatchEventImpl(Container.java:2280)
at java.awt.Window.dispatchEventImpl(Window.java:2750)
at java.awt.Component.dispatchEvent(Component.java:4713)
at java.awt.EventQueue.dispatchEventImpl(EventQueue.java:758)
at java.awt.EventQueue.access$500(EventQueue.java:97)
at java.awt.EventQueue$3.run(EventQueue.java:709)
at java.awt.EventQueue$3.run(EventQueue.java:703)
at java.security.AccessController.doPrivileged(Native Method)
at java.security.ProtectionDomain$JavaSecurityAccessImpl.doIntersectionPrivilege(ProtectionDomain.java:76)
at java.security.ProtectionDomain$JavaSecurityAccessImpl.doIntersectionPrivilege(ProtectionDomain.java:86)
at java.awt.EventQueue$4.run(EventQueue.java:731)
at java.awt.EventQueue$4.run(EventQueue.java:729)
at java.security.AccessController.doPrivileged(Native Method)
at java.security.ProtectionDomain$JavaSecurityAccessImpl.doIntersectionPrivilege(ProtectionDomain.java:76)
at java.awt.EventQueue.dispatchEvent(EventQueue.java:728)
at java.awt.EventDispatchThread.pumpOneEventForFilters(EventDispatchThread.java:201)
at java.awt.EventDispatchThread.pumpEventsForFilter(EventDispatchThread.java:116)
at java.awt.EventDispatchThread.pumpEventsForHierarchy(EventDispatchThread.java:105)
at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:101)
at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:93)
at java.awt.EventDispatchThread.run(EventDispatchThread.java:82)

Process finished with exit code 0


Solution

  • Your problem is that you're never setting Chess's m or n values. Give Chess a constructor that allows outside classes the ability to set these fields, and then pass them in.

    Chess(int m, int n) {
        this.m = m;
        this.n = n;
        //if statement to check if NULL or both set to zero
        //{
            //TODO:  Check to make sure no NULLs or Zero values
        //}
        setPreferredSize(new Dimension(WIDTH,HEIGHT));
        setVisible(true);
        setLayout(new GridLayout(m,n));
        pack();
    }
    

    Key lessons:

    • There is no "magic" in programming. Your fields will not magically change, and if you want them to change, you the programmer must change them.
    • Don't ignore the exception stacktrace message that you receive as it contains valuable information that will help you solve your problems, including where the problem is and what it is.
    • Your question initially was non-answerable because you didn't post the key code that was causing the error (see the point above). Please have a look at the tour, the help as well as the how to ask good questions sections for more information on how to improve your future questions and increase your chances of getting decent help.