Question

I'm creating a load button and want it to populate a 9x9 gridlayout content pane nested inside the CENTER panel of a border layout (main window). This method is located inside the PAGE_START section of the border layout. The question is how can I place the buttons in the Grid Layout of the CENTER section from here?

       //Load Button
    JButton load = new JButton("Load");
    load.addActionListener(new ActionListener() { 
        @Override
        public void actionPerformed (ActionEvent a) {
            //Dialog Box To Locate The Puzzle
                SudokuPuzzle puzzle;
                JFileChooser chooser = new JFileChooser();
                FileNameExtensionFilter filter = new FileNameExtensionFilter(
                        "Text Files", "txt");
                chooser.setFileFilter(filter);
                int returnVal = chooser.showOpenDialog(SudukoGUI.this);
                if(returnVal == JFileChooser.APPROVE_OPTION) {
                    String fileLocation = chooser.getSelectedFile().getName();
                    Scanner file = new Scanner(fileLocation);
                    puzzle = new SudokuPuzzle(file, file);

                    //Load Puzzle To Model and draw it
                    try {
                        gridView = new JButton[9][9];
                        int[][] viewArray = puzzle.getArray();

                        for (int row = 0; row < 9; row++) {
                            for (int col = 0; col < 9; col++) {
                                gridView[row][col] = new JButton(String.valueOf(viewArray[row][col])); 

***************THE NEXT LINE REPRESENTS MY PROBLEM***************
                                this.getContentPane().board.add(gridView[row][col]);

                            }
                        }

This is in the constructor

     JPanel board = new JPanel();
    board.setLayout (new GridLayout (9,9));
    board.setPreferredSize(new Dimension(400,400));
    this.getContentPane().add(board, BorderLayout.CENTER);
Was it helpful?

Solution

This

this.getContentPane().board.add(gridView[row][col]);

Does not make any sense. You added board to the content pane in your constructor, but this does not mean that board is now a field of the content pane. So

getContentPane().board

Should fail to compile.

You should probably make board a field of your class, rather than declaring it a local variable in your constructor. Then you will able to refer to board throughout the body of your class.

Basic example:

public class Example
{
    private JPanel board;

    public Example()
    {
         board = new JPanel();
         getContentPane().add(board);
         //assuming above code takes place in the constructor
         JButton load = new JButton("load");
         load.addActionListener(new ActionListener()
         {
              public void actionPerformed(ActionEvent e)
              {
                    ...lots of code
                    //as board is no longer a local variable this will compile
                    board.add(gridView[row][col]);
              }
         }
    }
}

Note that you probably want to add load to your frame at some point.

OTHER TIPS

First of all declare board as final variable using:

final JPanel board = new JPanel();

So that board could be accessed from anonymous inner class of ActionListener. Thereafter, change this line:

this.getContentPane().board.add(gridView[row][col]);

To

board.add(gridView[row][col]);
Licensed under: CC-BY-SA with attribution
Not affiliated with StackOverflow
scroll top