Avatar billede dynrambo Nybegynder
17. maj 2007 - 14:10 Der er 5 kommentarer og
1 løsning

Problem med at opdatere fejlmeddelelse i GUI

Hej Eksperter,

Jeg laver noget projektværk med nogle kammerater på DTU, og nu har vi efterhånden set os helt blinde på det her JAVA. Vi har koblet JAVA sammen med en PLC gennem OPC-server, og så skal vi skifte mellem nogle Cd'er via den her GUI. Men der er et problem: Vi kan ikke få JAVA til at vise fejlmeddelelsen "CD 1 er allerede valgt" alt afhængigt af hvad error er sat til. Men "Vælg en CD" vises bare hele tiden...kan I gennemskue den?

Vores program er delt op i 6 filer, men den hvor det går galt er den vist nedenfor:

import dk.opi.io.*;
import dk.opi.io.opc.opcclient.*;
import javax.swing.*;
import java.awt.event.*;
import java.awt.*;
public class GUIJukebox extends JPanel
{
private JButton CD1Button, CD2Button, CD3Button;
private ImageIcon icon1, icon2, icon3;
private HitachiPLCKran h;
private Fejlindikator fejl;
private Timer t, tim1, tim2, tim3;
public JButton eve;
private int brugt = 0;
public String fejl0, fejl1, fejl2, fejl3;
public boolean f1, f2, f3;
private int h1 = 156;
private int l1 = 134;
private int h2 = 240;
private int l2 = 218;
private int h3 = 322;
private int l3 = 300;
public int error;

  public GUIJukebox()
  {
 
  t = new Timer(500,new resetkontakt());    //timer som bruges til at sætte inputtet i 500ms
  tim1 = new Timer(500, new kontaktet());
  tim2 = new Timer(500, new kontaktto());
  tim3 = new Timer(500, new kontakttre());       
  h = HitachiPLCKran.getInstance();
 
  icon1 = new ImageIcon("CD1.jpg");  //Opretter Knapper til cd'er
  CD1Button = new JButton(icon1);
  CD1Button.setMinimumSize(new Dimension(300, 300));
  CD1Button.setPreferredSize(new Dimension(300, 300));
  CD1Button.setMaximumSize(new Dimension(300, 300));
  CD1Button.addActionListener (new OnListener());
 
  icon2 = new ImageIcon("CD2.jpg");
  CD2Button = new JButton(icon2);
  CD2Button.setMinimumSize(new Dimension(300, 300));
  CD2Button.setPreferredSize(new Dimension(300, 300));
  CD2Button.setMaximumSize(new Dimension(300, 300));
  CD2Button.addActionListener (new OnListener());
 
  icon3 = new ImageIcon("CD3.jpg");
  CD3Button = new JButton(icon3);
  CD3Button.setMinimumSize(new Dimension(300, 300));
  CD3Button.setPreferredSize(new Dimension(300, 300));
  CD3Button.setMaximumSize(new Dimension(300, 300));
  CD3Button.addActionListener (new OnListener());
 
         
  setLayout(new BoxLayout(this,BoxLayout.PAGE_AXIS));
  add(CD1Button);
  add(CD2Button);
  add(CD3Button);
 
   
 
  setBackground (Color.white);
 
 
  repaint(); 
  }//GUIJukebox konstruktør
 
public class OnListener implements ActionListener
  {
 
  public void actionPerformed (ActionEvent event)
  {
  eve = (JButton) event.getSource();
  fejl = new Fejlindikator();
  if (event.getSource() == CD1Button)
    {                  //Hvis der trykkes på CD1 Startes dennes program
    try
      {
      if(brugt == 0)
      {
    h.setIntItem(h.getIOGroup().getItem("CDværdi1"), h1);
    h.setIntItem(h.getIOGroup().getItem("CDværdi2"), l1); 
    h.setBoolItem(h.getIOGroup().getItem("GetCD"), true);
    brugt = 1;
    fejl0 = "Vælg en CD";
      }
      else if(brugt == 2 || brugt == 3)
      {
      h.setBoolItem(h.getIOGroup().getItem("TakeCD"), true);
      tim1.start();
      }
      else if(brugt == 1)
      {
      //fejl1 = "CD 1 er allerede valgt";
      error = 1;
      //f1 = true;
      //fejl.repaint();
      }
      }
    catch (RbxIOException e) { e.printStackTrace(); }
    }
  else if (event.getSource() == CD2Button)
    {                  //Hvis der trykkes på CD2 Startes dennes program
    try
      {
      if(brugt == 0)
      {
    h.setIntItem(h.getIOGroup().getItem("CDværdi1"), h2);
    h.setIntItem(h.getIOGroup().getItem("CDværdi2"), l2); 
    h.setBoolItem(h.getIOGroup().getItem("GetCD"), true);
    brugt = 2;
   
      }
      else if(brugt == 1 || brugt == 3)
      {
      h.setBoolItem(h.getIOGroup().getItem("TakeCD"), true);
      tim2.start();
      }
      else if (brugt == 2)
      {
      error = 2;
      //fejl2 = "CD 2 er allerede valgt";
      //f2 = true;
      //fejl.repaint();
      }
      }
    catch (RbxIOException e) { e.printStackTrace(); }
    }
  else if (event.getSource() == CD3Button)
    {                  //Hvis der trykkes på CD3 Startes dennes program
    try
      {
      if(brugt == 0)
      {
    h.setIntItem(h.getIOGroup().getItem("CDværdi1"), h3);
    h.setIntItem(h.getIOGroup().getItem("CDværdi2"), l3); 
    h.setBoolItem(h.getIOGroup().getItem("GetCD"), true);
    brugt = 3;
    fejl0 = "Vælg en CD";
      }
      else if(brugt == 1 || brugt == 2)
      {
      h.setBoolItem(h.getIOGroup().getItem("TakeCD"), true);
      tim3.start();
              }
      else if(brugt == 3)
      {
      //fejl3 = "CD 3 er allerede valgt";
      error = 3;
      //f3 = true;
      //System.out.println("f3");
      //fejl.repaint();
      }
      }
    catch (RbxIOException e) { e.printStackTrace(); }
    }
    t.start(); 
  }//actionperformed
 
  }//OnListener
 
  private class resetkontakt implements ActionListener  //her resetes knapperne efter 500ms hvis de er blevet brugt
  {
  public void actionPerformed(ActionEvent ev)
    {
    if(t.isRunning())
      {
      try
      {
        h.setBoolItem(h.getIOGroup().getItem("GetCD"), false);
        h.setBoolItem(h.getIOGroup().getItem("TakeCD"), false);
      }
      catch (RbxIOException e) { e.printStackTrace(); }
      }
    }
  }
   
   
   
  private class kontaktet implements ActionListener  //her resetes knapperne efter 500ms hvis de er blevet brugt
  {
  public void actionPerformed(ActionEvent ev1)
    {
    t.start();
    try
    {
      if(Boolean.valueOf(h.getItemValue(h.getIOGroup().getItem("CDHentet")).toString()) == false )
      {
        h.setIntItem(h.getIOGroup().getItem("CDværdi1"), h1);
        h.setIntItem(h.getIOGroup().getItem("CDværdi2"), l1); 
        h.setBoolItem(h.getIOGroup().getItem("GetCD"), true);
        brugt = 1;
        tim1.stop();
      }
    }
    catch (RbxIOException e) { e.printStackTrace(); }
    }
   
  }//kontaktet
   
   
   
  private class kontaktto implements ActionListener  //her resetes knapperne efter 500ms hvis de er blevet brugt
  {
    public void actionPerformed(ActionEvent ev2)
    {
    t.start();
    try
    {
      if(Boolean.valueOf(h.getItemValue(h.getIOGroup().getItem("CDHentet")).toString()) == false)
      {
      h.setIntItem(h.getIOGroup().getItem("CDværdi1"), h2);
      h.setIntItem(h.getIOGroup().getItem("CDværdi2"), l2); 
      h.setBoolItem(h.getIOGroup().getItem("GetCD"), true);
      brugt = 2;
      tim2.stop();
      }
    }
    catch (RbxIOException e) { e.printStackTrace(); }
    }
  }//kontaktto
 
 
  private class kontakttre implements ActionListener  //her resetes knapperne efter 500ms hvis de er blevet brugt
  {
  public void actionPerformed(ActionEvent ev3)
  {
    t.start();
    try
    {
    if(Boolean.valueOf(h.getItemValue(h.getIOGroup().getItem("CDHentet")).toString())== false)
      {
      h.setIntItem(h.getIOGroup().getItem("CDværdi1"), h3);
      h.setIntItem(h.getIOGroup().getItem("CDværdi2"), l3); 
      h.setBoolItem(h.getIOGroup().getItem("GetCD"), true);
      brugt = 3;
      tim3.stop();
      }
    }
    catch (RbxIOException e) { e.printStackTrace(); }
  }
  }//kontakttre
 
 
  /*public void setFejl(String f)
  {
  this.error = f;
  }*/
 
  /*public String hentFejl()
  {
    String fejltext;
   
    if(f1 == true)
    {
    fejltext = "CD 1 er allerede valgt";
    }
    if(f2 == true)
    {
    fejltext = "CD 2 er allerede valgt";
    }
    if(f3 == true)
    {
    fejltext = "CD 3 er allerede valgt";
    }
    else
    {
    fejltext = "Vælg en CD";
    }
   
    return fejltext;
  }//hentFejl*/
  public String hentFejl()
  {
    String fejltext;
   
    if(error == 1)
    {
    fejltext = "CD 1 er allerede valgt";
    }
    else if(error == 2)
    {
    fejltext = "CD 2 er allerede valgt";
    }
    else if(error == 3)
    {
    fejltext = "CD 3 er allerede valgt";
    }
    else
    {
    fejltext = "Vælg en CD";
    }
   
    return fejltext;
  }//hentFejl

 

}//class
Avatar billede _carsten Nybegynder
17. maj 2007 - 20:52 #1
I sætter jeres instance variabel 'error' til forskellig værdi, hvilket jo er OK, MEN i kalder aldrig jeres metode hentFejl(), derimod sætter i variablen fejl0 = "Vælg en CD" og den ændrer i aldrig, men det er sandsynligvis den værdi i udskriver.

Så løsningen må være:  fejl0 = hentFejl();
Avatar billede dynrambo Nybegynder
23. maj 2007 - 13:45 #2
Tak for hjælpen, men vi har fundet ud af det. Vi skrev koden om, og så vi slet ikke skulle bruge fejl, men tak for budet.
Avatar billede _carsten Nybegynder
23. maj 2007 - 22:17 #3
Ok - så plejer man at poste løsningen her, så andre kan få gavn det!
Avatar billede dynrambo Nybegynder
23. maj 2007 - 23:52 #4
Nå ok, er helt ny på det her, så jeg kender ikke "arbejdsgangen" :-)
Koden endte med at se således ud:

        public GUIJukebox()
        {
       
        h = HitachiPLCKran.getInstance();                        //Instance af HitachiPLCKran objektet
        t = new Timer(1000,new resetkontakt());                    //timere som bruges til at sætte inputtet i 1000ms
        tim1 = new Timer(1000, new kontaktet());               
        tim2 = new Timer(1000, new kontaktto());
        tim3 = new Timer(1000, new kontakttre());                               

       
       
        icon1 = new ImageIcon("CD1.jpg");                        //Opretter ikoner til knapperne
        CD1Button = new JButton(icon1);                            //Opretter Knapper til cd'er
        CD1Button.setPreferredSize(new Dimension(300, 300));
        CD1Button.addActionListener (new OnListener());
       
        icon2 = new ImageIcon("CD2.jpg");
        CD2Button = new JButton(icon2);
        CD2Button.setPreferredSize(new Dimension(300, 300));
        CD2Button.addActionListener (new OnListener());
       
        icon3 = new ImageIcon("CD3.jpg");
        CD3Button = new JButton(icon3);
        CD3Button.setPreferredSize(new Dimension(300, 300));
        CD3Button.addActionListener (new OnListener());
       
       
        fejl = new JLabel();                                            //Opretter et label til visning af status
        fejl.setPreferredSize(new Dimension(200,300));                  //Definerer størrelsen af display'et
        Font f = new Font("Arial", 0, 25);                              //Definerer skrifttypen i display'et
        fejl.setFont(f);
        fejl.setForeground(Color.white);                                //Definerer farven af teksten
        fejl.setText(" Vælg en CD ");
       
        Font font = new Font("Arial", 0, 20);
        Border whiteline;                                                //Her oprettes en titled border               
        whiteline = BorderFactory.createLineBorder(Color.white);
        TitledBorder tb = BorderFactory.createTitledBorder(whiteline , "Status indikator", 2, 2, font, Color.white);
        fejl.setBorder(tb);
       
        add(CD1Button);                                                    //Knapper og labels add's til panelet
        add(CD2Button);
        add(CD3Button);
        add(fejl);
       

        setOpaque(false);                                                //Panelet sættes til gennemsigtigt
                   
        repaint();       
        }//GUIJukebox konstruktør
       
       
    /**
    * Denne metode, doLayout, bruges til layoutet af panelet.
    *
    * @version 2.0
    * @author Gruppe 4
    */
   
        public void doLayout()                                //DoLayout sætter koordinator og størrelse af knapper og labels
        {
            CD1Button.setBounds(10, 645, 300,300);
            CD2Button.setBounds(10, 335, 300,300);
            CD3Button.setBounds(10, 25, 300,300);
            fejl.setBounds(320, 417, 270,150);
        }//doLayout
       
    /**
    * Denne klasse lytter efter tryk på knapperne
    *
    * @version 2.0
    * @author Gruppe 4
    */

   
    public class OnListener implements ActionListener                                //Denne klasse lytter efter knapperne
        {
           
            public void actionPerformed (ActionEvent event)
            {
        if (event.getSource() == CD1Button)
                {                                                                    //Hvis der trykkes på CD1 Startes dennes program
                    try                                                             //try-catch blokken bruges så programmet ikke stopper ved en evt. fejl
                        {
                        if(brugt == 0 && Boolean.valueOf(h.getItemValue(h.getIOGroup().getItem("PLCKører")).toString()) == false)    //Her sørges for at kranen henter CD1 og at der ikke sker noget hvis der trykkes på knappen mens kranen kører
                            {
                    h.setIntItem(h.getIOGroup().getItem("CDværdi1"), h1);            //Skriver værdier til PLC
                    h.setIntItem(h.getIOGroup().getItem("CDværdi2"), l1);        
                    h.setBoolItem(h.getIOGroup().getItem("GetCD"), true);            //Starter programmet der henter CD'en fra hylden
                    brugt = 1;
                    fejl.setText("<html> <B>Du har valgt Kim Larsen</B></html> ");    //Opdater statusindikatoren
                            }
                        else if(brugt == 2 && Boolean.valueOf(h.getItemValue(h.getIOGroup().getItem("PLCKører")).toString()) == false || brugt == 3 && Boolean.valueOf(h.getItemValue(h.getIOGroup().getItem("PLCKører")).toString()) == false)
                            {                                                                //Her køres køres programmet der henter CD'en fra skuffen, hvis en da andre CD'er allerede er i skuffen.
                            h.setBoolItem(h.getIOGroup().getItem("TakeCD"), true);   
                            tim1.start();                                                    //Starter timeren der der starter programmet der henter CD'en fra dens plads, når den CD der allerede er i skuffen er blevet lagt på plads
                            fejl.setText("<html><B> Du har valgt Kim Larsen </B> </html>");    //Opdater statusindikatoren
                            }
                        else if(brugt == 1)                                            //Hvis den valgte CD allerede er i afspilleren sker der ikke noget
                            {
                            fejl.setText("<html><B> Kim Larsen er allerede valgt </B> </html>");    //Opdater statusindikatoren
                            repaint();
                            }
                        }
                    catch (RbxIOException e) {    e.printStackTrace();    }
                }
            else if (event.getSource() == CD2Button)
                {                                                                    //Hvis der trykkes på CD2 Startes dennes program. Dette kører som for CD 1
                try
                        {
                        if(brugt == 0 && Boolean.valueOf(h.getItemValue(h.getIOGroup().getItem("PLCKører")).toString()) == false)
                            {
                    h.setIntItem(h.getIOGroup().getItem("CDværdi1"), h2);
                    h.setIntItem(h.getIOGroup().getItem("CDværdi2"), l2);        
                    h.setBoolItem(h.getIOGroup().getItem("GetCD"), true);
                    brugt = 2;
                    fejl.setText("<html><B> Du har valgt Elvis </B> </html>");
                            }
                        else if(brugt == 1 && Boolean.valueOf(h.getItemValue(h.getIOGroup().getItem("PLCKører")).toString()) == false || brugt == 3 && Boolean.valueOf(h.getItemValue(h.getIOGroup().getItem("PLCKører")).toString()) == false)
                            {
                            h.setBoolItem(h.getIOGroup().getItem("TakeCD"), true);
                            tim2.start();
                            fejl.setText("<html><B> Du har valgt Elvis </B></html>");
                            }
                        else if (brugt == 2)
                            {
                            fejl.setText("<html><B> Elvis er allerede valgt </B></html>");
                            repaint();
                            }
                        }
                    catch (RbxIOException e) {    e.printStackTrace();    }
                }
            else if (event.getSource() == CD3Button)
                {                                                                    //Hvis der trykkes på CD3 Startes dennes program
                try
                        {
                        if(brugt == 0 && Boolean.valueOf(h.getItemValue(h.getIOGroup().getItem("PLCKører")).toString()) == false)
                            {
                    h.setIntItem(h.getIOGroup().getItem("CDværdi1"), h3);
                    h.setIntItem(h.getIOGroup().getItem("CDværdi2"), l3);        
                    h.setBoolItem(h.getIOGroup().getItem("GetCD"), true);
                    brugt = 3;
                    fejl.setText("<html><B> Du har valgt Helmut Lotti </B></html>");
                            }
                        else if(brugt == 1 && Boolean.valueOf(h.getItemValue(h.getIOGroup().getItem("PLCKører")).toString()) == false || brugt == 2 && Boolean.valueOf(h.getItemValue(h.getIOGroup().getItem("PLCKører")).toString()) == false)
                            {
                            h.setBoolItem(h.getIOGroup().getItem("TakeCD"), true);
                            tim3.start();
                            fejl.setText("<html><B> Du har valgt Helmut Lotti </B></html>");
                            }
                        else if(brugt == 3)
                            {
                            fejl.setText("<html><B> Helmut Lotti er allerede valgt </B></html>");
                            repaint();
                            }
                        }
                    catch (RbxIOException e) {    e.printStackTrace();    }
                }
                t.start();           
            }//actionperformed
           
        }//OnListener
   
   
    /**
    * Denne klasse bliver aktiveret af knapperne, og reseter den satte variablen efter det ønskede interval
    *
    * @version 2.0
    * @author Gruppe 4
    */

       
        private class resetkontakt implements ActionListener            //her resetes knapperne efter 1000ms hvis de er blevet brugt
            {
            public void actionPerformed(ActionEvent ev)
                {
                    if(t.isRunning())                                    //Her fanges det hvis timeren kører, og løkken startes
                        {
                        try
                            {
                                h.setBoolItem(h.getIOGroup().getItem("GetCD"), false);
                                h.setBoolItem(h.getIOGroup().getItem("TakeCD"), false);
                            }
                        catch (RbxIOException e) {    e.printStackTrace();    }
                        }
                }//actionperformed
            }//resetkontakt
               
    /**
    * Denne klasse venter på kranen får hentet CD'en fra skuffen, og starter så programmet der
    * henter den valgte cd
    * @version 2.0
    * @author Gruppe 4
    */       
               
           
            private class kontaktet implements ActionListener            //Her køres programmet der sætter den valgte cd, CD1, i, efter den cd der allerede er sat på plads
            {
            public void actionPerformed(ActionEvent ev1)
                {
                    t.start();
                    try
                    {
                        if(Boolean.valueOf(h.getItemValue(h.getIOGroup().getItem("CDHentet")).toString()) == false && tim1.isRunning())
                            {
                                h.setIntItem(h.getIOGroup().getItem("CDværdi1"), h1);
                                h.setIntItem(h.getIOGroup().getItem("CDværdi2"), l1);        
                                h.setBoolItem(h.getIOGroup().getItem("GetCD"), true);
                                brugt = 1;
                                tim1.stop();
                            }
                    }
                    catch (RbxIOException e) {    e.printStackTrace();    }
                }
                   
            }//kontaktet
               
    /**
    * Denne klasse venter på kranen får hentet CD'en fra skuffen, og starter så programmet der
    * henter den valgte cd
    * @version 2.0
    * @author Gruppe 4
    */   
               
            private class kontaktto implements ActionListener            //Her køres programmet der sætter den valgte cd, CD2, i, efter den cd der allerede er sat på plads
            {
                public void actionPerformed(ActionEvent ev2)
                {
                    t.start();                                            //Starter timeren der resetter startbetingelsen for PLC programmet
                    try
                    {
                        if(Boolean.valueOf(h.getItemValue(h.getIOGroup().getItem("CDHentet")).toString()) == false && tim2.isRunning())
                        {
                            h.setIntItem(h.getIOGroup().getItem("CDværdi1"), h2);
                            h.setIntItem(h.getIOGroup().getItem("CDværdi2"), l2);        
                            h.setBoolItem(h.getIOGroup().getItem("GetCD"), true);
                            brugt = 2;
                            tim2.stop();                                //Stopper timeren når dette program er eksekveret
                        }
                    }
                    catch (RbxIOException e) {    e.printStackTrace();    }
                }   
            }//kontaktto
           
    /**
    * Denne klasse venter på kranen får hentet CD'en fra skuffen, og starter så programmet der
    * henter den valgte cd
    * @version 2.0
    * @author Gruppe 4
    */   
       
       
        private class kontakttre implements ActionListener            //Her køres programmet der sætter den valgte cd, CD3, i, efter den cd der allerede er sat på plads
        {
            public void actionPerformed(ActionEvent ev3)
            {
                t.start();
                try
                {
                    if(Boolean.valueOf(h.getItemValue(h.getIOGroup().getItem("CDHentet")).toString())== false && tim3.isRunning())
                        {
                            h.setIntItem(h.getIOGroup().getItem("CDværdi1"), h3);
                            h.setIntItem(h.getIOGroup().getItem("CDværdi2"), l3);        
                            h.setBoolItem(h.getIOGroup().getItem("GetCD"), true);
                            brugt = 3;
                            tim3.stop();
                        }
                }
                catch (RbxIOException e) {    e.printStackTrace();    }
            }   
        }//kontakttre       
   
}//class


Kan du fortælle mig hvordan man lukker tråden?
Avatar billede _carsten Nybegynder
24. maj 2007 - 11:31 #5
Det er bare helt i orden.

Så mangler du bare en ting, du skal lægge et svar og derefter skal du acceptere dit eget svar, så får du dine point tilbage.

Til orientering:
Ikke alle accepterer denne fremgangsmåde, hvor man selv tager sine udlovede point tilbage, men i dette tilfælde er det helt i orden med mig.
Avatar billede dynrambo Nybegynder
24. maj 2007 - 20:32 #6
Ok, mange tak for hjælpen.
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
Kurser inden for grundlæggende programmering

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester