当我在另一个类中调用它时,我的repaint()不起作用

时间:2014-01-22 10:38:13

标签: java user-interface paintcomponent runnable repaint

repaint()方法在GUI类的开头和结尾都能正常工作,但是当我在另一个类的程序中间再次调用它时,它不起作用。我一直在寻找和尝试近一个星期。我在同一个问题之前问过,但是在我做了他晒太阳之后,我猜其中一个管理员让我发布整个程序my old post。所以这是我的整个计划,希望得到一些帮助。

package TEST_DiningPhilosophersproblem;
import java.awt.Color;
import java.awt.Dimension;
import java.awt.Graphics;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.util.Random;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
import java.util.concurrent.TimeUnit;
import java.util.concurrent.locks.Lock;
import java.util.concurrent.locks.ReentrantLock;

import javax.swing.ImageIcon;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;



public class DiningPhilosopherProblem {
      // Makes the code more readable.
    //===================================================================================================================
    //================================================ChopStick class==================================================================
    //===================================================================================================================
      public static class ChopStick {
        // Make sure only one philosopher can have me at any time.
        Lock up = new ReentrantLock();
        // Who I am.
        private final int id;

        public ChopStick(int id) {
          this.id = id;
        }

        public boolean pickUp(Philosopher who, String where) throws InterruptedException {
          if (up.tryLock(10, TimeUnit.MILLISECONDS)) {
            System.out.println(who + " picked up " + where + " " + this);
            return true;
          }
          return false;
        }

        public void putDown(Philosopher who, String name) {
          up.unlock();
          System.out.println(who + " put down " + name + " " + this);
        }

        @Override
        public String toString() {
          return "Chopstick-" + id;
        }
      }




    public static Graphics g;

      // One philosoper.
    //===================================================================================================================
    //================================================Philosopher class==================================================================
    //===================================================================================================================
      public static class Philosopher implements Runnable {
        // Which one I am.
        private final int id;
        // The chopsticks on either side of me.
        private final ChopStick leftChopStick;
        private final ChopStick rightChopStick;
        // Am I full?
        volatile boolean isTummyFull = false;
        // To randomize eat/Think time
        private Random randomGenerator = new Random();
        // Number of times I was able to eat.
        private int noOfTurnsToEat = 0;
        private GUI y=new GUI();

        private int noOfTurnsToThink = 0;
        private int noOfTurnsToHungry = 0;

        /**
         * **
         *
         * @param id Philosopher number
         *
         * @param leftChopStick
         * @param rightChopStick
         */

        public Philosopher(int id, ChopStick leftChopStick, ChopStick rightChopStick) {
          this.id = id;
          this.leftChopStick = leftChopStick;
          this.rightChopStick = rightChopStick;

        }
    //    GUI GU = new GUI();

        @Override
        public void run() {


          try {
            while (!isTummyFull) {
              // Think for a bit.
             // TDPP.start();
            //  table.start();
              think();
             // GU.Test_exit();

              System.out.println("think()  "+T);
              // Make the mechanism obvious.
              hungry();
              System.out.println("hungry()   "+T);

              if (leftChopStick.pickUp(this, "left")) {
                  //asus++;
                if (rightChopStick.pickUp(this, "right")) {
                  // Eat some.
                  eat();
                  // Finished.
                  rightChopStick.putDown(this, "right");
                }
                // Finished.
                leftChopStick.putDown(this, "left");
              }
            }
           // TDPP.exit();
          } catch (Exception e) {
            // Catch the exception outside the loop.
            e.printStackTrace();
          }
        }

        private void think() throws InterruptedException {

          System.out.println(this + " is thinking");
        //  System.out.println(this);
          Philosopher s= this;
          String g= s.toString();
          // Thread.sleep(randomGenerator.nextInt(1000));
          //!!!!!
          T=0;
          //GU.repaint();
          noOfTurnsToThink++;
          if(g.equals("Philosopher-0") ){
          asus= asus + noOfTurnsToThink;
          }
          Thread.sleep(randomGenerator.nextInt(10));
          y.rrepaint();
        }

        //hungry
        private void hungry() throws InterruptedException {
            T=1;
            //GU.paintComponent(g);
            //GU.Test_exit();
              System.out.println(this + " is hungry");
              // Thread.sleep(randomGenerator.nextInt(1000));
              //!!!!!!
              noOfTurnsToHungry++;
              Thread.sleep(randomGenerator.nextInt(10));
            y.rrepaint();
            }
        //end

        private void eat() throws InterruptedException {
          System.out.println(this + " is eating");
          noOfTurnsToEat++;
          Thread.sleep(randomGenerator.nextInt(10));
        }

        // Accessors at the end.
        public int getNoOfTurnsToEat() {
          return noOfTurnsToEat;
        }
        //!!!!!!!!
        public int getNoOfTurnsToThink() {
              return noOfTurnsToThink;
            }

        public int getNoOfTurnsToHungry() {
              return noOfTurnsToHungry;
            }
        //!!!!!!!!

        @Override
        public String toString() {
          return "Philosopher-" + id;
        }
      }

    //===================================================================================================================
    //================================================GUI class==================================================================
    //===================================================================================================================

      public static class GUI extends JPanel {
            private final Dimension PANEL_SIZE = new Dimension(500,500);
            private final Color BACKGROUND_COLOR = Color.white;
            private JPanel colorPanel = new JPanel();
            private JLabel label = new JLabel();

            ImageIcon redDevil = new ImageIcon("C:\\Users\\LNU\\Documents\\Java_2013\\1DV012OperatingSystems\\src\\DiningPhilosophersproblem\\pic\\red_Devil.gif");
            ImageIcon green_devil = new ImageIcon("C:\\Users\\LNU\\Documents\\Java_2013\\1DV012OperatingSystems\\src\\DiningPhilosophersproblem\\pic\\green_devil.gif");


            public GUI() {
                setPreferredSize(PANEL_SIZE);
                setBackground(BACKGROUND_COLOR);

                /* Color panel */

                /* Create the button panel */
                JPanel buttonSubPanel = createButtonPanel();
                add(buttonSubPanel);

            }



            @Override
            public void paintComponent(Graphics g){
                super.paintComponent(g);
            //  g=pp;
                if(T == 0)
                    redDevil.paintIcon(this, g, 0, 0);
                if(T== 1)
                    green_devil.paintIcon(this, g, 220, 220);
                //System.out.println("!!  "+T);
                //repaint();
                rrepaint();
            }

            private JPanel createButtonPanel() {
                int panelWidth = PANEL_SIZE.width;
                int panelHeight = PANEL_SIZE.height/10;
                //Dimension  panelSize = new Dimension(panelWidth,panelHeight);
                JPanel buttonSubPanel = new JPanel();
                //buttonSubPanel.setPreferredSize(panelSize);

                //buttonSubPanel.setBackground(Color.blue);

                /* Create and add the button */
                JButton ButtonStart = new JButton("START");
                buttonSubPanel.add(ButtonStart);
                JButton ButtonExit = new JButton("EXIT");
                buttonSubPanel.add(ButtonExit);

                /* Add an event handler */
                //ButtonStart.addActionListener(new ButtonListener());
                ButtonListener listener = new ButtonListener(ButtonStart,ButtonExit);
                ButtonStart.addActionListener(listener);
                ButtonExit.addActionListener(listener);

                return buttonSubPanel;
            }

            public void rrepaint(){
                repaint();
            }
            /*
             * Event handler for the button
             */
            private class ButtonListener implements ActionListener {
                //private final Random random = new Random();
        private JButton Start, Exit;

                public ButtonListener(JButton S, JButton E) {
                    Start = S;
                    Exit = E;
                }

                public void actionPerformed(ActionEvent event) {
                    //TheDiningPhilosophersProblem TDPP = new TheDiningPhilosophersProblem();
                    if (event.getSource() == Start) {




                         // public static void main(String args[]) {
                          ExecutorService executorService = null;
                          Philosopher[] philosophers = null;

                           int outnow = 0;

                         // public void start(){



                            try {

                              philosophers = new Philosopher[NO_OF_PHILOSOPHER];

                              //As many forks as Philosophers
                              ChopStick[] chopSticks = new ChopStick[NO_OF_PHILOSOPHER];
                              // Cannot do this as it will fill the whole array with the SAME chopstick.
                              //Arrays.fill(chopSticks, new ReentrantLock());

                              for (int i = 0; i < NO_OF_PHILOSOPHER; i++) {
                                chopSticks[i] = new ChopStick(i);
                              }

                              executorService = Executors.newFixedThreadPool(NO_OF_PHILOSOPHER);

                              for (int i = 0; i < NO_OF_PHILOSOPHER; i++) {
                                philosophers[i] = new Philosopher(i, chopSticks[i], chopSticks[(i + 1) % NO_OF_PHILOSOPHER]);
                                executorService.execute(philosophers[i]);
                              }
                              // Main thread sleeps till time of simulation

                              try {
                                  System.out.println("====================================SIMULATION_MILLIS==========================================================");

                                  Thread.sleep(SIMULATION_MILLIS);
                                 // Thread.sleep((Long) null);
                            } catch (InterruptedException e) {
                                // TODO Auto-generated catch block
                                e.printStackTrace();
                            }
                              // Stop all philosophers.
                              for (Philosopher philosopher : philosophers) {
                                philosopher.isTummyFull = true;
                              }
                              System.out.println("====================================Stop all philosophers==========================================================");

                            }//end try

                            finally {

                              // Close everything down.
                              executorService.shutdown();

                              // Wait for all thread to finish
                              while (!executorService.isTerminated()) {
                                  //Thread.sleep(1000);
                                try {
                                    Thread.sleep(10);
                                } catch (InterruptedException e) {
                                    // TODO Auto-generated catch block
                                    e.printStackTrace();
                                }
                              }
                              System.out.println("asus = "+asus);
                              for (Philosopher philosopher : philosophers) {
                                  System.out.println(philosopher);
                                  String PH = philosopher.toString();
                                  if(PH.equals("Philosopher-0"))
                              System.out.println(philosopher + " avreg "+(double) asus/philosopher.getNoOfTurnsToThink());
                              }
                              // Time for check
                              for (Philosopher philosopher : philosophers) {
                                System.out.println(philosopher + " => No of Turns to Eat =" + philosopher.getNoOfTurnsToEat());
                              }
                              //!!!!!!!!
                              for (Philosopher philosopher : philosophers) {
                                    System.out.println(philosopher + " => No of Turns to think =" + philosopher.getNoOfTurnsToThink());
                                  }

                              for (Philosopher philosopher : philosophers) {
                                    System.out.println(philosopher + " => No of Turns to Hungry =" + philosopher.getNoOfTurnsToHungry());
                                  }
                              //!!!!!!!!
                            }
                          }


                    //}
                     if (event.getSource() == Exit) {   // Clear-button

                         System.exit(0);
                        //TDPP.exit();
                    }
                }
            }
        }




    //===================================================================================================================
    //================================================Main class==================================================================
    //===================================================================================================================


      // How many to test with.
      private static final int NO_OF_PHILOSOPHER = 5;
      //private static final int SIMULATION_MILLIS = 1000 * 60 * 8;
    //  private static final int SIMULATION_MILLIS = 10 * 10;
      private static int asus=0;
      private static int T=0;
      private static Random random = new Random();
    private  final static int SIMULATION_MILLIS =  random.nextInt(100)*10;
      public static void main(String args[]) throws InterruptedException {


          JFrame frame = new JFrame("Random Colours");
            frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
            frame.setLocation(100,100);

            GUI panel= new GUI();

            frame.getContentPane().add(panel);
            //frame.getContentPane().validate();
            //frame.getContentPane().repaint();
            frame.pack();
            frame.setVisible(true);


      }
    }

1 个答案:

答案 0 :(得分:-1)

如果你要调用某个组件的函数repaint(),你需要为这个组件做一个getter方法,如下所示:

View v= new View();
v.getMyPanel().repaint();       //returns the panel and repaint it
v.getMyPanel().revalidate();    //returns the panel and revalidates it