package first.close;
import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
import javax.swing.event.*;
import javax.swing.Timer;
import java.util.*;public class AutoClose extends JFrame implements ActionListener,ChangeListener{
JPanel[] jp={new JPanel(),new JPanel(),new JPanel()};
JTabbedPane jtp=new JTabbedPane(JTabbedPane.TOP);
JLabel[] jlArray0={new JLabel("时"),new JLabel("分"),new JLabel("秒")};
JLabel[] jlArray1={new JLabel("小时"),new JLabel("分钟"),new JLabel("秒")};
JLabel[] jlArray2={new JLabel("当前时间:"),new JLabel("设置关机时间:")};
JTextField jtf=new JTextField();
Date today=new Date();
SpinnerNumberModel snmHours=new SpinnerNumberModel(today.getHours(),0,23,1);
SpinnerNumberModel snmMinutes=new SpinnerNumberModel(today.getMinutes(),0,59,1);
SpinnerNumberModel snmSeconds=new SpinnerNumberModel(today.getSeconds(),0,59,1);
JSpinner[] js1=new JSpinner[]{
new JSpinner(snmHours),new JSpinner(snmMinutes),new JSpinner(snmSeconds)
};
JSpinner[] js2=new JSpinner[]{
new JSpinner(snmHours),new JSpinner(snmMinutes),new JSpinner(snmSeconds)
};
JLabel jl=new JLabel("设置关机的延迟时间");
JButton jb=new JButton("设置");
PopupMenu popup=new PopupMenu();
MenuItem[] item=new MenuItem[]{
new MenuItem("重新设置"),new MenuItem("取消关机"),new MenuItem("剩余时间"),new MenuItem("退出程序")
};
SystemTray tray;
TrayIcon trayIcon;
long time;
boolean flag=true;
Timer t=new Timer(1000,this);
public AutoClose()throws Exception{
this.initFrame();
this.initCompoment();
this.initSystemTray();
}
public void stateChanged(ChangeEvent ce){
if(jtp.getSelectedIndex()==0)
{
js1[0].setValue(new Integer(today.getHours()));
js1[1].setValue(new Integer(today.getMinutes()));
js1[2].setValue(new Integer(today.getSeconds()));
}
else if(jtp.getSelectedIndex()==1)
{
for(int i=0;i<3;i++)
{
js2[i].setValue(new Integer(0));
}
}
}
public void actionPerformed(ActionEvent ae){
if(ae.getSource()==jb){
int closehour=snmHours.getNumber().intValue();
int closemin=snmMinutes.getNumber().intValue();
int closesec=snmSeconds.getNumber().intValue();
this.setVisible(false);
if(jtp.getSelectedIndex()==0){
Date closetime=new Date(today.getYear(),today.getMonth(),today.getDate(),closehour,closemin,closesec);
time=(closetime.getTime()-new Date().getTime())/1000;

}
else if(jtp.getSelectedIndex()==1)
{
time=closehour*3600+closemin*60+closesec;
}
if(time<0){
trayIcon.displayMessage("错误", "设置时间小于当前时间", TrayIcon.MessageType.ERROR);
}
else
{
t.start();
this.setButtonEnabled(true);
trayIcon.displayMessage("信息", "定时关机已启动", TrayIcon.MessageType.INFO);
}
}
else if(ae.getSource()==t){
try{
if(time<30&&flag)
{
trayIcon.displayMessage("警告", "系统即将关机", TrayIcon.MessageType.WARNING);
flag=false;
}
time=time-1;
if(time==0){
Runtime rt=Runtime.getRuntime();
rt.exec("shutdown -s -t 0");
}
}catch(Exception e){
e.printStackTrace();
}
}
else if(ae.getSource()==item[0]){
t.stop();
flag=true;
this.setButtonEnabled(false);
this.setVisible(true);
}
else if(ae.getSource()==item[1]){
t.stop();
flag=true;
this.setButtonEnabled(false);
trayIcon.displayMessage("信息", "自动关机已经取消", TrayIcon.MessageType.INFO);
}
else if(ae.getSource()==item[2]){
String msg="系统将在"+(time/3600)+"小时"+((time%3600)/60)+"分钟"+(time%60)+"秒后关机";
trayIcon.displayMessage("信息", msg, TrayIcon.MessageType.INFO);
}
else if(ae.getSource()==item[3]){
System.exit(0);
}
else if(ae.getSource()==trayIcon){
this.setVisible(true);
}
else{
today.setTime(today.getTime()+1000);
jtf.setText(today.getYear()+1900+"年"+(today.getMonth()+1)+"月"+today.getDate()+"日"+today.getHours()+"时"+today.getMinutes()+"分"+today.getSeconds()+"秒");
}

}
public static void main(String[] args)throws Exception{
new AutoClose().setVisible(true);
}
public void initFrame(){
this.setTitle("定时关机软件");
this.setResizable(false);
this.setBounds(100,100,300,230);
}
public void initCompoment(){
new Timer(1000,this).start();
for(int i=0;i<jlArray2.length;i++){
jp[i].setLayout(null);
jlArray2[i].setBounds(10,5+(i*70),100,30);
jp[0].add(jlArray2[i]);
}
for(int i=0;i<js1.length;i++){
jlArray0[i].setBounds(40+(i%3)*80,100+(i/3)*30,50,30);
jlArray1[i].setBounds(40+(i%3)*80,50+(i/3)*30,50,30);
jp[0].add(jlArray0[i]);
jp[1].add(jlArray1[i]);
js1[i].setBounds(65+(i%3)*80,100+(i/3)*30,50,25);
js2[i].setBounds(65+(i%3)*80,50+(i/3)*30,50,25);
jp[0].add(js1[i]);
jp[1].add(js2[i]);


}
jtf.setEditable(false);
jtf.setBounds(50,40,200,25);
jp[0].add(jtf);
jl.setBounds(10,10,120,25);
jp[1].add(jl);

jtp.addTab("定点关机", jp[0]);
jtp.addTab("延时关机", jp[1]);   
jb.setBounds(190,170,80,25);
jp[2].add(jb);
jb.addActionListener(this);
jtp.addChangeListener(this);
this.add(jtp,BorderLayout.CENTER);
this.add(jp[2],BorderLayout.SOUTH);
}
public void initSystemTray() throws Exception
{
for(int i=0;i<item.length;i++){
item[i].addActionListener(this);
popup.add(item[i]);
}
this.setButtonEnabled(false);
if(SystemTray.isSupported())
{
tray=SystemTray.getSystemTray();
Image image=Toolkit.getDefaultToolkit().getImage("close.png");
trayIcon=new TrayIcon(image,"提示信息",popup);
trayIcon.setImageAutoSize(true);
tray.add(trayIcon);
trayIcon.addActionListener(this);
trayIcon.setToolTip("定时关机器");
}
}
public void setButtonEnabled(boolean b)
{
item[0].setEnabled(b);
item[1].setEnabled(b);
item[2].setEnabled(b);
jb.setEnabled(!b);
}
}

解决方案 »

  1.   

    不清楚楼主的意思,是要问如何已JAR方式运行还是程序有问题需要帮忙看,如果是打包成JAR运行问题,看以解开个JAR程序看看,里面有个属性文件要配置的,你看看你的配置对不对
      

  2.   

    我的意思是打包后运行不了 
    Manifest-Version: 1.0
    Main-Class:close.AutoClose
    Created-By: 1.6.0-beta2 (Sun Microsystems Inc.)这是我的MANIFEST.MF文件 它还有一个图片文件,可能是放置位置的问题 我怎么改都不成功 (PS:源程序的包我之后给改了)