2

I'm currently programming a Calendar in Java. The Calendar itself fills out perfectly fine with the Month and Year being displayed in JComboBoxes above the grid below it. The Grid itself is full of empty JLabels or JButtons (for the days of the month). The JComboBoxes are linked to ActionListeners, which detect the user changing information (confirmed by System.out.print statements). However, I cannot find a way to "redraw" the JPanel after this occurs. The method being called completely creates a new JPanel and adds in the new JLabels/JButtons, but nothing on the JFrame is updated after this happens. I have attempted using both the repaint and revalidate on the whole JPanel (which includes the JComboBoxes and the grid below it in a BorderLayout), the JPanel with only the grid, and the JFrame, but nothing happens. Does anyone have any ideas what is wrong?

// This code is within the build() method that builds the GUI.
// This method adds the centerPanel into the mainPanel

yearChoice.addActionListener(new ActionListener() {
        public void actionPerformed(ActionEvent ae) {
            int i = yearChoice.getSelectedIndex();
            if (i >= 0) {
                yy = Integer.parseInt(yearChoice.getSelectedItem()
                        .toString());
                //System.out.println("Year=" + yy);
                compute();
            }
        }
    });

private void compute(){
    elements = new int[6][7];

// OMITTED is the code that determines whether a cell in the array should be an empty    
// JLabel or a JButton. This code is based on the Calendar, and does work properly,
// but I can't figure out how to get the new Month/Year to show up on a new Panel

    centerPanel = new JPanel(new GridLayout(7, 7));
    JLabel sunday = new JLabel("S"),
            monday = new JLabel("M"),
            tuesday = new JLabel("T"),
            wednesday = new JLabel("W"),
            thursday = new JLabel("Th"),
            friday = new JLabel("F"),
            saturday = new JLabel("S");

    centerPanel.add(sunday);
    centerPanel.add(monday);
    centerPanel.add(tuesday);
    centerPanel.add(wednesday);
    centerPanel.add(thursday);
    centerPanel.add(friday);
    centerPanel.add(saturday);

    for(int i = 0; i < 6; i++){
        for(int j = 0; j < 7; j++){
            if(elements[i][j] == -1){
                centerPanel.add(new JLabel(" "));
            }else{
                centerPanel.add(new JButton("" + elements[i][j]));
            }
        }

    }
    // Here is where I attempt to repaint the centerPanel for the JPanel, but it 
    // doesn't work
}

1 Answers1

2

The method being called completely creates a new JPanel and adds in the new JLabels/JButtons, but nothing on the JFrame is updated after this happens. I have attempted using both the repaint and revalidate on the whole JPanel (which includes the JComboBoxes and the grid below it in a BorderLayout), the JPanel with only the grid, and the JFrame, but nothing happens. Does anyone have any ideas what is wrong?

  1. you call another JPanel for (re)validate & repaint

  2. updates are out of visible rectangle on the screen, put JPanel to the JScrollPane

  3. if updates are out of visible rectangle you can to call JFrame.pack(), but in this case JFrame will be changed its Dimension on the screen

The method being called completely creates a new JPanel and adds in the new JLabels/JButtons, but nothing on the JFrame is updated after this happens.

  1. for why reason you re_create a JPanel, create that once time and to play with setVisible(false/true)

  2. don't re_create a JPanel, put these (two or three JPanels) to the CardLayout, then any changes will be only switch betweens views


Community
  • 1
  • 1
mKorbel
  • 109,525
  • 20
  • 134
  • 319