2

現在、Java でカレンダーをプログラミングしています。カレンダー自体は、その下のグリッドの上にある JComboBoxes に月と年が表示され、完全にうまく入力されます。Grid 自体は空の JLabel または JButton でいっぱいです (その月の日について)。JComboBox は、ユーザーの変更情報を検出する ActionListeners にリンクされています (System.out.print ステートメントによって確認されます)。ただし、これが発生した後に JPanel を「再描画」する方法が見つかりません。呼び出されるメソッドは完全に新しい JPanel を作成し、新しい JLabels/JButton を追加しますが、これが発生した後、JFrame は何も更新されません。JPanel 全体 (BorderLayout の JComboBoxes とその下のグリッドを含む)、グリッドのみの 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
}
4

1 に答える 1

2

呼び出されるメソッドは完全に新しい JPanel を作成し、新しい JLabels/JButton を追加しますが、これが発生した後、JFrame は何も更新されません。JPanel 全体 (BorderLayout の JComboBoxes とその下のグリッドを含む)、グリッドのみの JPanel、および JFrame で再描画と再検証の両方を使用しようとしましたが、何も起こりません。誰が何が間違っているのか考えていますか?

  1. あなたは&のJPanelために別のものを呼び出します(re)validaterepaint

  2. 更新は画面上の目に見える四角形の外にありJPanelJScrollPane

  3. 更新が目に見える長方形の外にある場合は、JFrame.pack() を呼び出すことができますが、この場合、JFrame は画面上の寸法が変更されます。

呼び出されるメソッドは完全に新しい JPanel を作成し、新しい JLabels/JButton を追加しますが、これが発生した後、JFrame は何も更新されません。

  1. JPanelを再作成し、一度作成してsetVisible(false/true)で遊ぶ理由

  2. JPanel を再作成せず、これら (2 つまたは 3 つの JPanel) を CardLayout に配置すると、変更はビュー間の切り替えのみになります。


  • より良いヘルプのために、SSCCE、短い、実行可能、コンパイル可能をすぐに投稿してください

  • コード例

于 2012-11-08T07:54:44.257 に答える