Closed. This question needs details or clarity。它当前不接受答案。












想改善这个问题吗?添加详细信息并通过editing this post阐明问题。

6年前关闭。



Improve this question





首先,我不是在寻找解决方案,而是在问什么是最可接受的方法。
现在,我有一个主框架,其中有一个绘图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的情况下做到这一点。

最佳答案

您可以将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“通信”,只是使它作为内部类,这样它就可以访问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中。就像是

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

关于java - 如何将 subview 添加到其他类的框架? ,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/21115187/

10-09 04:12