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

Java 如何将子视图从其他类添加到框架中?,java,swing,view,hierarchy,conventions,Java,Swing,View,Hierarchy,Conventions,首先,我不是在寻找解决方案,我是在问什么是最可接受的方法。 现在我有了一个主框架,它有一个绘图JPanel和一对JScrollPane,用于记录东西。 我已将所有与日志相关的视图放在一个类中,并添加到主框架中,如下所示: logViews = new LogViews(this); 我认为我不应该将整个类添加到对象中,但是我如何才能使它工作呢?我应该扩展主框架还是制作一个接口? 日志视图也需要与主面板通信,因此必须双向连接 好的,如果不够清晰: LogViews是我定制的一个类,它看起来像这样

首先,我不是在寻找解决方案,我是在问什么是最可接受的方法。 现在我有了一个主框架,它有一个绘图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);
        }
}
公共类日志视图{
私有默认列表模型logModel;
私人JList日志列表;
公共日志视图(主机框架){
logModel=新的DefaultListModel();
logList=new JList();
logList.setModel(logModel);
JScrollPane logListScroll=新的JScrollPane(logList);
添加(logListScroll,BorderLayout.NORTH);
}
}

它可以工作,我只是想知道我是否可以不用在构造函数中添加大型机来完成它。

您可以制作
LogViews
a
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();
    }
}
允许它与
大型机
进行“通信”的方法是将它作为一个内部类,这样它就可以访问
大型机
的所有类成员。除此之外,很难提供完整的解决方案,因为我们已经提供了很多需要沟通的内容


如果希望它出现在
大型机中
,只需
日志视图
a
JPanel
并将该面板添加到
大型机中
。同样,将其作为
大型机的内部类
,这样它就可以访问
大型机的所有字段


编辑

如果您想作为一个单独的类,您还可以做的是使用
setter
。像

public void setLogModel(DefaultListModel model) {
    logList.setModel(model);
}
和/或从列表中添加和删除的两个方法

public void addToList(String element) {
    logModel.addElement(element);
}
然后从
大型机
调用这些方法。但是对于您的场景,我只需要将
LogViews
a
JPanel
,而不是
JDialog
,并在
main类中实例化它,然后将它添加到您的
大型机中。差不多

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

    public LogViews(){
        logModel = new DefaultListModel();
        logList = new JList();
        logList.setModel(logModel);
        JScrollPane logListScroll = new JScrollPane(logList);

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

    public void addToList(String element) {
        logModel.addElement(element);
    }

    public void setLogModel(DefaultListModel model) {
        logList.setModel(model);
    }
}
公共类日志视图扩展了JPanel
私有默认列表模型logModel;
私人JList日志列表;
公众日志视图(){
logModel=新的DefaultListModel();
logList=new JList();
logList.setModel(logModel);
JScrollPane logListScroll=新的JScrollPane(logList);
setLayout(新的BorderLayout());
添加(日志列表滚动);
}
公共void addToList(字符串元素){
logModel.addElement(元素);
}
public void setLogModel(DefaultListModel模型){
logList.setModel(model);
}
}

1)什么是自定义组件
LogViews
?2) “一对JScrollPane只是用来记录东西的。”这到底是什么意思?它们的侧面有文本区域吗?3) 这个
logViews=新的logViews(this)究竟是如何实现的向我们显示您已将其添加到框架中?我添加了一个简单的示例,因此最终,LogView只是一个
JList
我是否正确?关于你想用它做什么的问题到底是什么?还有,你想让这个类出现在大型机中还是作为一个单独的框架出现?我需要它在里面,这的全部目的是分离一些代码,因为主框架的类太长了。好吧,如果给它框架不是一个问题,会有用的,谢谢!
public class LogViews extends JPanel
    private DefaultListModel logModel;
    private JList<String> logList;

    public LogViews(){
        logModel = new DefaultListModel();
        logList = new JList();
        logList.setModel(logModel);
        JScrollPane logListScroll = new JScrollPane(logList);

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

    public void addToList(String element) {
        logModel.addElement(element);
    }

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