我RSyntaxTextArea使用 SwingNode 在 JavaFX 中作業,但似乎無法讓代碼完成作業。因此,為了消除任何與 JavaFX 相關的問題,我實作了一個沒有 JavaFX 的僅 Java/Swing 版本。這是代碼:
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 press SPACE”,所以我知道組合鍵是正確的。
我正在使用 Mac。嘗試了 COMMAND、ALT 而不是 Control,但仍然沒有。有任何想法嗎?
更新 1
如果我按這個順序SPACE按住ctrl,彈出視窗會閃爍,當我松開時ctrl,如果我正確抓住它,彈出視窗會保持亮起??
更新 2
這促使我嘗試更改觸發鍵。我還沒有弄清楚ctrl-whatever組合,但我試過了
ac.setTriggerKey(KeyStroke.getKeyStroke('\t'));
并TAB在編輯器中按下現在會彈出沒有閃爍的彈出視窗。所以如果我能找到正確的組合鍵,我可能能夠解決原來的問題KeyStroke。
uj5u.com熱心網友回復:
通過添加一個鍵偵聽器,可以對 Key Stroke 字串進行逆向工程:
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產生 just released CONTROLwhich 沒有提到空格字符。然而,ctrl ENTER產生ctrl released ENTER一種魅力,是一種可以接受的替代品。
還是沒有解決ctrl SPACE問題!
更新 2
我想出了如何讓控制鍵作業,但仍然沒有空格鍵:
ac.setTriggerKey(KeyStroke.getKeyStroke("ctrl CONTROL"));
如果我知道如何開始ctrl space作業,我會稍后更新。
原答案
這不完全是一個解決方案,但它現在是一種解決方法。
ac.setTriggerKey(KeyStroke.getKeyStroke('^'));
所以目前我必須按下SHIFT 6才能彈出,這很有效,我知道我不會^在代碼中使用該字符。
轉載請註明出處,本文鏈接:https://www.uj5u.com/ruanti/372483.html
上一篇:java-如何將資料顯示到Java中的JtextArea,并與txt檔案中的文本完全對齊
下一篇:代碼如何使用按鈕內的物件?
