如何将子视图添加到其他类的框架中?

时间:2014-01-14 13:50:06

标签: java swing view hierarchy conventions

首先,我不是在寻找解决方案,我在问这个最可接受的方法是什么。 现在我有一个主框架,它有一个绘图JPanel和一对JScrollPane只是用于记录事物。 我已将所有与日志相关的视图放在一个类中,并添加到主框架中,如下所示:

logViews = new LogViews(this);

我认为我不应该将整个类添加到对象中,但我还能如何使其工作?我应该扩展主框架还是制作界面? 日志视图也需要与主面板通信,因此必须双向连接。

好吧,如果它不够清楚:

LogViews是我制作的一个自定义类,它看起来像这样,但有更多的JLists:

public class LogViews {
        private DefaultListModel logModel;
        private JList<String> logList;

        public LogViews(MainFrame frame){
            logModel = new DefaultListModel();
            logList = new JList();
            logList.setModel(logModel);
            JScrollPane logListScroll = new JScrollPane(logList);
            frame.add(logListScroll, BorderLayout.NORTH);
        }
}

它有效,我只是想知道如果不在构造函数中添加MainFrame就能做到。

1 个答案:

答案 0 :(得分:1)

您可以LogViews JDialog这样的事情

public class LogViews extends JDialog {
    private DefaultListModel logModel;
    private JList<String> logList;

    public LogViews(JFrame frame, boolean modal){
        super(frame, true);
        logModel = new DefaultListModel();
        logList = new JList();
        logList.setModel(logModel);
        JScrollPane logListScroll = new JScrollPane(logList);

        setLayout(new BorderLayout());
        add(logListScroll);
        pack();
    }
}

只需点击一下按钮即可打开

button.addActionListener(new ActionPerformed(ActionEvent e){
    @Override
    public void actionPerformed(ActionEvent e) {
        new LogViews(MainFrame.this, true);
    }
}

允许它与MainFrame “通信”的做法只是让它作为内部类,以便它可以访问{{的所有类成员1}}。除此之外,很难提供完整的解决方案,因为它提供了很多需要传达的信息。


如果您希望它显示在MainFrame中,您只需MainFrame LogViews并将该面板添加到JPanel。再次,将其作为MainFrame的内部类,以便它可以访问MainFrame的所有字段


修改

如果你想要的是一个单独的类,你也可以做的是MainFrame。像

setter

和/或从列表中添加和删除的几种方法

public void setLogModel(DefaultListModel model) {
    logList.setModel(model);
}

然后从public void addToList(String element) { logModel.addElement(element); } 调用这些方法。但是对于您的方案,我只需将MainFrame设为LogViews而不是JPanel,并在JDialog中对其进行实例化,然后将其添加到MainClass }。像

这样的东西
MainFrame