在經歷Java swing時,我遇到了這個問題。 我有一個JTextField具有預定義的不可編輯的文本。用戶應該能夠附加其他文本但不編輯預定義的文本。是否有任何方法來獲得這個解決方案或其他?JTextField其中預定義文本不可編輯,但其他文本可以追加到其中?
回答
我有一個JTextField具有預定義的不可編輯的文本。 用戶應該能夠附加其他文本,但不需要編輯 預定義文本。是否有任何方法可以獲得此解決方案或其他任何方法?
使用
最初由@camickr
做
import java.awt.event.*;
import javax.swing.*;
import javax.swing.text.*;
public class NavigationFilterPrefixWithBackspace extends NavigationFilter {
private int prefixLength;
private Action deletePrevious;
public NavigationFilterPrefixWithBackspace(int prefixLength, JTextComponent component) {
this.prefixLength = prefixLength;
deletePrevious = component.getActionMap().get("delete-previous");
component.getActionMap().put("delete-previous", new BackspaceAction());
component.setCaretPosition(prefixLength);
}
@Override
public void setDot(NavigationFilter.FilterBypass fb, int dot, Position.Bias bias) {
fb.setDot(Math.max(dot, prefixLength), bias);
}
@Override
public void moveDot(NavigationFilter.FilterBypass fb, int dot, Position.Bias bias) {
fb.moveDot(Math.max(dot, prefixLength), bias);
}
class BackspaceAction extends AbstractAction {
private static final long serialVersionUID = 1L;
@Override
public void actionPerformed(ActionEvent e) {
JTextComponent component = (JTextComponent) e.getSource();
if (component.getCaretPosition() > prefixLength) {
deletePrevious.actionPerformed(null);
}
}
}
public static void main(String args[]) throws Exception {
JTextField textField = new JTextField(" $ ", 20);
textField.setNavigationFilter(new NavigationFilterPrefixWithBackspace(textField.getDocument().getLength(), textField));
JFrame frame = new JFrame("Navigation Filter Example");
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.getContentPane().add(textField);
frame.pack();
frame.setLocationRelativeTo(null);
frame.setVisible(true);
}
}
我建議使用OverlayLayout(JLabel的超過JTextField中),在JTextField中改變插圖(輸入區域)進行的JLabel區域,否則在JTextField中任何格式使代碼和建議,在此線程相當無用,並與奇怪的輸出到Swing GUI
eg
JTextField.setHorizontalAlignment(JTextField.RIGHT);
編輯
把JLabel的&的JTextField到JPanel的,很簡單,無副作用內置FlowLayout中的JPanel的
需要
變化調用revalidate()和重繪()的情況下,JLabel的文本改變
import java.awt.BorderLayout;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.JTextField;
import javax.swing.SwingUtilities;
public class NavigationFilterBias {
private JFrame frame = new JFrame("Navigation Filter Example");
private JPanel panel = new JPanel();
private JLabel label = new JLabel(" $ ");
private JTextField textField = new JTextField();
public NavigationFilterBias() {
panel.setBorder(textField.getBorder());
panel.setBackground(textField.getBackground());
panel.setLayout(new BorderLayout());
panel.add(label,BorderLayout.WEST);
textField.setBorder(null);
panel.add(textField,BorderLayout.CENTER);
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.getContentPane().add(panel);
frame.pack();
frame.setLocationRelativeTo(null);
frame.setVisible(true);
}
public static void main(String args[]) throws Exception {
SwingUtilities.invokeLater(new Runnable() {
@Override
public void run() {
NavigationFilterBias exam = new NavigationFilterBias();
}
});
}
}
看看DocumentFilter
。它應該允許你定義一個「受保護的」文本區域。
替代解決方案:
1.將$ symbole JTextField中
2.拆下美元symbole當JTextField中獲得焦點
3。讓用戶修改全文
4.當他做打字(see here)添加$ symbole回
但它會比較容易的方式來下一個加標籤的JTextField的
您可以簡單地用一個DocumentFilter
:
import java.awt.FlowLayout;
import javax.swing.JFrame;
import javax.swing.JTextField;
import javax.swing.SwingUtilities;
import javax.swing.text.AbstractDocument;
import javax.swing.text.AttributeSet;
import javax.swing.text.BadLocationException;
import javax.swing.text.DocumentFilter;
public class TestDocumentFilter {
private static final String TEXT_NOT_TO_TOUCH = "You can't touch this!";
private void initUI() {
JFrame frame = new JFrame(TestDocumentFilter.class.getSimpleName());
frame.setLayout(new FlowLayout());
final JTextField textfield = new JTextField(50);
textfield.setText(TEXT_NOT_TO_TOUCH);
((AbstractDocument) textfield.getDocument()).setDocumentFilter(new DocumentFilter() {
@Override
public void insertString(FilterBypass fb, int offset, String string, AttributeSet attr) throws BadLocationException {
if (offset < TEXT_NOT_TO_TOUCH.length()) {
return;
}
super.insertString(fb, offset, string, attr);
}
@Override
public void replace(FilterBypass fb, int offset, int length, String text, AttributeSet attrs) throws BadLocationException {
if (offset < TEXT_NOT_TO_TOUCH.length()) {
length = Math.max(0, length - TEXT_NOT_TO_TOUCH.length());
offset = TEXT_NOT_TO_TOUCH.length();
}
super.replace(fb, offset, length, text, attrs);
}
@Override
public void remove(FilterBypass fb, int offset, int length) throws BadLocationException {
if (offset < TEXT_NOT_TO_TOUCH.length()) {
length = Math.max(0, length + offset - TEXT_NOT_TO_TOUCH.length());
offset = TEXT_NOT_TO_TOUCH.length();
}
if (length > 0) {
super.remove(fb, offset, length);
}
}
});
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.add(textfield);
frame.pack();
frame.setLocationRelativeTo(null);
frame.setVisible(true);
}
public static void main(String[] args) {
SwingUtilities.invokeLater(new Runnable() {
@Override
public void run() {
new TestDocumentFilter().initUI();
}
});
}
}
這真是太神奇了,對於Java來說,儘管代碼可能長達100行,但使用單詞'simply'確實很好。 – 2013-04-30 08:16:55
驚人+ 1vote up – 2013-04-30 08:21:21
其實,我正在編輯一個已經存在的代碼。因此,長時間插入代碼可能有點冒險。有沒有像使用方法或其他方法的簡單解決方案? – sanjeeda 2013-04-30 08:23:43
雖然我相信的DocumentFilter是合乎邏輯的和通用的解決方案,在這裏很短的解決方案。它只是使JTextField具有一個內部左邊距,其中寫入了固定文本。
public class PrefixTextField extends JTextField {
private String prefix;
private JLabel label;
public PrefixTextField(String prefix) {
this.prefix = prefix;
label = new JLabel(prefix + '\u00a0');
}
@Override
protected void paintComponent(Graphics g) {
int w = SwingUtilities.computeStringWidth(
getFontMetrics(getFont()), prefix);
setMargin(new Insets(3, 3 + w, 3, 3));
super.paintComponent(g);
SwingUtilities.paintComponent(g, label, this.getParent(),
2 + 3, 0, getWidth(), getHeight());
}
}
調用'setMargin(new Insets(3,3 + w,3,3));'paintComponent'內'是非常危險的。你應該在繪畫機制之外調用它。 – 2013-04-30 09:47:52
- 1. Android中的編輯文本可以讓用戶不編輯其第一行
- 2. 自定義javax.swing.JFileChooser以包含其他JTextField
- 3. 可以sed插入帶有換行符的文本到其他文本中嗎?
- 4. 不能將以下文本添加到數據庫,但可以與其他文本一起使用
- 5. 我們可以在其中添加書籤的文本編輯器
- 6. 在文本中編輯部分文本而不會丟失其他行
- 7. Xtragrid一列可編輯其他不是
- 8. 與其他文本
- 9. 與其他文本
- 10. 其他文本框
- 11. CSS - 垂直對齊文本,其中文本可以是多行
- 12. Jquery從其他文本框中追加文本在相同的Mvc視圖
- 13. 其他可編寫腳本的編輯器?
- 14. sweet.js宏可以定義其他宏嗎?
- 15. 在Node.JS中加載EUC-JP和其他日文文本編碼
- 16. 如何在不編輯其他行的情況下編輯文本文件(cmd)
- 17. 如何從iOS中的其他應用程序編輯文本
- 18. 什麼是PyQt4中的理想小部件,我們可以在其中添加文本,但在文本填充後無法對其進行編輯?
- 19. ApplicationRessource.properties文件是否可以位於其他本地文件中,而不是EN
- 20. 向記事本中的其他行添加指定文本++
- 21. 如何隱藏編輯文本中的文本,但仍然使用其功能
- 22. 如何將文本從編輯文本框發送到其他應用程序?
- 23. 文本文件可以放在Java項目中的其他資源中嗎?
- 24. 我可以將其他參數追加到oauth url嗎?
- 25. 編輯其中的列表視圖編輯文本
- 26. 啓用一個文本框,並使其可編輯
- 27. 編輯文本及其光標位置?
- 28. 從其他類中追加到JTextArea
- 29. 可以@required腳本與Greasemonkey中的其他腳本衝突嗎?
- 30. Index.php不適用於VPS,但其他文件可以做
爲什麼不把一個標籤與文本字段前不可編輯的文本,如[這個答案]看到(http://stackoverflow.com/a/16271173/418556)? – 2013-04-30 08:03:17
告訴我,如果只想使用JTextfield? – 2013-04-30 08:07:12
是的,我只需要使用JTextField – sanjeeda 2013-04-30 08:11:33