将JTextField扩展为InputStream并从Button执行操作

时间:2013-07-05 10:19:23

标签: java swing

我的代码存在一些问题,如果你愿意,我需要一些帮助(并解释一下,以便我将来可以理解:)),这是我的代码,我需要的是我的JButton执行关闭命令和关闭命令将从我在JTextfield中输入的秒数延迟。 所以到目前为止我的代码是:

import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;

import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JTextField;


public class Shutdown extends JFrame{
    InputStream text1;
    JButton start;
    String shutdownCmd;

        public Shutdown() {

        this.setTitle("Shutdown When you want");
        setSize(300, 150);
        setResizable(false);
        setLocation(370, 150);
        setLayout(null);

        JLabel desc1 = new JLabel("Time until shutdown : ");
        desc1.setBounds(95, 25, 125, 25);
        add(desc1);

        JTextField text1 = new JTextField();
        text1.setBounds(95, 45, 120, 25);
        text1.setForeground(Color.BLACK);
        text1.setToolTipText("Introdu textu aici");
        add(text1);

        JButton start = new JButton("Start Shudown");
        start.setBounds(95, 75, 120, 25);
        add(start);



        ActionListener eventstart = new ActionListener() {
            @Override
            public void actionPerformed(ActionEvent arg0) {
                // TODO auto- generated method
                String actionstart = arg0.getActionCommand();
                if(actionstart.equals("Start Shudown")){
                    try {
                        ShutdownCmd();
                    } catch (IOException e) {
                        // TODO Auto-generated catch block
                        e.printStackTrace();
                    }
                }

                }

        }; 
        start.addActionListener(eventstart);
}       
        public void ShutdownCmd() throws IOException{
     Runtime runtime = Runtime.getRuntime();
     BufferedReader br=new BufferedReader(new InputStreamReader(text1));
     long a=Long.parseLong(br.readLine());
     Process proc = runtime.exec("shutdown -s -t "+a);
     System.exit(0);
}
}

谢谢你或者先进的帮助! :d

2 个答案:

答案 0 :(得分:1)

很多事情都在这里跳出来,但是......

text1改为JTextField而不是InputStream ......

//InputStream text1;
private JTextField text1;

这将允许您从班级中的任何位置访问该字段及其值。

确保在创建文本字段时没有隐藏变量...

//JTextField text1 = new JTextField();
text1 = new JTextField(10);

使用ProcessBuilder代替Runtime.getRuntime()。这将使您的生活更容易处理参数更好

ProcessBuilder pb = new ProcessBuilder("shutdown", "-s", "-t", text1.getText());
pb.redirectError();
Process p = pb.start();

动作命令始终为null,因为您从未设置过,因此以下内容会导致您NullPointerException

String actionstart = arg0.getActionCommand();
if(actionstart.equals("Start Shudown")){

创建按钮时,需要设置动作命令...

JButton start = new JButton("Start Shudown");
start.setActionCommand("Start Shudown");

其他建议......

  • 使用适当的布局管理器。即使在同一个操作系统中,您的应用程序也可能需要处理不同的屏幕分辨率,DPI,字体等......
  • 避免直接从JFrame等顶级容器扩展。相反,将您的应用程序基于JPanel之类的东西。它使您的应用程序灵活且可重复使用。

答案 1 :(得分:0)

您需要做的就是将JTextField作为一个字段:

import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;

import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JTextField;


public class Shutdown extends JFrame{
    JTextField text1;
    JButton start;
    String shutdownCmd;

        public Shutdown() {

        this.setTitle("Shutdown When you want");
        setSize(300, 150);
        setResizable(false);
        setLocation(370, 150);
        setLayout(null);

        JLabel desc1 = new JLabel("Time until shutdown : ");
        desc1.setBounds(95, 25, 125, 25);
        add(desc1);

        text1 = new JTextField();
        text1.setBounds(95, 45, 120, 25);
        text1.setForeground(Color.BLACK);
        text1.setToolTipText("Introdu textu aici");
        add(text1);

        JButton start = new JButton("Start Shudown");
        start.setBounds(95, 75, 120, 25);
        add(start);



        ActionListener eventstart = new ActionListener() {
            @Override
            public void actionPerformed(ActionEvent arg0) {
                // TODO auto- generated method
                String actionstart = arg0.getActionCommand();
                if(actionstart.equals("Start Shudown")){
                    try {
                        ShutdownCmd();
                    } catch (IOException e) {
                        // TODO Auto-generated catch block
                        e.printStackTrace();
                    }
                }

                }

        }; 
        start.addActionListener(eventstart);
}       
        public void ShutdownCmd() throws IOException{
            Runtime runtime = Runtime.getRuntime();

            long a=Long.parseLong(text1.getText());
            Process proc = runtime.exec("shutdown -s -t "+a);
            System.exit(0);
        }
}

如果它是全局的,您可以在任何此对象的函数中使用它,这样您就可以从JFrame对象中的任何位置获取textField中的Text。

我希望这就是你想要做的。如果说得不够好,请告诉我。 ;)