17. maj 2007 - 14:10Der 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());
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
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.
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
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.
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.