0

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

我想了解如何调用位于

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);
        }
    });
}

也许有人可以帮助我。十分感谢!

4

2 回答 2

3

您可以将 FereastraPrincipala 设为 AnduagaChitanta 的成员变量。

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

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

在运行方法()

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

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

公共类 AnduagaChitanta { FereastraPrincipala fPrincipala

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

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

public AnduagaChitanta(ISomethingPrinicipala fPrinicipala)

但是现在我们将进入设计模式,所以我将把它留在那里。

更新 您的更新后,我会做这样的事情:

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

}

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

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

我希望这是有道理的

于 2012-09-15T13:52:34.963 回答
0

永远不要调用run()线程的方法。它在它自己的当前线程中执行!总是调用start()方法。谈到你的情况,创建一个新类,以便你可以start()从其他地方调用它

于 2012-09-15T13:55:16.373 回答