问题描述
我正在开发带有代码完成工具的代码编辑器。我的目标是在激活后出现一个小的内部框架。但是现在我遇到了一个问题,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 (将#修改为@)