两段代码,一个是指针式时钟,继承JPanel,一个是日历,继承JApplet,我想把他们合到一块,我这样行么,把JApplet定义为接口,把它整合到时钟代码中去??还有这个frame.getcontentpane().add(),能添加多个东西么
MyCalendar.javaimport java.awt.*;
import java.awt.event.*;
import java.util.*;
import javax.swing.*;
import javax.swing.event.*;
import javax.swing.table.*;
public class MyCalendar extends JApplet {
public static final String WEEK_SUN = "SUN";
public static final String WEEK_MON = "MON";
public static final String WEEK_TUE = "TUE";
public static final String WEEK_WED = "WED";
public static final String WEEK_THU = "THU";
public static final String WEEK_FRI = "FRI";
public static final String WEEK_SAT = "SAT";
public static final Color background = Color.white;
public static final Color foreground = Color.black;
public static final Color headerBackground = Color.blue;
public static final Color headerForeground = Color.white;
public static final Color selectedBackground = Color.blue;
public static final Color selectedForeground = Color.white;
private JPanel cPane;
private JLabel yearsLabel;
private JSpinner yearsSpinner;
private JLabel monthsLabel;
private JComboBox monthsComboBox;
private JTable daysTable;
private AbstractTableModel daysModel;
private Calendar calendar;
public MyCalendar() {
cPane = (JPanel) getContentPane();
}
public void init() {
cPane.setLayout(new BorderLayout());
calendar = Calendar.getInstance();
calendar = Calendar.getInstance();
yearsLabel = new JLabel("Year: ");
yearsSpinner = new JSpinner(); //选择年份
yearsSpinner.setEditor(new JSpinner.NumberEditor(yearsSpinner, "0000"));
yearsSpinner.setValue(new Integer(calendar.get(Calendar.YEAR)));
yearsSpinner.addChangeListener(new ChangeListener() {
public void stateChanged(ChangeEvent changeEvent) {
int day = calendar.get(Calendar.DAY_OF_MONTH);
calendar.set(Calendar.DAY_OF_MONTH, 1);
calendar.set(Calendar.YEAR, ((Integer) yearsSpinner.getValue()).intValue());
int maxDay = calendar.getActualMaximum(Calendar.DAY_OF_MONTH);
calendar.set(Calendar.DAY_OF_MONTH, day > maxDay ? maxDay : day);
updateView();
} });
JPanel yearMonthPanel = new JPanel();
cPane.add(yearMonthPanel, BorderLayout.NORTH); //增加年月的面板
yearMonthPanel.setLayout(new BorderLayout());
yearMonthPanel.add(new JPanel(), BorderLayout.CENTER);
JPanel yearPanel = new JPanel();
yearMonthPanel.add(yearPanel, BorderLayout.WEST);
yearPanel.setLayout(new BorderLayout());
yearPanel.add(yearsLabel, BorderLayout.WEST);
yearPanel.add(yearsSpinner, BorderLayout.CENTER);
monthsLabel = new JLabel("Month: ");
monthsComboBox = new JComboBox();
for (int i = 1; i <= 12; i++) {
monthsComboBox.addItem(new Integer(i));
}
monthsComboBox.setSelectedIndex(calendar.get(Calendar.MONTH));
monthsComboBox.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent actionEvent) {
int day = calendar.get(Calendar.DAY_OF_MONTH);
calendar.set(Calendar.DAY_OF_MONTH, 1);
calendar.set(Calendar.MONTH, monthsComboBox.getSelectedIndex());
int maxDay = calendar.getActualMaximum(Calendar.DAY_OF_MONTH);
calendar.set(Calendar.DAY_OF_MONTH, day > maxDay ? maxDay : day);
updateView();
}
});
JPanel monthPanel = new JPanel();
yearMonthPanel.add(monthPanel, BorderLayout.EAST);
monthPanel.setLayout(new BorderLayout());
monthPanel.add(monthsLabel, BorderLayout.WEST);
monthPanel.add(monthsComboBox, BorderLayout.CENTER); daysModel = new AbstractTableModel() {
public int getRowCount() {
return 7;
}
public int getColumnCount() {
return 7;
}
public Object getValueAt(int row, int column) {
if (row == 0) {
return getHeader(column);
}
row--;
Calendar calendar = (Calendar) MyCalendar.this.calendar.clone();
calendar.set(Calendar.DAY_OF_MONTH, 1);
int dayCount = calendar.getActualMaximum(Calendar.DAY_OF_MONTH);
int moreDayCount = calendar.get(Calendar.DAY_OF_WEEK) - 1;
int index = row * 7 + column;
int dayIndex = index - moreDayCount + 1;
if (index < moreDayCount || dayIndex > dayCount) {
return null;
} else {
return new Integer(dayIndex);
}
}
};
daysTable = new CalendarTable(daysModel, calendar);
daysTable.setCellSelectionEnabled(true);
daysTable.setSelectionMode(ListSelectionModel.SINGLE_SELECTION);
daysTable.setDefaultRenderer(daysTable.getColumnClass(0), new TableCellRenderer() {
public Component getTableCellRendererComponent(JTable table, Object value, boolean isSelected,
boolean hasFocus, int row, int column) {
String text = (value == null) ? "" : value.toString();
JLabel cell = new JLabel(text);
cell.setOpaque(true);
if (row == 0) {
cell.setForeground(headerForeground);
cell.setBackground(headerBackground);
} else {
if (isSelected) {
cell.setForeground(selectedForeground);
cell.setBackground(selectedBackground);
} else {
cell.setForeground(foreground);
cell.setBackground(background);
}
}
return cell;
}
});
updateView();
cPane.add(daysTable, BorderLayout.CENTER);
}
public static String getHeader(int index) {
switch (index) {
case 0:
return WEEK_SUN;
case 1:
return WEEK_MON;
case 2:
return WEEK_TUE;
case 3:
return WEEK_WED;
case 4:
return WEEK_THU;
case 5:
return WEEK_FRI;
case 6:
return WEEK_SAT;
default:
return null;
}
}
public void updateView() {
daysModel.fireTableDataChanged();
daysTable.setRowSelectionInterval(calendar.get(Calendar.WEEK_OF_MONTH),
calendar.get(Calendar.WEEK_OF_MONTH));
daysTable.setColumnSelectionInterval(calendar.get(Calendar.DAY_OF_WEEK) - 1,
calendar.get(Calendar.DAY_OF_WEEK) - 1);
} public static class CalendarTable extends JTable { private Calendar calendar; public CalendarTable(TableModel model, Calendar calendar) {
super(model);
this.calendar = calendar;
} public void changeSelection(int row, int column, boolean toggle, boolean extend) {
super.changeSelection(row, column, toggle, extend);
if (row == 0) {
return;
}
Object obj = getValueAt(row, column);
if (obj != null) {
calendar.set(Calendar.DAY_OF_MONTH, ((Integer)obj).intValue());
}
} }
public static void main(String[] args) {
JFrame frame = new JFrame("Calendar Application");
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
MyCalendar myCalendar = new MyCalendar();
myCalendar.init();
frame.getContentPane().add(myCalendar);
frame.setSize(240, 172);
frame.show();
}
}
MyCalendar.javaimport java.awt.*;
import java.awt.event.*;
import java.util.*;
import javax.swing.*;
import javax.swing.event.*;
import javax.swing.table.*;
public class MyCalendar extends JApplet {
public static final String WEEK_SUN = "SUN";
public static final String WEEK_MON = "MON";
public static final String WEEK_TUE = "TUE";
public static final String WEEK_WED = "WED";
public static final String WEEK_THU = "THU";
public static final String WEEK_FRI = "FRI";
public static final String WEEK_SAT = "SAT";
public static final Color background = Color.white;
public static final Color foreground = Color.black;
public static final Color headerBackground = Color.blue;
public static final Color headerForeground = Color.white;
public static final Color selectedBackground = Color.blue;
public static final Color selectedForeground = Color.white;
private JPanel cPane;
private JLabel yearsLabel;
private JSpinner yearsSpinner;
private JLabel monthsLabel;
private JComboBox monthsComboBox;
private JTable daysTable;
private AbstractTableModel daysModel;
private Calendar calendar;
public MyCalendar() {
cPane = (JPanel) getContentPane();
}
public void init() {
cPane.setLayout(new BorderLayout());
calendar = Calendar.getInstance();
calendar = Calendar.getInstance();
yearsLabel = new JLabel("Year: ");
yearsSpinner = new JSpinner(); //选择年份
yearsSpinner.setEditor(new JSpinner.NumberEditor(yearsSpinner, "0000"));
yearsSpinner.setValue(new Integer(calendar.get(Calendar.YEAR)));
yearsSpinner.addChangeListener(new ChangeListener() {
public void stateChanged(ChangeEvent changeEvent) {
int day = calendar.get(Calendar.DAY_OF_MONTH);
calendar.set(Calendar.DAY_OF_MONTH, 1);
calendar.set(Calendar.YEAR, ((Integer) yearsSpinner.getValue()).intValue());
int maxDay = calendar.getActualMaximum(Calendar.DAY_OF_MONTH);
calendar.set(Calendar.DAY_OF_MONTH, day > maxDay ? maxDay : day);
updateView();
} });
JPanel yearMonthPanel = new JPanel();
cPane.add(yearMonthPanel, BorderLayout.NORTH); //增加年月的面板
yearMonthPanel.setLayout(new BorderLayout());
yearMonthPanel.add(new JPanel(), BorderLayout.CENTER);
JPanel yearPanel = new JPanel();
yearMonthPanel.add(yearPanel, BorderLayout.WEST);
yearPanel.setLayout(new BorderLayout());
yearPanel.add(yearsLabel, BorderLayout.WEST);
yearPanel.add(yearsSpinner, BorderLayout.CENTER);
monthsLabel = new JLabel("Month: ");
monthsComboBox = new JComboBox();
for (int i = 1; i <= 12; i++) {
monthsComboBox.addItem(new Integer(i));
}
monthsComboBox.setSelectedIndex(calendar.get(Calendar.MONTH));
monthsComboBox.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent actionEvent) {
int day = calendar.get(Calendar.DAY_OF_MONTH);
calendar.set(Calendar.DAY_OF_MONTH, 1);
calendar.set(Calendar.MONTH, monthsComboBox.getSelectedIndex());
int maxDay = calendar.getActualMaximum(Calendar.DAY_OF_MONTH);
calendar.set(Calendar.DAY_OF_MONTH, day > maxDay ? maxDay : day);
updateView();
}
});
JPanel monthPanel = new JPanel();
yearMonthPanel.add(monthPanel, BorderLayout.EAST);
monthPanel.setLayout(new BorderLayout());
monthPanel.add(monthsLabel, BorderLayout.WEST);
monthPanel.add(monthsComboBox, BorderLayout.CENTER); daysModel = new AbstractTableModel() {
public int getRowCount() {
return 7;
}
public int getColumnCount() {
return 7;
}
public Object getValueAt(int row, int column) {
if (row == 0) {
return getHeader(column);
}
row--;
Calendar calendar = (Calendar) MyCalendar.this.calendar.clone();
calendar.set(Calendar.DAY_OF_MONTH, 1);
int dayCount = calendar.getActualMaximum(Calendar.DAY_OF_MONTH);
int moreDayCount = calendar.get(Calendar.DAY_OF_WEEK) - 1;
int index = row * 7 + column;
int dayIndex = index - moreDayCount + 1;
if (index < moreDayCount || dayIndex > dayCount) {
return null;
} else {
return new Integer(dayIndex);
}
}
};
daysTable = new CalendarTable(daysModel, calendar);
daysTable.setCellSelectionEnabled(true);
daysTable.setSelectionMode(ListSelectionModel.SINGLE_SELECTION);
daysTable.setDefaultRenderer(daysTable.getColumnClass(0), new TableCellRenderer() {
public Component getTableCellRendererComponent(JTable table, Object value, boolean isSelected,
boolean hasFocus, int row, int column) {
String text = (value == null) ? "" : value.toString();
JLabel cell = new JLabel(text);
cell.setOpaque(true);
if (row == 0) {
cell.setForeground(headerForeground);
cell.setBackground(headerBackground);
} else {
if (isSelected) {
cell.setForeground(selectedForeground);
cell.setBackground(selectedBackground);
} else {
cell.setForeground(foreground);
cell.setBackground(background);
}
}
return cell;
}
});
updateView();
cPane.add(daysTable, BorderLayout.CENTER);
}
public static String getHeader(int index) {
switch (index) {
case 0:
return WEEK_SUN;
case 1:
return WEEK_MON;
case 2:
return WEEK_TUE;
case 3:
return WEEK_WED;
case 4:
return WEEK_THU;
case 5:
return WEEK_FRI;
case 6:
return WEEK_SAT;
default:
return null;
}
}
public void updateView() {
daysModel.fireTableDataChanged();
daysTable.setRowSelectionInterval(calendar.get(Calendar.WEEK_OF_MONTH),
calendar.get(Calendar.WEEK_OF_MONTH));
daysTable.setColumnSelectionInterval(calendar.get(Calendar.DAY_OF_WEEK) - 1,
calendar.get(Calendar.DAY_OF_WEEK) - 1);
} public static class CalendarTable extends JTable { private Calendar calendar; public CalendarTable(TableModel model, Calendar calendar) {
super(model);
this.calendar = calendar;
} public void changeSelection(int row, int column, boolean toggle, boolean extend) {
super.changeSelection(row, column, toggle, extend);
if (row == 0) {
return;
}
Object obj = getValueAt(row, column);
if (obj != null) {
calendar.set(Calendar.DAY_OF_MONTH, ((Integer)obj).intValue());
}
} }
public static void main(String[] args) {
JFrame frame = new JFrame("Calendar Application");
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
MyCalendar myCalendar = new MyCalendar();
myCalendar.init();
frame.getContentPane().add(myCalendar);
frame.setSize(240, 172);
frame.show();
}
}
解决方案 »
- 求 java 年月日 - 时分秒 加法(算法)
- 具有滚动条/滑动条的table
- java的多继承问题
- 操作符“+”的定义,他是否是new了一个新的字符串?
- 急急急 在线等
- 请高手指点个基础问题: java 中能不能用ArrayList 来比较多个主键的记录????????????
- 访问private变量问题
- 为什么Non-static class 内不能有static data static method static class?
- 有谁知道取得JTextPane类中的对象的数据的方法?
- 请问:DTD中的 env-entry 是做什么用的?
- 哪位大师能解决这个BUG问题?
- 帮我编写一个程序将5 9 3 三个数,重新排列,得到一个最大三位数和一个最小三位数,并输出
import java.awt.*;
import javax.swing.*;
import java.util.*;
import java.awt.event.*;
import java.text.*;
import javax.swing.event.*;
import javax.swing.table.*;
public class Clock extends JPanel implements Runnable{
private JTextField jt;
private JPanel jp;
public Clock(){
Thread c=new Thread(this);
c.start();
jp=new JPanel();
jt=new JTextField();
jt.setEditable(false);
jt.setHorizontalAlignment(jt.CENTER);
this.setLayout(new BorderLayout());
add(jt,BorderLayout.SOUTH);
add(jp,BorderLayout.CENTER);
}
public void run(){
while(true){
this.repaint();
try{
Thread.sleep(1000);
}
catch(Exception e){
e.printStackTrace();
}
}
}
public void paint(Graphics g){
super.paint(g);
Calendar cal=Calendar.getInstance();
DateFormat format=DateFormat.getDateTimeInstance(DateFormat.LONG,
DateFormat.LONG,this.getLocale());
jt.setText(format.format(cal.getTime()));
int min=Math.min(this.getSize().width,this.getSize().height);
int radix=(int)(min*0.8);
int kedu=(int)(radix*0.48);
int sl=(int)(radix*0.4);
int ml=(int)(sl*0.8);
int hl=(int)(ml*0.8);
int xo=this.getSize().width/2;
int yo=this.getSize().height/2;
for(int i=0;i<60;i++){
if(i%5==0){
g.drawLine((int)(kedu*0.92*(Math.sin(i*Math.PI/30))+xo),
(int)(yo-(kedu*0.92*(Math.cos(i*Math.PI/30)))),
(int)(xo+(radix/2)*(Math.sin(i*Math.PI/30))),
(int)(yo-(radix/2*(Math.cos(i*Math.PI/30)))));
if(i==0)
g.drawString(""+12,(int)(kedu*0.92*(Math.sin(i*Math.PI/30))+xo),
(int)(yo-(kedu*0.92*(Math.cos(i*Math.PI/30)))));
else
g.drawString(""+i/5,(int)(kedu*0.92*(Math.sin(i*Math.PI/30))+xo),
(int)(yo-(kedu*0.92*(Math.cos(i*Math.PI/30)))));
}
g.drawLine((int)(kedu*(Math.sin(i*Math.PI/30))+xo),
(int)(yo-(kedu*(Math.cos(i*Math.PI/30)))),
(int)(xo+(radix/2)*(Math.sin(i*Math.PI/30))),
(int)(yo-(radix/2*(Math.cos(i*Math.PI/30)))));
}
g.drawOval((this.getSize().width-radix)/2,(this.getSize().height-radix)/2,radix,radix);
Graphics2D gg=(Graphics2D)g;
gg.setColor(Color.MAGENTA);
gg.setStroke(new BasicStroke(4.5f));
gg.drawLine(xo,yo,xo+(int)(hl*Math.sin((cal.get(Calendar.MINUTE)/60.0+cal.get(Calendar.HOUR))*
Math.PI/6)),yo-(int)((hl*Math.cos((cal.get(Calendar.MINUTE)/60.0+cal.get(Calendar.HOUR))*
Math.PI/6))));
gg.setColor(Color.BLUE);
gg.setStroke(new BasicStroke(2.7f));
gg.drawLine(xo,yo,xo+(int)(ml*Math.sin(cal.get(Calendar.MINUTE)*Math.PI/30)),
yo-(int)(ml*Math.cos(cal.get(Calendar.MINUTE)*Math.PI/30)));
gg.setStroke(new BasicStroke(1.0f));
gg.setColor(Color.RED);
gg.drawLine(xo,yo,xo+(int)(sl*Math.sin(cal.get(Calendar.SECOND)*Math.PI/30)),
yo-(int)(sl*Math.cos(cal.get(Calendar.SECOND)*Math.PI/30)));
}
public static void main(String args[]){
Clock cd=new Clock();
JFrame j=new JFrame("clock");
j.getContentPane().add(cd);
j.setBounds(200,200,400,400);
j.setVisible(true);
j.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
}
}
//<applet code=Clock.class width=300 height=300></applet>
frame.getContentPanel().add(),可以加多个东西,它是容器啊.
楼主的真正意图是什么呢?
1)若“是作为一个JApplet嵌在网页中运行”,则可:新设计一个类,从JApplet继承,该类是一个容器,将你的两个组件(指针式时钟,日历)布局在其中,就行了。
2)若不是“是作为一个JApplet嵌在网页中运行”,而是作为一个单独的应用程序运行,则:你设计一个类,从JFrame继承,把它作为一个容器,将你的两个组件(指针式时钟,日历)布局在其中,就行了。
3)若“既能作为一个JApplet嵌在网页中运行,又能作为一个单独的应用程序运行”,则:设计一个类,从JApplet继承,该类是一个容器,将你的两个组件(指针式时钟,日历)布局在其中。然后在该类中放一个main(...),在main(...)中创始一个JFrame,同时作为容器,将你的两个组件(指针式时钟,日历)出布局在其中JFrame中。就行了。上边讲的这些技术,在好几年前(那还是Applet年代),就玩过这些技术(当然这些技术,现在已几乎淘汰了)不再用了。
老技术了。
import javax.swing.*;
import java.util.*;
import java.awt.event.*;
import java.text.*;
import javax.swing.event.*;
import javax.swing.table.*;public class MyCalendar_Clock extends JFrame implements Runnable
{
private JPanel jp;
MyCalendar_Clock()
{
Thread c=new Thread(this);
c.start();
JFrame frame=new JFrame("MyCalendar_Clock");
jp=new JPanel();
frame.add(jp,BorderLayout.CENTER);
frame.setSize(300, 300);
frame.setVisible(true);
frame.setDefaultCloseOperation(frame.EXIT_ON_CLOSE);
setVisible(true);
}
public void run(){
while(true){
this.repaint();
try{
Thread.sleep(1000);
}
catch(Exception e){
e.printStackTrace();
}
}
}
public void paint(Graphics g){
super.paint(g);
Calendar cal=Calendar.getInstance();
DateFormat format=DateFormat.getDateTimeInstance(DateFormat.LONG,
DateFormat.LONG,this.getLocale());
int min=Math.min(this.getSize().width,this.getSize().height);
int radix=(int)(min*0.8);
int kedu=(int)(radix*0.48);
int sl=(int)(radix*0.4);
int ml=(int)(sl*0.8);
int hl=(int)(ml*0.8);
int xo=this.getSize().width/2;
int yo=this.getSize().height/2;
for(int i=0;i<60;i++){
if(i%5==0){
g.drawLine((int)(kedu*0.92*(Math.sin(i*Math.PI/30))+xo),
(int)(yo-(kedu*0.92*(Math.cos(i*Math.PI/30)))),
(int)(xo+(radix/2)*(Math.sin(i*Math.PI/30))),
(int)(yo-(radix/2*(Math.cos(i*Math.PI/30)))));
if(i==0)
g.drawString(""+12,(int)(kedu*0.92*(Math.sin(i*Math.PI/30))+xo),
(int)(yo-(kedu*0.92*(Math.cos(i*Math.PI/30)))));
else
g.drawString(""+i/5,(int)(kedu*0.92*(Math.sin(i*Math.PI/30))+xo),
(int)(yo-(kedu*0.92*(Math.cos(i*Math.PI/30)))));
}
g.drawLine((int)(kedu*(Math.sin(i*Math.PI/30))+xo),
(int)(yo-(kedu*(Math.cos(i*Math.PI/30)))),
(int)(xo+(radix/2)*(Math.sin(i*Math.PI/30))),
(int)(yo-(radix/2*(Math.cos(i*Math.PI/30)))));
}
g.drawOval((this.getSize().width-radix)/2,(this.getSize().height-radix)/2,radix,radix);
Graphics2D gg=(Graphics2D)g;
gg.setColor(Color.MAGENTA);
gg.setStroke(new BasicStroke(4.5f));
gg.drawLine(xo,yo,xo+(int)(hl*Math.sin((cal.get(Calendar.MINUTE)/60.0+cal.get(Calendar.HOUR))*
Math.PI/6)),yo-(int)((hl*Math.cos((cal.get(Calendar.MINUTE)/60.0+cal.get(Calendar.HOUR))*
Math.PI/6))));
gg.setColor(Color.BLUE);
gg.setStroke(new BasicStroke(2.7f));
gg.drawLine(xo,yo,xo+(int)(ml*Math.sin(cal.get(Calendar.MINUTE)*Math.PI/30)),
yo-(int)(ml*Math.cos(cal.get(Calendar.MINUTE)*Math.PI/30)));
gg.setStroke(new BasicStroke(1.0f));
gg.setColor(Color.RED);
gg.drawLine(xo,yo,xo+(int)(sl*Math.sin(cal.get(Calendar.SECOND)*Math.PI/30)),
yo-(int)(sl*Math.cos(cal.get(Calendar.SECOND)*Math.PI/30)));
}
public static void main(String args[]){
MyCalendar_Clock Mycc=new MyCalendar_Clock();
}
}
//private JPanel jp;
//public static final String WEEK_SUN = "SUN";
//public static final String WEEK_MON = "MON";
//等等。。
MyCalendar_Clock()
{
Thread c=new Thread(this);
c.start();
JFrame frame=new JFrame("MyCalendar_Clock");
jp=new JPanel();
add(jp,BorderLayout.CENTER);
add(cPane,BorderLayout.SOUTH);
frame.setSize(300, 300);
frame.setVisible(true);
frame.setDefaultCloseOperation(frame.EXIT_ON_CLOSE);
setVisible(true);
cPane = (JPanel) getContentPane();//*********************************
}//.............其余的方法run paint init 等等照样搬过来,public static void main(String args[]){
MyCalendar_Clock Mycc=new MyCalendar_Clock();
Mycc.init();
俺实践下俺的承诺 以下为同一个java文件 名为MyTool.java 因为太长所以分开发import java.awt.BasicStroke;
import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.Component;
import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.text.DateFormat;
import java.util.Calendar;import javax.swing.JComboBox;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.JSpinner;
import javax.swing.JTable;
import javax.swing.JTextField;
import javax.swing.ListSelectionModel;
import javax.swing.event.ChangeEvent;
import javax.swing.event.ChangeListener;
import javax.swing.table.AbstractTableModel;
import javax.swing.table.TableCellRenderer;
import javax.swing.table.TableModel;class MyClock extends JPanel implements Runnable{
private JTextField jt;
private JPanel jp;
public MyClock(){
Thread c=new Thread(this);
c.start();
jp=new JPanel();
jt=new JTextField();
jt.setEditable(false);
jt.setHorizontalAlignment(jt.CENTER);
this.setLayout(new BorderLayout());
add(jt,BorderLayout.SOUTH);
add(jp,BorderLayout.CENTER);
}
public void run(){
while(true){
this.repaint();
try{
Thread.sleep(1000);
}
catch(Exception e){
e.printStackTrace();
}
}
}
public void paint(Graphics g){
super.paint(g);
Calendar cal=Calendar.getInstance();
DateFormat format=DateFormat.getDateTimeInstance(DateFormat.LONG,
DateFormat.LONG,this.getLocale());
jt.setText(format.format(cal.getTime()));
int min=Math.min(this.getSize().width,this.getSize().height);
int radix=(int)(min*0.8);
int kedu=(int)(radix*0.48);
int sl=(int)(radix*0.4);
int ml=(int)(sl*0.8);
int hl=(int)(ml*0.8);
int xo=this.getSize().width/2;
int yo=this.getSize().height/2;
for(int i=0;i<60;i++){
if(i%5==0){
g.drawLine((int)(kedu*0.92*(Math.sin(i*Math.PI/30))+xo),
(int)(yo-(kedu*0.92*(Math.cos(i*Math.PI/30)))),
(int)(xo+(radix/2)*(Math.sin(i*Math.PI/30))),
(int)(yo-(radix/2*(Math.cos(i*Math.PI/30)))));
if(i==0)
g.drawString(""+12,(int)(kedu*0.92*(Math.sin(i*Math.PI/30))+xo),
(int)(yo-(kedu*0.92*(Math.cos(i*Math.PI/30)))));
else
g.drawString(""+i/5,(int)(kedu*0.92*(Math.sin(i*Math.PI/30))+xo),
(int)(yo-(kedu*0.92*(Math.cos(i*Math.PI/30)))));
}
g.drawLine((int)(kedu*(Math.sin(i*Math.PI/30))+xo),
(int)(yo-(kedu*(Math.cos(i*Math.PI/30)))),
(int)(xo+(radix/2)*(Math.sin(i*Math.PI/30))),
(int)(yo-(radix/2*(Math.cos(i*Math.PI/30)))));
}
g.drawOval((this.getSize().width-radix)/2,(this.getSize().height-radix)/2,radix,radix);
Graphics2D gg=(Graphics2D)g;
gg.setColor(Color.MAGENTA);
gg.setStroke(new BasicStroke(4.5f));
gg.drawLine(xo,yo,xo+(int)(hl*Math.sin((cal.get(Calendar.MINUTE)/60.0+cal.get(Calendar.HOUR))*
Math.PI/6)),yo-(int)((hl*Math.cos((cal.get(Calendar.MINUTE)/60.0+cal.get(Calendar.HOUR))*
Math.PI/6))));
gg.setColor(Color.BLUE);
gg.setStroke(new BasicStroke(2.7f));
gg.drawLine(xo,yo,xo+(int)(ml*Math.sin(cal.get(Calendar.MINUTE)*Math.PI/30)),
yo-(int)(ml*Math.cos(cal.get(Calendar.MINUTE)*Math.PI/30)));
gg.setStroke(new BasicStroke(1.0f));
gg.setColor(Color.RED);
gg.drawLine(xo,yo,xo+(int)(sl*Math.sin(cal.get(Calendar.SECOND)*Math.PI/30)),
yo-(int)(sl*Math.cos(cal.get(Calendar.SECOND)*Math.PI/30)));
}
}
public static final String WEEK_SUN = "SUN";
public static final String WEEK_MON = "MON";
public static final String WEEK_TUE = "TUE";
public static final String WEEK_WED = "WED";
public static final String WEEK_THU = "THU";
public static final String WEEK_FRI = "FRI";
public static final String WEEK_SAT = "SAT";
public static final Color background = Color.white;
public static final Color foreground = Color.black;
public static final Color headerBackground = Color.blue;
public static final Color headerForeground = Color.white;
public static final Color selectedBackground = Color.blue;
public static final Color selectedForeground = Color.white;
private JLabel yearsLabel;
private JSpinner yearsSpinner;
private JLabel monthsLabel;
private JComboBox monthsComboBox;
private JTable daysTable;
private AbstractTableModel daysModel;
private Calendar calendar;
public void init() {
this.setLayout(new BorderLayout());
calendar = Calendar.getInstance();
calendar = Calendar.getInstance();
yearsLabel = new JLabel("Year: ");
yearsSpinner = new JSpinner(); //选择年份
yearsSpinner.setEditor(new JSpinner.NumberEditor(yearsSpinner, "0000"));
yearsSpinner.setValue(new Integer(calendar.get(Calendar.YEAR)));
yearsSpinner.addChangeListener(new ChangeListener() {
public void stateChanged(ChangeEvent changeEvent) {
int day = calendar.get(Calendar.DAY_OF_MONTH);
calendar.set(Calendar.DAY_OF_MONTH, 1);
calendar.set(Calendar.YEAR, ((Integer) yearsSpinner.getValue()).intValue());
int maxDay = calendar.getActualMaximum(Calendar.DAY_OF_MONTH);
calendar.set(Calendar.DAY_OF_MONTH, day > maxDay ? maxDay : day);
updateView();
} });
JPanel yearMonthPanel = new JPanel();
this.add(yearMonthPanel, BorderLayout.NORTH); //增加年月的面板
yearMonthPanel.setLayout(new BorderLayout());
yearMonthPanel.add(new JPanel(), BorderLayout.CENTER);
JPanel yearPanel = new JPanel();
yearMonthPanel.add(yearPanel, BorderLayout.WEST);
yearPanel.setLayout(new BorderLayout());
yearPanel.add(yearsLabel, BorderLayout.WEST);
yearPanel.add(yearsSpinner, BorderLayout.CENTER);
monthsLabel = new JLabel("Month: ");
monthsComboBox = new JComboBox();
for (int i = 1; i <= 12; i++) {
monthsComboBox.addItem(new Integer(i));
}
monthsComboBox.setSelectedIndex(calendar.get(Calendar.MONTH));
monthsComboBox.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent actionEvent) {
int day = calendar.get(Calendar.DAY_OF_MONTH);
calendar.set(Calendar.DAY_OF_MONTH, 1);
calendar.set(Calendar.MONTH, monthsComboBox.getSelectedIndex());
int maxDay = calendar.getActualMaximum(Calendar.DAY_OF_MONTH);
calendar.set(Calendar.DAY_OF_MONTH, day > maxDay ? maxDay : day);
updateView();
}
});
JPanel monthPanel = new JPanel();
yearMonthPanel.add(monthPanel, BorderLayout.EAST);
monthPanel.setLayout(new BorderLayout());
monthPanel.add(monthsLabel, BorderLayout.WEST);
monthPanel.add(monthsComboBox, BorderLayout.CENTER); daysModel = new AbstractTableModel() {
public int getRowCount() {
return 7;
}
public int getColumnCount() {
return 7;
}
public Object getValueAt(int row, int column) {
if (row == 0) {
return getHeader(column);
}
row--;
Calendar calendar = (Calendar) MyInnerCalendar.this.calendar.clone();
calendar.set(Calendar.DAY_OF_MONTH, 1);
int dayCount = calendar.getActualMaximum(Calendar.DAY_OF_MONTH);
int moreDayCount = calendar.get(Calendar.DAY_OF_WEEK) - 1;
int index = row * 7 + column;
int dayIndex = index - moreDayCount + 1;
if (index < moreDayCount || dayIndex > dayCount) {
return null;
} else {
return new Integer(dayIndex);
}
}
};
daysTable = new CalendarTable(daysModel, calendar);
daysTable.setCellSelectionEnabled(true);
daysTable.setSelectionMode(ListSelectionModel.SINGLE_SELECTION);
daysTable.setDefaultRenderer(daysTable.getColumnClass(0), new TableCellRenderer() {
public Component getTableCellRendererComponent(JTable table, Object value, boolean isSelected,
boolean hasFocus, int row, int column) {
String text = (value == null) ? "" : value.toString();
JLabel cell = new JLabel(text);
cell.setOpaque(true);
if (row == 0) {
cell.setForeground(headerForeground);
cell.setBackground(headerBackground);
} else {
if (isSelected) {
cell.setForeground(selectedForeground);
cell.setBackground(selectedBackground);
} else {
cell.setForeground(foreground);
cell.setBackground(background);
}
}
return cell;
}
});
updateView();
this.add(daysTable, BorderLayout.CENTER);
}
public static String getHeader(int index) {
switch (index) {
case 0:
return WEEK_SUN;
case 1:
return WEEK_MON;
case 2:
return WEEK_TUE;
case 3:
return WEEK_WED;
case 4:
return WEEK_THU;
case 5:
return WEEK_FRI;
case 6:
return WEEK_SAT;
default:
return null;
}
}
public void updateView() {
daysModel.fireTableDataChanged();
daysTable.setRowSelectionInterval(calendar.get(Calendar.WEEK_OF_MONTH),
calendar.get(Calendar.WEEK_OF_MONTH));
daysTable.setColumnSelectionInterval(calendar.get(Calendar.DAY_OF_WEEK) - 1,
calendar.get(Calendar.DAY_OF_WEEK) - 1);
} public static class CalendarTable extends JTable { private Calendar calendar; public CalendarTable(TableModel model, Calendar calendar) {
super(model);
this.calendar = calendar;
} public void changeSelection(int row, int column, boolean toggle, boolean extend) {
super.changeSelection(row, column, toggle, extend);
if (row == 0) {
return;
}
Object obj = getValueAt(row, column);
if (obj != null) {
calendar.set(Calendar.DAY_OF_MONTH, ((Integer)obj).intValue());
}
} }
} public class MyTool{
public static void main(String[] args) {
JFrame jf=new JFrame();
MyClock mc=new MyClock();
MyInnerCalendar mic=new MyInnerCalendar();
mic.init();
jf.setSize(600,250);
jf.add(mc,BorderLayout.EAST);
jf.add(mic);
jf.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
jf.setVisible(true);
}
}