【问题标题】:Optimal way to get a JList selectedvalue from another class从另一个类中获取 JList selectedvalue 的最佳方法
【发布时间】:2011-06-21 18:01:34
【问题描述】:

我正在制作一个数据库管理器,它会向您显示一个包含所有表数据的 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();”时它进入构造函数并停止,以我糟糕的调试知识所看到的更少。有任何想法吗?谢谢大家;)

【问题讨论】:

  • 题外话:让静态方法返回单个实例,它被称为单例模式,在这种模式下,您将构造函数设为私有(或受保护),因此类本身无法正常实例化。跨度>

标签: java eclipse singleton instance jlist


【解决方案1】:

对我来说似乎工作得很好。这是我尝试过的(一些小的调整,没什么大不了的)

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

    }
}

【讨论】:

  • 记得把 Swing 相关的事件放到EDT!
猜你喜欢
  • 1970-01-01
  • 2011-06-16
  • 2014-08-29
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-08-17
相关资源
最近更新 更多