現在、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
}