Java 当用户按Enter键时禁用JTextArea调整大小
我有一个JTextArea,我希望用户输入一个人的地址。我知道用户输入的有效地址不会超过5行10列。所以我将其设置为JTextArea 5,10。这样很好用 问题是,当用户持续按enter键5次以上时,文本区域将开始调整大小。我不想将文本区域放在JScrollPane中,因为用户输入的文本不太适合滚动 问题:当用户按enter键时,如何禁用JTextArea的大小调整 这是我的密码:Java 当用户按Enter键时禁用JTextArea调整大小,java,swing,layout-manager,jtextarea,miglayout,Java,Swing,Layout Manager,Jtextarea,Miglayout,我有一个JTextArea,我希望用户输入一个人的地址。我知道用户输入的有效地址不会超过5行10列。所以我将其设置为JTextArea 5,10。这样很好用 问题是,当用户持续按enter键5次以上时,文本区域将开始调整大小。我不想将文本区域放在JScrollPane中,因为用户输入的文本不太适合滚动 问题:当用户按enter键时,如何禁用JTextArea的大小调整 这是我的密码: public class JTextAreaDemo { private JFrame frame; JTe
public class JTextAreaDemo {
private JFrame frame;
JTextAreaDemo(){
frame= new JFrame();
frame.setSize(300, 300);
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.setLayout(new net.miginfocom.swing.MigLayout());
frame.setVisible(true);
frame.setLocationRelativeTo(null);
JLabel label=new JLabel("Address :");
JTextArea address= new JTextArea(5,20);
frame.add(label,"cell 0 0");
frame.add(address, "cell 1 0");
}
public static void main(String [] args){
SwingUtilities.invokeLater(new Runnable(){
@Override
public void run() {
new JTextAreaDemo();
}});
}
}
使用SetPreferredSizeNewDimensionX,Y,这样JTextArea将保留您设置的尺寸,并且不会移动!
您仍然需要将JTextArea放入JScrollPane中。使用setPreferredSizenew DimensionX,Y,这样JTextArea将保留您设置的维度,并且不会移动!
您仍然需要将JTextArea放入JScrollPane中。我建议您应该使用InputVerifier,它将跟踪在JTextArea中输入的输入数量,当输入数量达到4时,它应该忽略输入
正如您在评论文档中指出的,Listener也可以这样做,KeyListener也可以这样做。我建议您使用InputVerifier,它将跟踪在JTextArea中输入的输入数,当输入数达到4时,它应该忽略输入数 正如您在评论文档中指出的,Listener也可以这样做,KeyListener也可以这样做。您可以尝试使用,例如:
import javax.swing.JFrame;
import javax.swing.JScrollPane;
import javax.swing.JTextArea;
import javax.swing.text.AbstractDocument;
import javax.swing.text.AttributeSet;
import javax.swing.text.BadLocationException;
import javax.swing.text.DocumentFilter;
public class TestFrame extends JFrame {
public static void main(String... s) {
new TestFrame();
}
private JTextArea area;
public TestFrame() {
init();
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
pack();
setLocationRelativeTo(null);
setVisible(true);
}
private void init() {
area = new JTextArea();
((AbstractDocument)area.getDocument()).setDocumentFilter(getFilter(5));
add(new JScrollPane(area));
}
private DocumentFilter getFilter(final int lineCount) {
return new DocumentFilter(){
@Override
public void replace(FilterBypass fb, int offset, int length,
String text, AttributeSet attrs)
throws BadLocationException {
if(area.getLineCount()<=lineCount && area.getLineOfOffset(area.getCaretPosition())<lineCount)
if(text.contains("\n") && area.getLineCount()<lineCount)
super.replace(fb, offset, length, text, attrs);
else if(!text.contains("\n"))
super.replace(fb, offset, length, text, attrs);
}
};
}
}
您可以尝试使用,例如:
import javax.swing.JFrame;
import javax.swing.JScrollPane;
import javax.swing.JTextArea;
import javax.swing.text.AbstractDocument;
import javax.swing.text.AttributeSet;
import javax.swing.text.BadLocationException;
import javax.swing.text.DocumentFilter;
public class TestFrame extends JFrame {
public static void main(String... s) {
new TestFrame();
}
private JTextArea area;
public TestFrame() {
init();
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
pack();
setLocationRelativeTo(null);
setVisible(true);
}
private void init() {
area = new JTextArea();
((AbstractDocument)area.getDocument()).setDocumentFilter(getFilter(5));
add(new JScrollPane(area));
}
private DocumentFilter getFilter(final int lineCount) {
return new DocumentFilter(){
@Override
public void replace(FilterBypass fb, int offset, int length,
String text, AttributeSet attrs)
throws BadLocationException {
if(area.getLineCount()<=lineCount && area.getLineOfOffset(area.getCaretPosition())<lineCount)
if(text.contains("\n") && area.getLineCount()<lineCount)
super.replace(fb, offset, length, text, attrs);
else if(!text.contains("\n"))
super.replace(fb, offset, length, text, attrs);
}
};
}
}
如前所述,可以使用DocumentFilter。我发布这个答案是因为它提供了优雅的解决方案
public class JTextAreaDemo {
private JFrame frame = new JFrame();
JTextArea address = new JTextArea(5, 20);
JTextAreaDemo() {
JLabel label = new JLabel("Address :");
frame.getContentPane().add(label, BorderLayout.CENTER);
frame.getContentPane().add(address, BorderLayout.SOUTH);
((PlainDocument) address.getDocument()).setDocumentFilter(new LineFilter());
frame.pack();
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.setLocationRelativeTo(null);
frame.setVisible(true);
}
class LineFilter extends DocumentFilter {
@Override
public void insertString(FilterBypass fb, int offset, String string, AttributeSet attr) throws BadLocationException {
if (address.getLineCount() < 5 || !string.contains("\n"))
super.insertString(fb, offset, string, attr);
}
@Override
public void replace(FilterBypass fb, int offset, int length, String text, AttributeSet attrs) throws BadLocationException {
if (address.getLineCount() < 5 || !text.contains("\n"))
super.replace(fb, offset, length, text, attrs);
}
}
public static void main(String[] args) {
new JTextAreaDemo();
}
}
insertString方法可以使用相同的代码。如前所述,可以使用DocumentFilter。我发布这个答案是因为它提供了优雅的解决方案
public class JTextAreaDemo {
private JFrame frame = new JFrame();
JTextArea address = new JTextArea(5, 20);
JTextAreaDemo() {
JLabel label = new JLabel("Address :");
frame.getContentPane().add(label, BorderLayout.CENTER);
frame.getContentPane().add(address, BorderLayout.SOUTH);
((PlainDocument) address.getDocument()).setDocumentFilter(new LineFilter());
frame.pack();
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.setLocationRelativeTo(null);
frame.setVisible(true);
}
class LineFilter extends DocumentFilter {
@Override
public void insertString(FilterBypass fb, int offset, String string, AttributeSet attr) throws BadLocationException {
if (address.getLineCount() < 5 || !string.contains("\n"))
super.insertString(fb, offset, string, attr);
}
@Override
public void replace(FilterBypass fb, int offset, int length, String text, AttributeSet attrs) throws BadLocationException {
if (address.getLineCount() < 5 || !text.contains("\n"))
super.replace(fb, offset, length, text, attrs);
}
}
public static void main(String[] args) {
new JTextAreaDemo();
}
}
insertString方法可以使用相同的代码。将其放在JScrollPane中,它正在调整大小,因为它的首选大小正在改变。您的意思是说,当用户第五次按enter按钮时,它会被空格替换或被忽略吗?@MadProgrammer很好,这是可行的。首先,当用户按enter键时,如何避免光标移动到第六行/第六行?@Blip Yes,当用户第六次按enter键时,它不应该做任何事情。它不应该移动到第六行/行。使用文档过滤器将其放在JScrollPane中,它正在调整大小,因为它的首选大小正在改变。您的意思是说,当用户第五次按enter按钮时,它将被替换为空格或被忽略吗?@MadProgrammer好的,这是可行的。首先,当用户按enter键时,如何避免光标移动到第六行/第六行?@Blip Yes,当用户第六次按enter键时,它不应该做任何事情。它不应移动到第六行/行。请使用DocumentFilterWell,并使用JScrollPane设置首选大小。单独设置首选大小是不行的,无论如何,谢谢你的提示。@Giovanrich不客气,我编辑了我对你答案的回答,完成后别忘了关闭你的问题。JTextArea和setPreferredSize,这是关于JScrollPane内JTextArea的换行/换行,否则-我不会忘记的。我如何避免移动到第六列?请参阅@Blip second commentI,我将避免使用类似的方法,因为您无法控制与字体和字体渲染相关的许多特性,在使用JScrollPane的同时设置首选大小是可行的。单独设置首选大小是不行的,无论如何,谢谢你的提示。@Giovanrich不客气,我编辑了我对你答案的回答,完成后别忘了关闭你的问题。JTextArea和setPreferredSize,这是关于JScrollPane内JTextArea的换行/换行,否则-我不会忘记的。我如何避免移动到第六列?请参阅@Blip second commentI,我会避免使用类似的内容,因为您无法控制与字体相关的许多特性,字体渲染不会输入仅在焦点丢失时收到通知?例如,当字段设置为换行时,这不会阻止用户用文本溢出字段example@MadProgrammerDocumentListener怎么样这不是为了保存跟踪的目的吗?@MadProgrammer我真的忽略了这一点,我正在更正我的答案以适应这一点。DocumentFilter可能是首选,那么您只需拒绝您不想要的输入,而不会导致突变错误InputVerifer不只是在焦点丢失时才得到通知吗?例如,当字段设置为换行时,这不会阻止用户用文本溢出字段example@MadProgrammerDocumentListener怎么样“这不就是追踪的目的吗?”我真的忽略了这一点,是的,这就是tr
ue和我正在更正我的答案,以适应这一点。DocumentFilter可能是首选,然后您只需拒绝您不想要的输入,而不会导致突变错误。好吧,这实际上就是我考虑限制行数/行数的原因。非常感谢。作为一般经验法则,过滤器不应该知道文本组件,它有点违背了目的。@是的,但它只是一个示例。在这种情况下,我们需要从文档中计算行号的方法。关于换行也是一个很好的发现。事实上,这正是我想要考虑限制行数/行数的原因。非常感谢。一般来说,过滤器不应该知道文本组件,这有点违背了目的。@MadProgrammer是的,但它只是一个例子。在这种情况下,我们需要从文档中计算行号的方法。关于换行也是一个很好的问题。一般的经验法则是,过滤器不应该知道正在使用它的UI/文本组件。假设文本区域没有启用换行功能,那么这将是一件相对容易的事情…如果没有…@MadProgrammer我完全同意经验法则,尽管当内容文档端影响视觉UI组件端时,我认为这是有价值的。我添加了一个经验法则友好的解决方案。在换行的情况下,它对您没有帮助。检查@alex2410,OP证明他们没有使用换行。一般来说,过滤器不应该知道使用它的UI/text组件。假设文本区域没有启用换行功能,那么这将是一件相对容易的事情…如果没有…@MadProgrammer我完全同意经验法则,尽管当内容文档端影响视觉UI组件端时,我认为这是有价值的。我添加了一个经验法则友好的解决方案。在换行的情况下,它对您没有帮助。检查@alex2410,OP证明他们没有使用换行。否则我会解释的。