Avatar billede sago Nybegynder
28. februar 2002 - 13:26 Der er 3 kommentarer og
1 løsning

Kalde metode i klasse den ikke kender?

Hej, jeg har et problem. Jeg er igang med at lave et GUI, jeg har to klasser: MainControl og GUI. GUI er en Frame, og den bliver lavet af MainControl.

Mit problem er at jeg vil starte tråde fra mit GUI, ved hjælp af en knap. Trådene bliver lavet i MainControl. Derfor har jeg en metode i MainControl der kan dét. Men da GUI ikke kender MainControl objektet, så kan jeg jo ikke det.

Hvordan kan jeg få GUI objektet til at kende MainControl objektet? Jeg prøvede at sende referencen videre via constructoren, men jeg synes ikke jeg kunne få det til at virke.

Her er mine klasser:

----------------------------------------------------
package thread;

import java.awt.*;
import java.awt.event.*;
import javax.swing.*;

public class MainControl {

  ArrayObjects ao;
    GUI frame;
  ThreadA a;
  ThreadB b;
  ThreadC c;

  public MainControl() {
    frame = new GUI();

    Dimension screenSize = Toolkit.getDefaultToolkit().getScreenSize();
    Dimension frameSize = frame.getSize();
    if (frameSize.height > screenSize.height) {
      frameSize.height = screenSize.height;
    }
    if (frameSize.width > screenSize.width) {
      frameSize.width = screenSize.width;
    }
    frame.setLocation((screenSize.width - frameSize.width)/2, (screenSize.height - frameSize.height)/2);
    frame.addWindowListener(new WindowAdapter() { public void windowClosing(WindowEvent e) { System.exit(0); } });
    frame.setVisible(true);
  }

  public ArrayObjects getArrayObjects()
    {
        return ao;
    }

  public void startAll(){
    a.start();
      b.start();
      c.start();
  }

  public void run(){

    ao = new ArrayObjects();
      frame.initialize(ao);
    ao.setMailVan();

      a = new ThreadA(ao);
      b = new ThreadB(ao);
      c = new ThreadC(ao);

      a.start();
      b.start();
      c.start();
  }

  public static void main(String[] args) {
    try  {
      UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName());
    }
    catch (Exception e) {
      e.printStackTrace();
    }
    MainControl mc = new MainControl();
    mc.run();
  }
}


----------------------------------------------------
package thread;

import javax.swing.*;
import java.awt.*;
import oracle.jdeveloper.layout.*;
import oracle.dacf.layout.*;
import java.awt.event.*;
//import oracle.jdeveloper.layout.*;

public class GUI extends JFrame implements PropertyListener{

  String[] data = new String[25];
  MainControl mc;
    String temp;

  JPanel jPanel1 = new JPanel();
  XYLayout xYLayout1 = new XYLayout();
  JLabel jLabel1 = new JLabel();
  JList jList2 = new JList(new DefaultListModel());
  JLabel jLabel2 = new JLabel();
  JList jList3 = new JList(new DefaultListModel());
  JLabel jLabel3 = new JLabel();
  JList jList4 = new JList(new DefaultListModel());
  JLabel jLabel4 = new JLabel();
  XYLayout xYLayout2 = new XYLayout();

  JList jList1 = new JList(new DefaultListModel());
  JButton jButton1 = new JButton();

  public GUI() {
    super();
    try  {
      jbInit();
    }
    catch (Exception e) {
      e.printStackTrace();
    }
  }

  private void jbInit() throws Exception {
    this.getContentPane().setLayout(xYLayout2);
    this.setSize(new Dimension(545, 660));
    jLabel1.setText("MailVan");
    jLabel2.setText("Hand");
    jLabel3.setText("Table");
    jLabel4.setText("PostBag");
    xYLayout2.setHeight(661);
    jButton1.setText("jButton1");
    jButton1.addActionListener(new java.awt.event.ActionListener() {

      public void actionPerformed(ActionEvent e) {
        jButton1_actionPerformed(e);
      }
    });
    xYLayout2.setWidth(545);
    jPanel1.setLayout(xYLayout1);
    this.setTitle("Postoffice");
    this.getContentPane().add(jPanel1);
    this.getContentPane().add(jLabel1, new XYConstraints(10, 119, 59, -1));
    this.getContentPane().add(jList2, new XYConstraints(127, 141, 32, 472));
    this.getContentPane().add(jLabel2, new XYConstraints(124, 120, 41, -1));
    this.getContentPane().add(jList3, new XYConstraints(282, 142, 30, 472));
    this.getContentPane().add(jLabel3, new XYConstraints(276, 122, 41, -1));
    this.getContentPane().add(jList4, new XYConstraints(481, 144, 31, 468));
    this.getContentPane().add(jLabel4, new XYConstraints(475, 126, 58, -1));
    this.getContentPane().add(jList1, new XYConstraints(15, 137, 29, 474));
    this.getContentPane().add(jButton1, new XYConstraints(77, 31, -1, -1));
  }

      public void initialize(ArrayObjects ao)
    {
        // registrér som observer
        ao.addPropertyListener(this);
    }
    public void onPropertyEvent(String name, int loc, int id)
    {
        System.out.println("onPropertyEvent triggered in " + name + "[" + loc + "] " + "Mail ID moved is: " + id);

    temp = Integer.toString(id);
        if(name == "MailVan")
      ((DefaultListModel)jList1.getModel()).addElement(temp);

    if(name == "Hand")
      ((DefaultListModel)jList2.getModel()).addElement(temp);

    if(name == "Table")
      ((DefaultListModel)jList3.getModel()).addElement(temp);

    if(name == "PostBag")
      ((DefaultListModel)jList4.getModel()).addElement(temp);




    }

    public void onPropertyEventDel(String name, int loc, int id){
    if(name == "MailVan")
      ((DefaultListModel)jList1.getModel()).removeElementAt(0);

    if(name == "Hand")
      ((DefaultListModel)jList2.getModel()).removeElementAt(0);

    if(name == "Table")
      ((DefaultListModel)jList3.getModel()).removeElementAt(0);

    if(name == "Postbag")
      ((DefaultListModel)jList4.getModel()).removeElementAt(0);



  }

  void jButton1_actionPerformed(ActionEvent e) {

  }

}

Jeg håber i kan hjælpe.
Avatar billede disky Nybegynder
28. februar 2002 - 13:44 #1
lav:


MainControl mainControl;
public GUI(MainControl mainControl)
{
    super();
    this.mainControl=mainControl;
    try  {
      jbInit();
    }
    catch (Exception e) {
      e.printStackTrace();
    }
  }


Nu har din GUI en reference til den klasse som instantierer GUI
i din MainControl klasse skal du rette:
frame = new GUI();

til
frame = new GUI(this);

Så skulle det spille.
Avatar billede sago Nybegynder
28. februar 2002 - 14:14 #2
Det virker, men nu får jeg problemer med super() metoden: "Error: method required, but value found"

Hvis jeg ikke kalder super() virker programmet, men den er der vel af en eller anden grund ;) (jeg bruger jDeveloper som automatisk har lagt den dér)
Avatar billede disky Nybegynder
28. februar 2002 - 14:38 #3
Det er faktisk ikke nødvendigt at have den super(); det gør java helt af sig selv, men den finder bare selv den korrekte metode.

Så bare fjern den helt, programmet virker også uden.
Avatar billede sago Nybegynder
28. februar 2002 - 14:44 #4
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