Оптимальный способ получить выбранное значение JList из другого класса - PullRequest
0 голосов
/ 21 июня 2011

Я делаю менеджер баз данных, который показывает вам JTable со всеми данными таблицы. Идея состоит в том, чтобы с левой стороны был JList с именами таблиц, где вы можете выбрать таблицу для визуализации.

Итак, у меня есть класс, в котором я управляю всеми данными таблицы, и еще один класс для JList.

Класс JList происходит от JPanel, и я создал метод getInstance (), чтобы я мог просто создать один экземпляр JList. У меня также есть метод getSelectedValue (), который в основном вызывается в классе JTable для отображения информации о выбранной таблице.

Но при этом у меня возникают проблемы, я отлаживаю и получаю сообщение об ошибке в конструкторе JList, здесь код:

public class DatabaseJList extends JPanel {

private static DatabaseJList instance = null;
private static DefaultListModel listModel = new DefaultListModel();
private static JList list;

  public DatabaseJList() {
    setLayout(new BorderLayout());
    model = new DefaultListModel();

    list = new JList(model);
    JScrollPane pane = new JScrollPane(list);

    Vector<String> vector = new Vector(DatabaseTableManagers.getInstance().getTableNames());
    for( int i=0; i<vector.size() ; i ++ )
    {
        String string = vector.elementAt(i);

        model.addElement(string);   

    }


    add(pane, BorderLayout.NORTH);

  }

public Object getSelectedObject() {
    return list.getSelectedValue();

}
public void setSelectedObject(String str)
{
    list.setSelectedValue(str, true);
}



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

}

Когда метод getInstance вызывается впервые, и он переходит к выполнению «new DatabaseJList ();» это идет к конструктору и останавливается, меньше того, что я вижу с моими плохими знаниями отладки. Есть идеи? Спасибо всем;)

1 Ответ

0 голосов
/ 21 июня 2011

Кажется, работает нормально для меня. Вот что я попробовал (некоторые незначительные изменения, ничего радикального)

public class DatabaseJList extends JPanel {

    private static DatabaseJList instance = null;
    private static DefaultListModel listModel = new DefaultListModel();
    private static JList list;

    public DatabaseJList() {
        setLayout(new BorderLayout());
        DefaultListModel model = new DefaultListModel();

        list = new JList(model);
        JScrollPane pane = new JScrollPane(list);

        Vector<String> vector = new Vector<String>();
        vector.add("test1");
        vector.add("test2");
        for (int i = 0; i < vector.size(); i++) {
            String string = vector.elementAt(i);

            model.addElement(string);

        }

        add(pane, BorderLayout.NORTH);
    }

    public Object getSelectedObject() {
        return list.getSelectedValue();

    }

    public void setSelectedObject(String str) {
        list.setSelectedValue(str, true);
    }

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

    }

    public static void main(String a[])
    {
        DatabaseJList list = DatabaseJList.getInstance();
        JFrame frame = new JFrame();
        frame.setSize(300,300);
        frame.getContentPane().add(list);
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        frame.setVisible(true);

    }
}
...