0

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

OneCricketeer
  • 179,855
  • 19
  • 132
  • 245
Varhurgh
  • 43
  • 1
  • 2
  • 6
  • 1) Use a logical and consistent form of indenting code lines and blocks. The indentation is intended to make the flow of the code easier to follow! 2) See [Should I avoid the use of set(Preferred|Maximum|Minimum)Size methods in Java Swing?](http://stackoverflow.com/q/7229226/418556) (Yes.) – Andrew Thompson May 14 '16 at 13:40
  • Please show your actual and complete error message, not an interpretation of the message. Also indicate which lines are involved. – Hovercraft Full Of Eels May 14 '16 at 13:42
  • 1
    Heck, you're not even posting the code that throws the exception! It's likely coming from your Chess code. Note that you're not passing `m` nor `n` into your Chess constructor. – Hovercraft Full Of Eels May 14 '16 at 13:44
  • 2
    *"Swing - creating GridLayout using JTextfield input"* BTW - sounds painful for the user. Offer them a `JSpinner` (or two) using a `SpinnerNumberModel` .. – Andrew Thompson May 14 '16 at 13:45
  • 2
    Yes it is definitely coming from within the Chess code -- code you've not posted. Don't ignore the error message, but read it critically as it will show you where your problem is and what it is. Solution -- pass `m` and `n` into Chess so that Chess can use it. – Hovercraft Full Of Eels May 14 '16 at 13:46
  • 1
    OK, look at Chess -- where do you set m or n??? This isn't a programming question but a basic logic problem -- m and n won't magically change. Again give Chess a constructor, pass in m and n, and set m and n within the constructor. – Hovercraft Full Of Eels May 14 '16 at 13:47
  • @HovercraftFullOfEels A combo. of your comments could be an answer.. – Andrew Thompson May 14 '16 at 13:47
  • 2
    @AndrewThompson: answer created, but made into a community wiki since I hate answering such questions. – Hovercraft Full Of Eels May 14 '16 at 13:49
  • Well .It seems that the only problem was the absence of these two variables in constructor. It solves my problem. Thank you! – Varhurgh May 14 '16 at 13:50

1 Answers1

2

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.
Community
  • 1
  • 1
Hovercraft Full Of Eels
  • 283,665
  • 25
  • 256
  • 373