我目前正在编写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
}
答案 0 :(得分:2)
被调用的方法完全创建一个新的JPanel并添加 新的JLabels / JButtons,但在此之后JFrame上没有任何内容更新 发生。我尝试过使用重绘和重新验证 整个JPanel(包括JComboBoxes和它下面的网格) 一个BorderLayout),JPanel只有网格和JFrame,但是 什么都没发生。有没有人有什么想法?
您致电JPanel
&amp;的另一个(re)validate
repaint
更新超出屏幕上的可见矩形,将JPanel
添加到JScrollPane
如果更新超出可见矩形,您可以调用JFrame.pack(),但在这种情况下,JFrame将在屏幕上更改其Dimension
被调用的方法完全创建一个新的JPanel并添加 新的JLabels / JButtons,但JFrame上的任何内容都不会更新 这发生了。
为什么你重新创建一个JPanel,创建一次并使用setVisible(false / true)
不要重新创建JPanel,将这些(两个或三个JPanel)放到CardLayout中,然后任何更改都只会在视图之间切换
更快地发布SSCCE,简短,可运行,可编辑