添加 JInternalFrame 时 JDesktopPane 不显示组件

问题描述

我正在开发带有代码完成工具的代码编辑器。我的目标是在激活后出现一个小的内部框架。但是现在我遇到了一个问题,JDesktopPane 的层方法似乎不起作用。

代码可能没有多大意义,因为我将其分解为最小的可重现示例。

Main.java

package questions;

import javax.swing.*;

public class Main {

    public static void main(String[] args) {
        SwingUtilities.invokelater(() -> {
            try {
                UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName());
            } catch (ClassNotFoundException | InstantiationException |
                    illegalaccessexception | UnsupportedLookAndFeelException e) {
                e.printstacktrace();
            }
            JavaEditor editor = new JavaEditor(true); // "true" means it will be windowed.
            editor.display();
        });
    }
}

JavaEditor.java

package questions;

public final class JavaEditor extends CodeEditor {

    private CodeCompletion codeCompletion;

    public JavaEditor(boolean windowed) {
        super(windowed);
        this.codeCompletion = new CodeCompletion(this);
        codeCompletion.enable();

        // Loop for debugging,prints the classes found added to the JDesktopPane.
        for (int i = 0; i < this.getRootPane().getComponents().length; i++) {
            System.out.println(getRootPane().getComponent(i).getClass());
        }
    }

}

CodeEditor.java

package questions;

import javax.swing.*;
import java.awt.*;

public abstract class CodeEditor {

    protected final String title = "Java Editor";

    private JFrame frame;

    private JDesktopPane rootPane;

    private JSplitPane mainSplitPane;

    private JPanel sidePanel;

    private JScrollPane editorScrollPane;

    private JScrollPane sideScrollPane;

    protected JEditorPane editorPane;

    private JToolBar toolBar;

    private LayoutManager layoutManager = new BorderLayout();

    private boolean windowed;

    protected CodeEditor(boolean windowed) {
        this.windowed = windowed;
        createComponents();
        applyComponentHierarchy();
    }

    protected void createComponents() {
        if (windowed) frame = new JFrame(title);
        rootPane = new JDesktopPane();
        sidePanel = new JPanel();
        editorPane = new JEditorPane();
        editorScrollPane = new JScrollPane();
        sideScrollPane = new JScrollPane();
        mainSplitPane = new JSplitPane(JSplitPane.HORIZONTAL_SPLIT,sideScrollPane,editorScrollPane);
        toolBar = new JToolBar();
    }

    protected void applyComponentHierarchy() {
        if (windowed) {
            frame.setContentPane(rootPane);
        }
        editorScrollPane.setViewportView(editorPane);
        sideScrollPane.setViewportView(sidePanel);
        rootPane.setLayout(layoutManager);
        rootPane.setLayer(toolBar,0);
        rootPane.setLayer(mainSplitPane,0);
        rootPane.add(toolBar,BorderLayout.norTH);
        rootPane.add(mainSplitPane,BorderLayout.CENTER);
    }

    public JDesktopPane getRootPane() {
        return rootPane;
    }

    public void display() {
        if (!windowed) throw new IllegalStateException("Editor must be in windowed mode to be displayed.");
        frame.setPreferredSize(new Dimension(1000,600));
        frame.pack();
        frame.setExtendedState(JFrame.MAXIMIZED_BOTH);
        frame.setDefaultCloSEOperation(JFrame.disPOSE_ON_CLOSE);
        frame.setLocationRelativeto(null);
        frame.requestFocus();
        frame.setVisible(true);
    }

}

CodeCompletion.java

package questions;

import javax.swing.*;
import java.awt.*;

public class CodeCompletion {

    private JInternalFrame completionFrame;

    private JScrollPane mainPanel;

    private JList<String> completionList;

    private DefaultListModel<String> listModel = new DefaultListModel<>();

    private CodeEditor editor;

    public CodeCompletion(CodeEditor editor) {
        this.editor = editor;

        // Parameters are: title,resizeable,closable,maximizable,iconifiable
        this.completionFrame = new JInternalFrame("Title",false,false);
        this.mainPanel = new JScrollPane();
        this.completionList = new JList<>();

        mainPanel.setViewportView(completionList);
        completionFrame.setContentPane(mainPanel);
    }

    public void enable() {
        completionList.setModel(listModel);
        editor.getRootPane().setLayer(completionFrame,1);
        editor.getRootPane().add(completionFrame);
        editor.getRootPane().revalidate();
        completionFrame.setSize(new Dimension(100,100));
        completionFrame.pack();
    }

    public void disable() {
        completionFrame.dispose();
    }

}

JavaEditor 中的调试循环表明所有组件确实都添加JDesktopPane 中,当我注释行 editor.getRootPane().add(completionFrame); 时,它正确显示了其他两个组件。发生了什么?

解决方法

暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!

如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。

小编邮箱:dio#foxmail.com (将#修改为@)