1

I am planning to build a GUI for shortest path. I have created buttons in a for loop. Now I want to change the colors of the pressed buttons but I am getting an error regarding Action Listener. It says "Exception in thread "main" java.lang.Error: Unresolved compilation problem: The method addActionListener(ActionListener) in the type AbstractButton is not applicable for the arguments (Final_GUI)".. Although i have tested this code using a JPanel and it was working fine there, But here It's not working now. I want to change the color of the button pressed. If a press that button again i want its previous color to be restored. Following is the picture of what i want to do : enter image description here.. :(

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

public class Final_GUI extends JFrame {
JLabel label;
ButtonGroup cbg;
JRadioButton radio_1;
JRadioButton radio_2;
JRadioButton radio_3;
JCheckBox checkbox_1;
JCheckBox checkbox_2;
JCheckBox checkbox_3;
JScrollPane scrollpane_1;
JComboBox combobox_1;
JList list_1;
JScrollPane sp_list_1;
JComboBox combobox_2;
JButton Orange;
JButton Exit;
JLabel for_text;

int check [][]= new int [100][100];
int x=100;
int y=200;
JFrame frame = new JFrame();
   JButton[][] buttons = new JButton[x][y];
    JPanel mPanel = new JPanel();
    JPanel bPanel = new JPanel();
    JPanel cPanel = new JPanel();
    JTextArea scoreKeeper = new JTextArea();
    Container c = getContentPane();
    int[][] intArray = new int[x][y];

public Final_GUI() {

     butGen();
        score();


    Final_GUILayout customLayout = new Final_GUILayout();

    getContentPane().setFont(new Font("Helvetica", Font.PLAIN, 12));
    getContentPane().setLayout(customLayout);

    label = new JLabel("Shortest Path Finding Algorithm");
    getContentPane().add(label);

    cbg = new ButtonGroup();
    radio_1 = new JRadioButton("radio_1", false);
    cbg.add(radio_1);
    getContentPane().add(radio_1);

    radio_2 = new JRadioButton("radio_2", false);
    cbg.add(radio_2);
    getContentPane().add(radio_2);

    radio_3 = new JRadioButton("radio_3", false);
    cbg.add(radio_3);
    getContentPane().add(radio_3);

    checkbox_1 = new JCheckBox("checkbox_1");
    getContentPane().add(checkbox_1);

    checkbox_2 = new JCheckBox("checkbox_2");
    getContentPane().add(checkbox_2);

    checkbox_3 = new JCheckBox("checkbox_3");
    getContentPane().add(checkbox_3);


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

    mPanel.setLayout(new BorderLayout());

   mPanel.add(bPanel, BorderLayout.CENTER);

   scrollpane_1 = new JScrollPane(mPanel);



    scrollpane_1.setViewportView(mPanel);
    getContentPane().add(scrollpane_1);

    combobox_1 = new JComboBox();
    combobox_1.addItem("Size1");
    combobox_1.addItem("Size2");
    getContentPane().add(combobox_1);

    DefaultListModel listModel_list_1 = new DefaultListModel();
    listModel_list_1.addElement("Black");
    listModel_list_1.addElement("Green");
    list_1 = new JList(listModel_list_1);
    sp_list_1 = new JScrollPane(list_1);
    getContentPane().add(sp_list_1);

    combobox_2 = new JComboBox();
    combobox_2.addItem("Additional Data");
    combobox_2.addItem("Additional Data2");
    getContentPane().add(combobox_2);

    Orange = new JButton("Orange");
    getContentPane().add(Orange);

    Exit = new JButton("Exit");
    getContentPane().add(Exit);

    for_text = new JLabel("Just For some text");
    getContentPane().add(for_text);

    setSize(getPreferredSize());

    addWindowListener(new WindowAdapter() {
        public void windowClosing(WindowEvent e) {
            System.exit(0);
        }
    });
}

private void butGen()
{
    for(int i=0;i<x;i++)
        for(int j=0;j<y;j++)
        {
            buttons[i][j] = new JButton(String.valueOf(i)+"x"+String.valueOf(j));
           buttons[i][j].setActionCommand("button" +i +"_" +j);
            buttons[i][j].addActionListener(this);

           buttons[i][j].setBackground(Color.GRAY);
           buttons[i][j].setSize(100, 100);
            bPanel.add(buttons[i][j]);
        }
}   

public void actionPerformed(ActionEvent e)
{

    if(e.getActionCommand().contains("button"))
    {

        String str = e.getActionCommand().replaceAll("button", "");
        System.out.println(str);
        String[] v = str.split("_");
        int i = Integer.parseInt(v[0]);
        int j = Integer.parseInt(v[1]);

        intArray[i][j]++;

        if(check[i][j]!=1){
            buttons[i][j].setBackground(Color.BLUE);
            check[i][j]=1;
        }
        else{
            buttons[i][j].setBackground(null);
            check[i][j]=0;
        }


    System.out.println(e.getActionCommand() +"  " +i +"  " +j);

    score();
}
    }
private void score()
{
    for(int i=0;i<x;i++)
        for(int j=0;j<y;j++)
    buttons[i][j].setText("");

    }

public static void main(String args[]) {
    Final_GUI window = new Final_GUI();

    window.setTitle("SHORTEST PATH FINDING ALGORITHM");
    window.pack();
    window.show();
}
}

GUILayout

class Final_GUILayout implements LayoutManager {

public Final_GUILayout() {
}

public void addLayoutComponent(String name, Component comp) {
}

public void removeLayoutComponent(Component comp) {
}

public Dimension preferredLayoutSize(Container parent) {
    Dimension dim = new Dimension(0, 0);

    Insets insets = parent.getInsets();
    dim.width = 1053 + insets.left + insets.right;
    dim.height = 621 + insets.top + insets.bottom;

    return dim;
}

public Dimension minimumLayoutSize(Container parent) {
    Dimension dim = new Dimension(0, 0);
    return dim;
}

public void layoutContainer(Container parent) {
    Insets insets = parent.getInsets();

    Component c;
    c = parent.getComponent(0);
    if (c.isVisible()) {c.setBounds(insets.left+368,insets.top+24,304,64);}
    c = parent.getComponent(1);
    if (c.isVisible()) {c.setBounds(insets.left+8,insets.top+120,72,24);}
    c = parent.getComponent(2);
    if (c.isVisible()) {c.setBounds(insets.left+8,insets.top+144,72,24);}
    c = parent.getComponent(3);
    if (c.isVisible()) {c.setBounds(insets.left+8,insets.top+168,72,24);}
    c = parent.getComponent(4);
    if (c.isVisible()) {c.setBounds(insets.left+88,insets.top+120,72,24);}
    c = parent.getComponent(5);
    if (c.isVisible()) {c.setBounds(insets.left+88,insets.top+144,72,24);}
    c = parent.getComponent(6);
    if (c.isVisible()) {c.setBounds(insets.left+88,insets.top+168,72,24);}
    c = parent.getComponent(7);
    if (c.isVisible()) {c.setBounds(insets.left+168,insets.top+120,704,488);}
    c = parent.getComponent(8);
    if (c.isVisible()) {c.setBounds(insets.left+880,insets.top+120,160,160);}
    c = parent.getComponent(9);
    if (c.isVisible()) {c.setBounds(insets.left+24,insets.top+232,128,216);}
    c = parent.getComponent(10);
    if (c.isVisible()) {c.setBounds(insets.left+880,insets.top+296,160,216);}
    c = parent.getComponent(11);
    if (c.isVisible()) {c.setBounds(insets.left+904,insets.top+528,112,24);}
    c = parent.getComponent(12);
    if (c.isVisible()) {c.setBounds(insets.left+888,insets.top+568,144,32);}
    c = parent.getComponent(13);
    if (c.isVisible()) {c.setBounds(insets.left+16,insets.top+472,120,48);}
}
}
waleeds37
  • 99
  • 6

1 Answers1

5

Why are you creating a custom Layout Manager. You concept of how a layout manager should work is wrong. You should NOT be using hard coded values in your layout manager. For example if you ever decide to change the font of the components all your calculations will need to be changed. If you ever need to add another component the calculations will change. Your layout manager code will be a maintenance nightmare.

You should instead be using layout managers to make your job easier. This may mean that you need to use nested panels which many use different layout managers.

Having said all that you are making the usage of a scrollpane too complicated. You don't need to create horizontal and vertical scrollbars, the scrollpane will manage that for you. The usage of a scrollpane should be something like:

JScrollPane scrollPane = new JScrollPane( panel );

not:

JScrollPane scrollPane = new JScrollPane();
scrollPane.add( panel );

that is the panel needs to be added to the viewport of the scrollpane, not to the scrollpane directly.

camickr
  • 321,443
  • 19
  • 166
  • 288
  • Thanks. It works now. Now I am facing another problem. Action listener is not working on the mouse clicks. It says " Exception in thread "main" java.lang.Error: Unresolved compilation problem: The method addActionListener(ActionListener) in the type AbstractButton is not applicable for the arguments (Final_GUI)" – waleeds37 Dec 22 '13 at 20:56
  • I would guess you Final_GUI class needs to implement ActionListener. By the way way are you using "_" in the class name? Can you show me any class in the JDK that uses this in a class name. Follow existing standards and don't make up your own! – camickr Dec 22 '13 at 21:29
  • Thanks again for your help. I don't know y I do these type of silly mistakes some times. Anyways thanks for your suggestion as well. From now onward I will follow the standards. BTW I don't normally use "_" in the class name. That was just for my own ease. Never Mind . Stay Blessed. Have a nice day. :-) – waleeds37 Dec 22 '13 at 21:59
  • Can you tell me one more thing ? How can I change the size of buttons? I want decrease their width. I am using buttons[i][j].setSize(width, height) in the butgen() function in my program. I am changing the values but they have no effect on the buttons. They are only effected by the number of rows and columns i.e depending on the inputs , not by the buttons[i][j].setSize(width, height). Can You help in this issue? – waleeds37 Dec 22 '13 at 22:22
  • It is the job of the layout manager to set the size and location of a component which is why your code doesn't work. The size of the button is determined by the text that is added to the button. If you try to make the button smaller then the text will be truncated. – camickr Dec 22 '13 at 23:17
  • Now I understood what you said in the answer. I have seen its tutorial it seems much better than my method. Let me do some research on that. Thanks for the idea. – waleeds37 Dec 22 '13 at 23:57