代码完成不适用于 RSyntaxTextArea



RSyntaxTextArea使用SwingNode在JavaFX中工作,但似乎无法完成代码。因此,为了消除任何与JavaFX相关的问题,我实现了仅Java/Swing的版本,没有任何JavaFX。这是该代码:

package com.mystuff.swingtest;
import java.awt.*;
import javax.swing.*;
import org.fife.ui.autocomplete.*;
import org.fife.ui.rsyntaxtextarea.RSyntaxTextArea;
import org.fife.ui.rsyntaxtextarea.SyntaxConstants;
import org.fife.ui.rtextarea.RTextScrollPane;
class AutoCompleteDemo extends JFrame {
public AutoCompleteDemo() {
JPanel contentPane = new JPanel(new BorderLayout());
RSyntaxTextArea textArea = new RSyntaxTextArea(20, 60);
textArea.setSyntaxEditingStyle(SyntaxConstants.SYNTAX_STYLE_JAVA);
textArea.setCodeFoldingEnabled(true);
contentPane.add(new RTextScrollPane(textArea));

CompletionProvider provider = createCompletionProvider();
AutoCompletion ac = new AutoCompletion(provider);
ac.install(textArea);
setContentPane(contentPane);
setTitle("AutoComplete Demo");
setDefaultCloseOperation(EXIT_ON_CLOSE);
pack();
setLocationRelativeTo(null);
}
/**
* Create a simple provider that adds some Java-related completions.
*/
private CompletionProvider createCompletionProvider() {
DefaultCompletionProvider provider = new DefaultCompletionProvider();
// Add completions for all Java keywords. A BasicCompletion is just
// a straightforward word completion.
provider.addCompletion(new BasicCompletion(provider, "abstract"));
provider.addCompletion(new BasicCompletion(provider, "assert"));
provider.addCompletion(new BasicCompletion(provider, "break"));
provider.addCompletion(new BasicCompletion(provider, "case"));
// ... etc ...
provider.addCompletion(new BasicCompletion(provider, "transient"));
provider.addCompletion(new BasicCompletion(provider, "try"));
provider.addCompletion(new BasicCompletion(provider, "void"));
provider.addCompletion(new BasicCompletion(provider, "volatile"));
provider.addCompletion(new BasicCompletion(provider, "while"));
// Add a couple of "shorthand" completions. These completions don't
// require the input text to be the same thing as the replacement text.
provider.addCompletion(new ShorthandCompletion(provider, "sysout",
"System.out.println(", "System.out.println("));
provider.addCompletion(new ShorthandCompletion(provider, "syserr",
"System.err.println(", "System.err.println("));
return provider;
}
public static void main(String[] args) {
// Instantiate GUI on the EDT.
SwingUtilities.invokeLater(() -> {
try {
String laf = UIManager.getSystemLookAndFeelClassName();
UIManager.setLookAndFeel(laf);
} catch (Exception e) { /* Never happens */ }
new AutoCompleteDemo().setVisible(true);
});
}
}

但是当我输入sysout并点击crtl+SPACE没有任何反应。没有弹出窗口或任何东西。我从自动完成对象中检查了击键组合,它显示"ctrl 按下空格",所以我知道组合键是正确的。

我正在使用Mac.尝试了COMMAND,ALT而不是Control,但仍然没有。有什么想法吗?

更新 1

如果我按SPACE并按该顺序按住ctrl,弹出窗口会闪烁和关闭,当我松开ctrl如果我正确捕捉到它,弹出窗口会保持打开状态

更新 2

这导致我尝试更改触发键。我还没有制定出ctrl-whatever组合,但我尝试了

ac.setTriggerKey(KeyStroke.getKeyStroke('t'));

现在,在编辑器中按TAB会弹出没有闪烁的弹出窗口。因此,如果我能为KeyStroke找到正确的组合键,我可能能够解决原始问题。

通过添加密钥侦听器,可以对击键字符串进行反向工程:

textArea.addKeyListener(new KeyListener() {
@Override
public void keyTyped(java.awt.event.KeyEvent e) {
}
@Override
public void keyPressed(java.awt.event.KeyEvent e) {}
@Override
public void keyReleased(java.awt.event.KeyEvent e) {
System.out.println(KeyStroke.getKeyStrokeForEvent(e).toString());
}
});

不幸的是,ctrl+SPACE只产生了released CONTROL,其中没有提到空间特征。然而,ctrl+ENTER会产生ctrl released ENTER,这是一种魅力,是一种可接受的替代方案。

仍然不能解决ctrl+SPACE问题!

更新 2

我弄清楚了如何让控制键工作,但仍然没有空格键:

ac.setTriggerKey(KeyStroke.getKeyStroke("ctrl CONTROL"));

如果我弄清楚如何ctrl+space工作,我会稍后更新。

原始答案

这不完全是一个解决方案,但目前是一个解决方法。

ac.setTriggerKey(KeyStroke.getKeyStroke('^'));

所以目前我必须按SHIFT+6才能弹出,这有效,我知道我不会在代码中使用^字符。

相关内容

最新更新