java面板替换_JavaSwing JPanel在其他面板后面,而不是替换它

本文档描述了一个使用Java Swing构建的日历应用程序的问题,当点击上一月按钮时,新月份的日历没有正确替换当前月份,而是出现在其后面。问题涉及到在JFrame中动态更新JPanel的内容。作者提供了详细的代码,并寻求解决方案。
摘要由CSDN通过智能技术生成

我正在做一个需要日历的项目;是的,我正在从头开始制作日历:)。

我已经设置好了日历部分,现在我正在处理上个月和下个月的按钮。现在,我正在实现前一个月,当我单击按钮时,上一个月确实会显示出来,但是它会显示在当前月份的后面,而不是像您想象的那样替换它。起初,我没有看到任何事情发生在它,所以我检查了我的代码,并再次运行它。这一次,窗户变大了,我看到前一个月比本月晚了。

这是我的完整代码……我做错了什么?

import java.awt.Color;

import java.awt.GridBagConstraints;

import java.awt.GridBagLayout;

import java.awt.event.ActionEvent;

import java.awt.event.ActionListener;

import java.time.DayOfWeek;

import java.time.LocalDate;

import java.time.Month;

import javax.swing.*;

public class CalendarTest extends JFrame {

private JPanel calPanel;

CalendarTest() {

this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

InitCal(LocalDate.now().getMonth(), LocalDate.now().getYear());

this.pack();

this.setVisible(true);

this.setLocationRelativeTo(null);

}

private void InitCal(Month month, int year) {

LocalDate date = LocalDate.of(year, ConvertMonthToInt(month), 1);

DayOfWeek dayOfWeek;

int dayOfMonth;

GridBagConstraints c = new GridBagConstraints();

calPanel = new JPanel(new GridBagLayout());

c.gridx = 0;

c.gridy = 0;

c.fill = GridBagConstraints.BOTH;

JButton previous = new JButton("

previous.setBorderPainted(false);

previous.setFocusPainted(false);

previous.setBackground(Color.WHITE);

previous.addActionListener(new ActionListener() {

@Override

public void actionPerformed(ActionEvent arg0) {

// TODO Auto-generated method stub

LocalDate prevDate = date.minusMonths(1);

InitCal(prevDate.getMonth(), prevDate.getYear());

}

});

calPanel.add(previous, c);

c.gridx++;

c.gridwidth = 3;

calPanel.add(new JButton(month.toString()), c);

c.gridwidth = 2;

c.gridx += 3;

calPanel.add(new JButton(Integer.toString(year)), c);

c.gridwidth = 1;

c.gridx += 2;

calPanel.add(new JButton(">"), c);

c.gridx = 0;

c.gridy++;

JLabel sunday = new JLabel("Sun");

sunday.setHorizontalAlignment(JLabel.CENTER);

calPanel.add(sunday, c);

c.gridx++;

JLabel monday = new JLabel("Mon");

monday.setHorizontalAlignment(JLabel.CENTER);

calPanel.add(monday, c);

c.gridx++;

JLabel tuesday = new JLabel("Tue");

tuesday.setHorizontalAlignment(JLabel.CENTER);

calPanel.add(tuesday, c);

c.gridx++;

JLabel wednesday = new JLabel("Wed");

wednesday.setHorizontalAlignment(JLabel.CENTER);

calPanel.add(wednesday, c);

c.gridx++;

JLabel thursday = new JLabel("Thu");

thursday.setHorizontalAlignment(JLabel.CENTER);

calPanel.add(thursday, c);

c.gridx++;

JLabel friday = new JLabel("Fri");

friday.setHorizontalAlignment(JLabel.CENTER);

calPanel.add(friday, c);

c.gridx++;

JLabel saturday = new JLabel("Sat");

saturday.setHorizontalAlignment(JLabel.CENTER);

calPanel.add(saturday, c);

c.gridx = 0;

c.gridy++;

int fillBeginning = ConvertDayOfWeekToInt(date.getDayOfWeek());

int count = fillBeginning;

if (fillBeginning > 0) {

LocalDate prev = date.minusMonths(1);

int prevDays = GetDaysInMonth(ConvertMonthToInt(prev.getMonth()), prev.getYear());

prevDays -= (fillBeginning - 1);

while (fillBeginning > 0) {

JButton b = new JButton(Integer.toString(prevDays));

b.setBorderPainted(false);

b.setFocusPainted(false);

b.setBackground(new Color(100,150,200));

calPanel.add(b, c);

c.gridx++;

fillBeginning--;

prevDays++;

}

}

int day = 1;

int daysInMonth = GetDaysInMonth(ConvertMonthToInt(month), year);

while(day <= daysInMonth) {

if (count >= 7) {

c.gridy++;

c.gridx = 0;

count = 0;

}

JButton b = new JButton(Integer.toString(day));

b.setBorderPainted(false);

b.setFocusPainted(false);

b.setBackground(Color.WHITE);

calPanel.add(b, c);

count++;

day++;

c.gridx++;

}

int nextDays = 1;

while (7 - count > 0) {

JButton b = new JButton(Integer.toString(nextDays));

b.setBorderPainted(false);

b.setFocusPainted(false);

b.setBackground(new Color(100,150,200));

calPanel.add(b, c);

c.gridx++;

count++;

nextDays++;

}

this.add(calPanel);

}

private int ConvertMonthToInt(Month m) {

switch(m.toString()) {

case "JANUARY" : return 1;

case "FEBRUARY" : return 2;

case "MARCH" : return 3;

case "APRIL" : return 4;

case "MAY" : return 5;

case "JUNE" : return 6;

case "JULY" : return 7;

case "AUGUST" : return 8;

case "SEPTEMBER" : return 9;

case "OCTOBER" : return 10;

case "NOVEMBER" : return 11;

case "DECEMBER" : return 12;

default: return 0;

}

}

private int ConvertDayOfWeekToInt(DayOfWeek dow) {

switch(dow.toString()) {

case "SUNDAY" : return 0;

case "MONDAY" : return 1;

case "TUESDAY" : return 2;

case "WEDNESDAY" : return 3;

case "THURSDAY" : return 4;

case "FRIDAY" : return 5;

case "SATURDAY" : return 6;

default : return 0;

}

}

private int GetDaysInMonth(int m, int y) {

switch(m) {

case 4 : case 6 : case 9 : case 11 : return 30;

case 1 : case 3 : case 5 : case 7 : case 8 : case 10 : case 12 : return 31;

case 2 :

if (IsLeapYear(y)) {

return 29;

} else {

return 28;

}

default : return 0;

}

}

private boolean IsLeapYear(int y) {

if (y % 4 == 0) {

return true;

} else if (y % 100 == 0) {

return false;

}

return false;

}

public static void main(String[] args) {

new CalendarTest();

}

}

PNThX.png

看到2018年12月在2019年1月下的表现了吗?我希望一月消失,取而代之的是十二月。这个图像是在我调整了它的大小之后,在单击上一个按钮之后。

我也试过放置

JPanel calPanel = new JPanel(new GridBagLayout());

里面

InitCal()

方法。和以前一样。有什么建议吗?

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值