用户输入后重新绘制JPanels(或JFrames?)?

时间:2012-11-08 06:52:42

标签: java swing jpanel repaint

我目前正在编写Java日历。日历本身填写完全正常,月份和年份显示在它下面的网格上方的JComboBoxes中。网格本身充满了空的JLabel或JButton(本月的日子)。 JComboBoxes链接到ActionListeners,后者检测用户更改信息(由System.out.print语句确认)。但是,在发生这种情况后,我无法找到“重绘”JPanel的方法。被调用的方法完全创建了一个新的JPanel并添加了新的JLabel / JButton,但在这种情况发生后JFrame上没有任何内容。我试图在整个JPanel上使用重绘和重新验证(包括JComboBox和BorderLayout下面的网格),JPanel只有网格和JFrame,但没有任何反应。有没有人有什么想法?

// 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 个答案:

答案 0 :(得分:2)

  

被调用的方法完全创建一个新的JPanel并添加   新的JLabels / JButtons,但在此之后JFrame上没有任何内容更新   发生。我尝试过使用重绘和重新验证   整个JPanel(包括JComboBoxes和它下面的网格)   一个BorderLayout),JPanel只有网格和JFrame,但是   什么都没发生。有没有人有什么想法?

  1. 您致电JPanel&amp;的另一个(re)validate repaint

  2. 更新超出屏幕上的可见矩形,将JPanel添加到JScrollPane

  3. 如果更新超出可见矩形,您可以调用JFrame.pack(),但在这种情况下,JFrame将在屏幕上更改其Dimension

  4.   

    被调用的方法完全创建一个新的JPanel并添加   新的JLabels / JButtons,但JFrame上的任何内容都不会更新   这发生了。

    1. 为什么你重新创建一个JPanel,创建一次并使用setVisible(false / true)

    2. 不要重新创建JPanel,将这些(两个或三个JPanel)放到CardLayout中,然后任何更改都只会在视图之间切换