📄 datechooser.java
字号:
});
}
private void updateDate(){
center.setText(select.get(Calendar.YEAR)+"年"+(select.get(Calendar.MONTH)+1)+"月");
}
}
private class JP2 extends JPanel{
public JP2(){
this.setPreferredSize(new Dimension(295,20));
}
protected void paintComponent(Graphics g){
g.setFont(font);
g.drawString("星期日 星期一 星期二 星期三 星期四 星期五 星期六",5,10);
g.drawLine(0,15,getWidth(),15);
}
}
private class JP3 extends JPanel{
public JP3(){
super(new GridLayout(6,7));
this.setPreferredSize(new Dimension(295,100));
initJP3();
}
private void initJP3(){
updateDate();
}
public void updateDate(){
this.removeAll();
lm.clear();
Date temp=select.getTime();
Calendar select=Calendar.getInstance();
select.setTime(temp);
select.set(Calendar.DAY_OF_MONTH,1);
int index=select.get(Calendar.DAY_OF_WEEK);
int sum=(index==1?8:index);
select.add(Calendar.DAY_OF_MONTH,0-sum);
for(int i=0;i<42;i++){
select.add(Calendar.DAY_OF_MONTH,1);
lm.addLabel(new MyLabel(select.get(Calendar.YEAR),
select.get(Calendar.MONTH),select.get(Calendar.DAY_OF_MONTH)));
}
for(MyLabel my:lm.getLabels()){
this.add(my);
}
select.setTime(temp);
}
}
private class MyLabel extends JLabel implements Comparator<MyLabel>,
MouseListener,MouseMotionListener{
private int year,month,day;
private boolean isSelected;
public MyLabel(int year,int month,int day){
super(""+day,JLabel.CENTER);
this.year=year;
this.day=day;
this.month=month;
this.addMouseListener(this);
this.addMouseMotionListener(this);
this.setFont(font);
if(month==select.get(Calendar.MONTH)){
this.setForeground(Color.BLACK);
}else{
this.setForeground(Color.LIGHT_GRAY);
}
if(day==select.get(Calendar.DAY_OF_MONTH)){
this.setBackground(new Color(160,185,215));
}else{
this.setBackground(Color.WHITE);
}
}
public boolean getIsSelected(){
return isSelected;
}
public void setSelected(boolean b,boolean isDrag){
isSelected=b;
if(b&&!isDrag){
int temp=select.get(Calendar.MONTH);
select.set(year,month,day);
if(temp==month){
SwingUtilities.updateComponentTreeUI(jp3);
}else{
refresh();
}
}
this.repaint();
}
protected void paintComponent(Graphics g){
if(day==select.get(Calendar.DAY_OF_MONTH)&&
month==select.get(Calendar.MONTH)){
//如果当前日期是选择日期,则高亮显示
g.setColor(new Color(160,185,215));
g.fillRect(0,0,getWidth(),getHeight());
}
if(year==now.get(Calendar.YEAR)&&
month==now.get(Calendar.MONTH)&&
day==now.get(Calendar.DAY_OF_MONTH)){
//如果日期和当前日期一样,则用红框
Graphics2D gd=(Graphics2D)g;
gd.setColor(Color.RED);
Polygon p=new Polygon();
p.addPoint(0,0);
p.addPoint(getWidth()-1,0);
p.addPoint(getWidth()-1,getHeight()-1);
p.addPoint(0,getHeight()-1);
gd.drawPolygon(p);
}
if(isSelected){//如果被选中了就画出一个虚线框出来
Stroke s=new BasicStroke(1.0f,BasicStroke.CAP_SQUARE,
BasicStroke.JOIN_BEVEL,1.0f,new float[]{2.0f,2.0f},1.0f);
Graphics2D gd=(Graphics2D)g;
gd.setStroke(s);
gd.setColor(Color.BLACK);
Polygon p=new Polygon();
p.addPoint(0,0);
p.addPoint(getWidth()-1,0);
p.addPoint(getWidth()-1,getHeight()-1);
p.addPoint(0,getHeight()-1);
gd.drawPolygon(p);
}
super.paintComponent(g);
}
public boolean contains(Point p){
return this.getBounds().contains(p);
}
private void update(){
repaint();
}
public void mouseClicked(MouseEvent e) {
}
public void mousePressed(MouseEvent e) {
isSelected=true;
update();
}
public void mouseReleased(MouseEvent e) {
Point p=SwingUtilities.convertPoint(this,e.getPoint(),jp3);
lm.setSelect(p,false);
commit();
}
public void mouseEntered(MouseEvent e) {
}
public void mouseExited(MouseEvent e) {
}
public void mouseDragged(MouseEvent e) {
Point p=SwingUtilities.convertPoint(this,e.getPoint(),jp3);
lm.setSelect(p,true);
}
public void mouseMoved(MouseEvent e) {
}
public int compare(MyLabel o1, MyLabel o2) {
Calendar c1=Calendar.getInstance();
c1.set(o1.year,o2.month,o1.day);
Calendar c2=Calendar.getInstance();
c2.set(o2.year,o2.month,o2.day);
return c1.compareTo(c2);
}
}
private class LabelManager{
private List<MyLabel> list;
public LabelManager(){
list=new ArrayList<MyLabel>();
}
public List<MyLabel> getLabels(){
return list;
}
public void addLabel(MyLabel my){
list.add(my);
}
public void clear(){
list.clear();
}
public void setSelect(MyLabel my,boolean b){
for(MyLabel m:list){
if(m.equals(my)){
m.setSelected(true,b);
}else{
m.setSelected(false,b);
}
}
}
public void setSelect(Point p,boolean b){
//如果是拖动,则要优化一下,以提高效率
if(b){
//表示是否能返回,不用比较完所有的标签,能返回的标志就是把上一个标签和
//将要显示的标签找到了就可以了
boolean findPrevious=false,findNext=false;
for(MyLabel m:list){
if(m.contains(p)){
findNext=true;
if(m.getIsSelected()){
findPrevious=true;
}else{
m.setSelected(true,b);
}
}else if(m.getIsSelected()){
findPrevious=true;
m.setSelected(false,b);
}
if(findPrevious&&findNext){
return;
}
}
}else{
MyLabel temp=null;
for(MyLabel m:list){
if(m.contains(p)){
temp=m;
}else if(m.getIsSelected()){
m.setSelected(false,b);
}
}
if(temp!=null){
temp.setSelected(true,b);
}
}
}
}
private class JP4 extends JPanel{
public JP4(){
super(new BorderLayout());
this.setPreferredSize(new Dimension(295,20));
this.setBackground(new Color(160,185,215));
SimpleDateFormat sdf=new SimpleDateFormat("yyyy年MM月dd日");
final JLabel jl=new JLabel("今天: "+sdf.format(new Date()));
jl.setToolTipText("点击回到今天日期");
this.add(jl,BorderLayout.CENTER);
jl.addMouseListener(new MouseAdapter(){
public void mouseEntered(MouseEvent me){
jl.setCursor(new Cursor(Cursor.HAND_CURSOR));
jl.setForeground(Color.RED);
}
public void mouseExited(MouseEvent me){
jl.setCursor(new Cursor(Cursor.DEFAULT_CURSOR));
jl.setForeground(Color.BLACK);
}
public void mousePressed(MouseEvent me){
jl.setForeground(Color.WHITE);
select.setTime(new Date());
refresh();
commit();
}
public void mouseReleased(MouseEvent me){
jl.setForeground(Color.BLACK);
}
});
}
}
public static void main(String[] args) {
final DateChooser mp=new DateChooser();
JFrame jf=new JFrame("test");
jf.add(mp,BorderLayout.CENTER);
jf.add(new JButton("测试用的"),BorderLayout.NORTH);
jf.pack();
jf.setLocationRelativeTo(null);
jf.setVisible(true);
jf.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -