首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >代码完成不适用于RSyntaxTextArea

代码完成不适用于RSyntaxTextArea
EN

Stack Overflow用户
提问于 2021-11-24 14:05:07
回答 1查看 163关注 0票数 2

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

代码语言:javascript
复制
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时,什么都不会发生。没有弹出窗口什么的。我检查了AutoComplete对象中的击键组合,它写着"ctrl按下空间“,所以我知道键组合是正确的。

我用的是Mac。尝试过命令,ALT而不是Control,但仍然没有。有什么想法吗?

更新1

如果按下SPACE并按住ctrl的顺序,弹出弹出就会上下闪烁,当我释放ctrl时,如果我正确地捕捉到了它,弹出就会保持不变。

更新2

这导致我试着改变扳机的钥匙。我还没有想出ctrl-whatever的组合,但我试过了

代码语言:javascript
复制
ac.setTriggerKey(KeyStroke.getKeyStroke('\t'));

现在,在编辑器中按TAB可以打开弹出窗口,而不需要闪烁。因此,如果我能够为KeyStroke找到正确的密钥组合,我可能能够修复原来的问题。

EN

回答 1

Stack Overflow用户

发布于 2021-11-24 23:17:49

通过添加键侦听器,可以反向工程键笔划字符串:

代码语言:javascript
复制
        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

worked out如何获得控制键工作,但仍然没有空格键:

代码语言:javascript
复制
      ac.setTriggerKey(KeyStroke.getKeyStroke("ctrl CONTROL"));

如果我想出了如何让ctrl+space工作的话,我稍后会更新。

原始答案

这不是一个确切的解决方案,但它只是目前的一项工作。

代码语言:javascript
复制
        ac.setTriggerKey(KeyStroke.getKeyStroke('^'));

因此,目前我必须按SHIFT+6键才能弹出,这是可行的,我知道我不会在代码中使用^字符。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/70097523

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档