Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/329.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java Swing类中嵌套的类太多_Java_Swing_Nested Class - Fatal编程技术网

Java Swing类中嵌套的类太多

Java Swing类中嵌套的类太多,java,swing,nested-class,Java,Swing,Nested Class,我需要使用这些嵌套类,因为嵌套类可以使用嵌套类中的变量。如何将这些类移动到something.java以简化代码,并且该类仍然可以控制gui类,例如Jlabel 这是显示重要部件的清洁版本 public class GUI { public GUI(){ VitaminDEngineStarter vdes = new VitaminDEngineStarter(); Registry registry = null;

我需要使用这些嵌套类,因为嵌套类可以使用嵌套类中的变量。如何将这些类移动到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);
                }
            });

        }

    }

您可以使用Eclipse的重构->将类型移动到新文件。。。将一些内部类移动到它们自己的文件中。

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

一般来说:

  • GUI知道大约14个类和行为 作为大调解人。。。有可能吗 把逻辑组织到更高的层次 类并让GUI使用它们
  • 您的代码混合了对象构造 有逻辑。尝试移动这些动作 去不同的地方
  • 不要在里面挑起一根线 建造师
  • 修改逻辑规则的用法 声明。例如: while(true){…如果 (pstop){break;}}
  • X10是第三方级还是您自己的? 如果它是你的,请尝试删除全局 状态(例如使用X10的单个实例 和状态的实例变量 改变(不是静态的)
最重要的建议是:请尝试先使用junit和mockito为这个功能编写单元测试,好的设计自然会出现。相信我

编辑:

编辑:


谢谢petro我能知道为什么不在构造函数中启动线程吗?我应该从主要方面开始?但是在GUI关闭后线程应该停止…首先我很抱歉。您的代码中没有在构造函数内启动线程。因为我们已经讨论过这个主题,所以这里有一篇来自Brian Goetz的文章:您好,我的程序确实存在清单1中所述的问题。在Brian Goetz的文章中,但我该如何解决它?使用volatile?或者使用synchronized?如果清单1中的“a=1;”在thread.start之前,则不会发生争用情况,因为thread.start的“之前发生”保证。您的解决方案不存在此问题(如果我错了,请更正我)。此外,由于您在读/写状态时使用了“synchronized”,因此不存在可见性危险(不过,在这种情况下,我会使用读/写锁,而不是“synchronized”)。我已经用参考资料更新了答案。