如何从另一个类调用run方法?

时间:2012-09-15 13:46:35

标签: java methods call

对不起,如果这是一个愚蠢的问题。

我想了解如何调用位于

中的run方法
java.awt.EventQueue.invokeLater(new Runnable() {
        public void run() {
            new FereastraPrincipala().setVisible(true);
来自AdaugaComanda.java类的

run方法在FereastraPrincipala.java中声明,我想从AdaugaComanda.java调用它,以便在AdaugaChitanta.java的文本字段中引入值后,可以看到FereastraPrincipala的更改。如果我不调用方法,那么我必须再次运行FereastraPrincipala.java,以便在JTabbedPane中查看新信息。

以下是FereastraPrincipala.java的代码

 package sakila.ui;

 import java.util.List;
 import java.util.Vector;
 import javax.swing.table.DefaultTableModel;
 import org.hibernate.Session;
 import sakila.entity.*;
 import sakila.util.HibernateUtil;

public class FereastraPrincipala extends javax.swing.JFrame {

public FereastraPrincipala() {
    initComponents();
}

private void jMenuItem1ActionPerformed(java.awt.event.ActionEvent evt) {                                           
    AdaugaComanda ac = new AdaugaComanda();
    ac.setVisible(true);
}                                          

public static void main(String args[]) {

    java.awt.EventQueue.invokeLater(new Runnable() {

        public void run() {
            new FereastraPrincipala().setVisible(true);
            Session session = HibernateUtil.getSessionFactory().openSession();

    try{

    List<Comanda> comenzi = session.createQuery("from Comanda").list();

    Vector<String> tableHeaders = new Vector<String>();
    Vector tableData = new Vector();
    tableHeaders.add("IdComanda");
    tableHeaders.add("Depozit");
    tableHeaders.add("Furnizor");
    tableHeaders.add("Client");
    tableHeaders.add("Produs");
    tableHeaders.add("Cantitate");
    tableHeaders.add("Unit de mas");

    for (Comanda comanda : comenzi) {
        Vector <Object> oneRow = new Vector <Object>();
        oneRow.add(comanda.getIdcomanda());
        oneRow.add(comanda.getDepozit() == null ? "" : comanda.getDepozit().toString());
        oneRow.add(comanda.getFurnizor() == null ? "" : comanda.getFurnizor().toString());
        oneRow.add(comanda.getClient() == null ? "" : comanda.getClient().toString());
        oneRow.add(comanda.getProdus() == null ? "" : comanda.getProdus().toString());
        oneRow.add(comanda.getCantitate());
        oneRow.add(comanda.getUnitmas());

        tableData.add(oneRow);

        }
   ComandaTable.setModel(new DefaultTableModel(tableData, tableHeaders));    

       }catch (Exception he){
        he.printStackTrace();
    }
 }                              
    });
}

}

以下是AdaugaComanda.java的代码

   package sakila.ui;

  import java.io.EOFException;
  import java.util.List;
  import sakila.entity.*;
  import sakila.service.Functie;
  import sakila.entity.Client;

 public class AdaugaComanda extends javax.swing.JDialog {

public AdaugaComanda() {
    initComponents();
    initComboBoxes();
}

   private void initComboBoxes() {

    DepozitComboBox.removeAllItems();
    FurnizorComboBox.removeAllItems();
    ClientComboBox.removeAllItems();
    ProdusComboBox.removeAllItems();

    System.out.println("sterge itemurile");

    List<Depozit> depozite = (List<Depozit>) sakila.client.Client.citeste(Functie.LISTEAZA_DEPOZITE);
    for (Depozit depozit : depozite)
        DepozitComboBox.addItem(depozit);

    List<Furnizor> furnizori = (List<Furnizor>) sakila.client.Client.citeste(Functie.LISTEAZA_FURNIZORI);
    for (Furnizor furnizor : furnizori)
        FurnizorComboBox.addItem(furnizor);

    List<Client> clienti = (List<Client>) sakila.client.Client.citeste(Functie.LISTEAZA_CLIENTI);
    for (Client client : clienti)
        ClientComboBox.addItem(client);

    List<Produs> produse = (List<Produs>) sakila.client.Client.citeste(Functie.LISTEAZA_PRODUSE);
    for (Produs produs : produse)
        ProdusComboBox.addItem(produs);
    System.out.println("adaugaitemuri"); 

}

private void ClientComboBoxActionPerformed(java.awt.event.ActionEvent evt) {                                               
    // TODO add your handling code here:
}                                              

private void InsereazaButtonActionPerformed(java.awt.event.ActionEvent evt) {                                                
    runQueryBasedOnInsert();
}                                               

 private void runQueryBasedOnInsert(){

    Comanda comanda = new Comanda();

    Depozit depozit = (Depozit)DepozitComboBox.getSelectedItem();
    comanda.setDepozit(depozit);

    Furnizor furnizor = ((Furnizor)FurnizorComboBox.getSelectedItem());
    comanda.setFurnizor(furnizor);

    sakila.entity.Client client = ((sakila.entity.Client)ClientComboBox.getSelectedItem());
    comanda.setClient(client);

    Produs produs = ((Produs)ProdusComboBox.getSelectedItem());
    comanda.setProdus(produs);

    comanda.setCantitate(Integer.parseInt(CantitateTextField.getText()));
    comanda.setUnitmas(UnitMasTextField.getText());

    sakila.client.Client.scrie(Functie.CREAZA_COMANDA, comanda);

}

 public static void main(String args[]) {

 java.awt.EventQueue.invokeLater(new Runnable() {

        public void run() {
            new AdaugaComanda().setVisible(true);
        }
    });
}

也许有人可以帮助我。非常感谢!

2 个答案:

答案 0 :(得分:3)

你可以让FereastraPrincipala成为AnduagaChitanta的成员变量。

public class  AnduagaChitanta
{
  FereastraPrincipala fPrincipala  = new FereastraPrincipala (); //Or inject it into the constructor

  private void SomeMethod()
  {
   fPrincipala.run();
  }
}

在run方法()

public void run()
{
  setvisible(true);
}

如果您想知道如何注射它:

公共课AnduagaChitanta     {       FereastraPrincipala fPrincipala

  public AnduagaChitanta(FereastraPrincipala fPrinicipala)
  {
      this.fPrinicipala = fPrinicipala;
  }
  private void SomeMethod()
  {
   fPrincipala.run();
  }
}

如果您愿意,可以让FereastraPrincipala实现一个接口,因此构造函数的定义可以是:

公共AnduagaChitanta(ISomethingPrinicipala fPrinicipala)

但现在我们正在进入设计模式,所以我将其留在那里。

<强>更新 更新后,我会做这样的事情:

FereastraPrincipala extends JFrame implements Runnable 
{
   public void run()
   {
        setvisible(true) ;
   } 

}

我不知道在哪里,但也许在你的AnduagaChitanta课上我会这样做

public void SomeMethod()
{
  java.awt.EventQueue.invokeLater(fPrinicpala) 
}

我希望这是有道理的

答案 1 :(得分:0)

永远不要调用run()线程方法。它自己在当前线程中执行!!始终致电start()方法。来到你的案例,创建一个新类,以便你可以从其他地方调用start()