1

我需要使用这些嵌套类,因为嵌套类可以使用嵌套类中的变量。如何将这些类移动到 something.java 以简化我的代码并且该类仍然具有 gui 类的控制权,例如 Jlabel?

这是显示重要部分的清洁版本

public class GUI {

        public GUI(){

            VitaminDEngineStarter vdes = new VitaminDEngineStarter();
            Registry registry = null;
            try {
                registry = LocateRegistry.getRegistry();
            } catch (RemoteException e1) {
                // TODO Auto-generated catch block
                e1.printStackTrace();
            }

            try {
                vd = (VitaminD)registry.lookup(VitaminD.SERVICE_NAME);
            } catch(Exception e) {
                e.printStackTrace();
            }



            SMS a = new SMS(5);
            try {
                arduino.connect("COM3");
            } catch (Exception e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }
            System.out.println("connecting:"+ a.connect());
            System.out.println("connected? :" + a.checkConnect());
            System.out.println("signal: "+a.checkSignal());
            System.out.println("deliver report :" + a.DeliveryReportOn());
            SMS.Read read = a.new Read(arduino);


        }

        class ShowSense implements Runnable {


            @Override
            public void run() {
                String[] temp;
                String light = "";
                String temperature = "";
                String hum = "";
                String sens = "";
                boolean humanact = false;

                // TODO Auto-generated method stub
                while (true){
                    try {
                        humanact = vd.gethumanActivity();
                    } catch (RemoteException e) {
                        // TODO Auto-generated catch block
                        e.printStackTrace();
                    }
                    sens = arduino.getSensor();
                    temp = sens.split(",");
                    light = temp[1];
                    temperature = temp[0];
                    hum = temp[2];

                    LightIntensity.setText(light);
                    Temperature.setText(temperature);
                    humidity.setText(hum);


                    if (humanact){
                        personActivity.setText("in place");
                    }
                    else{
                        personActivity.setText("absent");
                    }

                }
            }

        }

        private JPanel getInputs() {
            if (Inputs == null) {
                personActivity = new JLabel();
                personActivity.setBounds(new Rectangle(114, 137, 77, 27));
                personActivity.setText("");
                personActivityLabel = new JLabel();
                personActivityLabel.setBounds(new Rectangle(7, 137, 99, 25));
                personActivityLabel.setText("Person Activity:");
                humidity = new JLabel();
                humidity.setBounds(new Rectangle(106, 91, 84, 27));
                humidity.setText("");
                humidityLabel = new JLabel();
                humidityLabel.setBounds(new Rectangle(6, 92, 88, 26));
                humidityLabel.setText("Humidity:");
                Temperature = new JLabel();
                Temperature.setBounds(new Rectangle(101, 50, 89, 30));
                Temperature.setText("");
                TemperatureLabel = new JLabel();
                TemperatureLabel.setBounds(new Rectangle(4, 50, 91, 30));
                TemperatureLabel.setText("Temperature:");
                LightIntensity = new JLabel();
                LightIntensity.setBounds(new Rectangle(110, 6, 84, 34));
                lightLabel = new JLabel();
                lightLabel.setBounds(new Rectangle(5, 5, 97, 34));
                lightLabel.setText("Light Intensity:");
                Inputs = new JPanel();
                Inputs.setLayout(null);
                Inputs.setBounds(new Rectangle(14, 63, 200, 183));
                Inputs.add(lightLabel, null);
                Inputs.add(LightIntensity, null);
                Inputs.add(TemperatureLabel, null);
                Inputs.add(Temperature, null);
                Inputs.add(humidityLabel, null);
                Inputs.add(humidity, null);
                Inputs.add(personActivityLabel, null);
                Inputs.add(personActivity, null);
                th.start();
            }
            return Inputs;
        }

        class autopilotthread implements Runnable{

            /** The temp. */
            private String[] temp;

            /** The lightintensty. */
            private double lightintensty ;

            /** The temperature. */
            private double temperature ;

            /** The hum. */
            private double hum ;

            /** The sens. */
            private String sens = null;

            /** The humanact. */
            private double humanact;

            /** The result. */
            private boolean [] result = {false , false};

            /** The fan. */
            private boolean fan =false;

            /** The light. */
            private boolean light = false;

            /** The pstop. */
            boolean pstop = false;

            /* (non-Javadoc)
             * @see java.lang.Runnable#run()
             */
            @Override
            public void run() {
                System.out.println("thread start!");
                while(true){
                    System.out.println("thread loop!");
                        try {
                            if(vd.gethumanActivity()){
                                humanact = 250;
                            }else{
                                humanact = 0;
                            }
                        } catch (RemoteException e) {
                            // TODO Auto-generated catch block
                            e.printStackTrace();
                        }
                        sens = arduino.getSensor();
                        temp = sens.split(",");
                        lightintensty = Double.parseDouble(temp[1]);
                        temperature = Double.parseDouble(temp[0]);
                        hum = Double.parseDouble(temp[2]);
                        double [] out ={humanact ,lightintensty , hum, Time.now(),temperature };
                        System.out.println(""+out[0]+" "+out[1]+" "+out[2]+" "+out[3]+" "+out[4]);
                        result = Matlab.output(out);
                        light = result[1];
                        fan = result[0];
                        System.out.println("light:" + light);
                        System.out.println("fan:" + fan );
                        if(light){
                            try {X10.lightsOn();} 
                            catch (IOException e) {e.printStackTrace();}

                        }else{
                            try {X10.lightsOff();} 
                            catch (IOException e) {e.printStackTrace();}

                        }

                        if(fan){
                            try {X10.fanOn();} 
                            catch (IOException e) {e.printStackTrace();}

                        }else{
                            try {X10.fanOff();} 
                            catch (IOException e) {e.printStackTrace();}

                        }



                    try {TimeUnit.SECONDS.sleep(10);} 
                    catch (InterruptedException e) {e.printStackTrace();}

                    if (pstop){
                        break;
                    }
                }
                System.out.println("thread stop!");

            }

        }

        class Pilotmouse implements MouseListener{

            /** The p thread. */
            autopilotthread pThread = null;

            /** The pt. */
            Thread pt = null; 

            /**
             * Instantiates a new pilotmouse.
             */
            Pilotmouse(){

            }

            /* (non-Javadoc)
             * @see java.awt.event.MouseListener#mouseClicked(java.awt.event.MouseEvent)
             */
            @Override
            public void mouseClicked(MouseEvent arg0) {
                // TODO Auto-generated method stub

            }

            /* (non-Javadoc)
             * @see java.awt.event.MouseListener#mouseEntered(java.awt.event.MouseEvent)
             */
            @Override
            public void mouseEntered(MouseEvent arg0) {
                // TODO Auto-generated method stub

            }

            /* (non-Javadoc)
             * @see java.awt.event.MouseListener#mouseExited(java.awt.event.MouseEvent)
             */
            @Override
            public void mouseExited(MouseEvent arg0) {
                // TODO Auto-generated method stub

            }

            /* (non-Javadoc)
             * @see java.awt.event.MouseListener#mousePressed(java.awt.event.MouseEvent)
             */
            @Override
            public void mousePressed(MouseEvent arg0) {
                // TODO Auto-generated method stub

            }

            /* (non-Javadoc)
             * @see java.awt.event.MouseListener#mouseReleased(java.awt.event.MouseEvent)
             */
            @Override
            public void mouseReleased(java.awt.event.MouseEvent e) {
                if ((autopilotlable.getText().equalsIgnoreCase("off"))){
                    autopilotlable.setText("on");
                    pThread = new autopilotthread();
                    pt = new Thread(pThread); 
                    pt.start();

                } else if ((autopilotlable.getText().equalsIgnoreCase("on"))){
                    autopilotlable.setText("off");
                    pThread.pstop = true;
                }
            }

        }


        private JButton getAutopilot() {


            if (autopilot == null) {
                autopilot = new JButton();
                autopilot.setBounds(new Rectangle(18, 14, 112, 28));
                autopilot.setText("Auto Pilot");

                autopilot.addMouseListener(new Pilotmouse());
            }
            return autopilot;
        }


        public static void main(String[] args) {
            SwingUtilities.invokeLater(new Runnable() {
                public void run() {
                    GUI application = new GUI();
                    application.getJFrame().setVisible(true);
                }
            });

        }

    }
4

2 回答 2

2

正如 Jochen 提到的,您可以使用 Eclipse Refactoring Tools。但这并不能解决设计问题。

一般来说:

  • GUI 知道大约 14 个类并充当大中介……是否可以将逻辑分组到一些更高级别的类中并让 GUI 使用它们?
  • 您的代码将对象构造与逻辑混合在一起。尝试将这些动作移动到不同的地方
  • 不要在构造函数中启动线程!
  • 修改逻辑语句的用法。例如。: while(true){ ... if (pstop){ break; }}
  • X10 是第 3 方课程还是您自己的课程?如果它是您的,请尝试删除全局状态(例如,使用 X10 的单个实例和实例变量进行状态更改。不是静态的)

最重要的建议:请先尝试使用(例如)junit 和 mockito 为这个功能编写单元测试,好的设计自然会出现。相信我!

编辑:

好好谈谈 JMM

关于并发的好书

编辑:

清洁代码会谈 - “全球状态和单身人士”

于 2011-01-19T05:36:34.620 回答
1

您可以使用 Eclipse 的 Refactor->Move Type to New File... 将一些内部类移动到它们自己的文件中。

于 2011-01-19T04:59:17.890 回答