Home > Enterprise >  Can I use multiple grids?
Can I use multiple grids?

Time:12-04

I am trying to figure out the layout for this(the rest of the code is in the early stages) but for this block, I am trying to figure out the best(and doable) way to format it. I want it to be an 8x8 grid that I will eventually populate with the treasure/empty buttons but I also need a title up top as well as some labels and text on the left. I am unsure if I am able to do multiple grids but what I did below is try to create a 1x2 grid and then place two other grids inside, one with the info on the left(3x2), and another with the 8x8 grid for the buttons. I know it's not close to what it needs to be but none of the grids are showing up at all(it's just putting the title and then one column with 8 rows) and I wanna know if I'm even on any sort of right track, or if I'm just making things up at this point. Any tips would be appreciated, or resources about possibly nesting the grids? I can't find anything in my book about That specifically.

private void buildPanel()
    {        
        // Create labels to display the 
        treasuresLeftLabel = new JLabel("Treasures left: ");
        treasuresFoundLabel = new JLabel("Treasures found: ");        
        triesLeftLabel = new JLabel("Tries left: ");
        
        // Create text fields for each label
        treasuresLeftTextField = new JTextField(2);
        treasuresLeftTextField.setEditable(false);
        treasuresLeftTextField.setText(String.valueOf(20-game.getTreasuresFound()));
        treasuresFoundTextField = new JTextField(2);
        treasuresFoundTextField.setEditable(false);
        treasuresFoundTextField.setText(String.valueOf(game.getTreasuresFound()));
        triesLeftTextField = new JTextField(2);
        triesLeftTextField.setEditable(false);
        triesLeftTextField.setText(String.valueOf(game.getTriesLeft()));
        
        emptyButton = new EmptyButton();
        emptyButton.addActionListener(new emptyButtonListener());
        treasureButton = new TreasureButton();
        treasureButton.addActionListener(new treasureButtonListener());

        // new JPanel object referenced by panel
        panel = new JPanel();
        
        panel.setBorder(BorderFactory.createTitledBorder("Treasure Hunt"));
        // Add a gridlayout to the content pane
        panel.setLayout(new GridLayout(1, 2));
        
        panel.setLayout(new GridLayout(3, 2));
        panel.add(treasuresLeftLabel);
        panel.add(treasuresLeftTextField);
        panel.add(treasuresFoundLabel);
        panel.add(treasuresFoundTextField);
        panel.add(triesLeftLabel);
        panel.add(triesLeftTextField);
        
        panel.setLayout(new GridLayout(8, 8));
        panel.add(treasureButton);
        panel.add(emptyButton);
    }

CodePudding user response:

You can't use multiple grids within the same JPanel - one panel, one layout manager.

But you can nest layout managers (and thereby grids) by using nested panels.

For example you could use a BorderLayout for the first panel (containing the title at the top, the info panel on the left and the button panel in the center.

The code to construct those panel then might look like this:

    // panel contains the complete UI
    panel = new JPanel();

    panel.setBorder(BorderFactory.createTitledBorder("Treasure Hunt"));
    panel.setLayout(new BorderLayout());
    panel.add(new JLabel("This is the Title"), BorderLayout.PAGE_START);

    JPanel infoPanel = new JPanel();
    infoPanel.setLayout(new GridLayout(3, 2));
    infoPanel.add(treasuresLeftLabel);
    infoPanel.add(treasuresLeftTextField);
    infoPanel.add(treasuresFoundLabel);
    infoPanel.add(treasuresFoundTextField);
    infoPanel.add(triesLeftLabel);
    infoPanel.add(triesLeftTextField);
    panel.add(infoPanel, BorderLayout.LINE_START);

    JPanel buttonPanel = new JPanel();
    buttonPanel.setLayout(new GridLayout(8, 8));
    buttonPanel.add(treasureButton);
    buttonPanel.add(emptyButton);
    for (int i = 0; i < 62; i  ) {
        buttonPanel.add(new JButton(String.format("d", i)));
    }
    panel.add(buttonPanel, BorderLayout.CENTER);
  • Related