2010-12-01 3 views
0

Я хотел бы добавить элементы в поле списка на jframe, из другого класса, однако он не работает независимо от того, что я пытаюсь ... я не получаю сообщение об ошибке или никакой обратной связи о том, что не так с этим ... но heres макет у меня есть, список использует DefaultListModel lm2Как добавить элементы в список из другого класса в netbeans

Я знаю, как добавлять элементы в jList в классе jframe, но для какой-то причине я не смог добавить из элементов, входящих другого класса, даже при добавлении этого внутри класса JFrame:

public void log(String str) { 
     lm2.addElement(str); 
    } 

и на моей «другой класс»

frmMain doit = new frmMain(); 

    doit.log("add to list box"); 
#

Подробнее адд --->

#

У меня есть 3-х классов и здесь все они:

frmMain.class

// jFrame class which builds the jframe (from jframe template) 
    public class frmMain extends javax.swing.JFrame { 

     /** Creates new form frmMain */ 
     public frmMain() { 
      initComponents(); 
     } 



     public void log(String str) { 
      lm2.addElement(str); 
     } 



     public DefaultListModel lm2 = new DefaultListModel(); 
    } 

RequestInfo. класс

// RequestInfo.class, which is trying to add an item to the 
// jlist but it doesn't add anything or error 

public class RequestInfo { 

    public void ProcessReturnedInfo(String sData, boolean bWithLabel) { 


      frmMain fm = new frmMain(); 
      fm.log("test test"); 



} 

RS232Example.class

 // My main class which sets the jFrame to visible 
    public class RS232Example { 
     public static void main(String[] args) throws Exception { 


     frmMain form = new frmMain(); 
     form.setVisible(true); 

    } 

    } 

Я понимаю, может быть, мне нужно, чтобы установить форму видимой на RequestInfo.class, однако я не могу этого сделать, потому что он будет постоянно открывать форму несколько раз, потому что этот метод класса вызывается несколько раз из события ...

+2

Что такое «список»? Используйте правильную терминологию при задании вопроса. Если у вас есть ссылка на ListModel во втором классе, то метод addElement() должен работать. Отправьте свой SSCCE (http://sscce.org), демонстрирующий проблему. Код, который вы отправили, не помогает нам вообще. – camickr

+0

Часто эта проблема связана с одной из ссылок, что компонент, который вы вызываете методы для изменения данных, не тот, который визуализируется на экране. Я вижу, что в вашем «другом классе» вы вызываете new frmMain() - это переменная doit frmMain, которую мы видим выше той, которая визуализируется, которую вы вызываете setVisible (true) (если это JFrame)? В противном случае я второй раз, что Роб Камик рекомендует выше. –

+0

по какой-то причине, независимо от того, что я пытаюсь, я могу ссылаться на DefaultListModel снова в RequestInfo.class ... как я могу добавлять элементы из этого класса? – jason

ответ

2

если ваш ListBox-модель устанавливается право (как listBox.setModel(this.lm2);) Я предполагаю, что должно работать:

public static void main(String[] args) throws Exception { 
    frmMain form = new frmMain(); 
    form.setVisible(true); 
    form.log("Hallo"); 
} 

Если вы задаетесь вопросом, почему это работает, и код в RequestInfo не, иметь в виду, что вы создаете новый frmMain с его собственным ListModel для каждого вызова ProcessReturnedInfo

Если вы хотите иметь только один кадр обновленные попытаться использовать кадр как синглтон:

Изменить конструктор frmMain от общественного к частному и добавить к классу:

private static frmMain instance = null; 

public static frmMain getInstance() { 
    if (instance == null) { 
    instance = new frmMain(); 
    } 
    return instance; 
} 

Вместо вызова new frmMain() теперь вы должны использовать frmMain.getInstance() в RequestInfo и RS232Example

Вот как вы всегда будете работать на одной раме.

Удачи.

0

Что вы еще ищете? Я предполагаю, что frmMain() создает JFrame с JList, но если только JFrame также не отображается, вы его не увидите. Я подозреваю - и я могу ошибаться - у вас есть более одного экземпляра JFrame, и строка добавляется к той, которая не становится видимой.

Извините, что заболел, но я считаю, что у Андреаса L есть правильный ответ на вашу проблему. Вам необязательно нужен статический объект кадра, но это самый простой способ. У вас также могут быть проблемы, если вы обрабатываете несколько потоков, в этом случае вам понадобятся способы управления обработкой запросов, данные о очередности, которые вы еще не закончили, и т. Д.

Удачи.

+0

Я понимаю, что вы говорите, я должен установить «форму» на видимый в RequestInfo.class, однако я не могу этого сделать, потому что этот метод вызывается несколько раз через обработчик событий. Это проект RS232 (данные последовательной связи), поэтому данные постоянно поступают и постоянно вызывают этот метод в RequestInfo.class. – jason

Смежные вопросы