Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/360.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 当用户按Enter键时禁用JTextArea调整大小_Java_Swing_Layout Manager_Jtextarea_Miglayout - Fatal编程技术网

Java 当用户按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

我有一个JTextArea,我希望用户输入一个人的地址。我知道用户输入的有效地址不会超过5行10列。所以我将其设置为JTextArea 5,10。这样很好用

问题是,当用户持续按enter键5次以上时,文本区域将开始调整大小。我不想将文本区域放在JScrollPane中,因为用户输入的文本不太适合滚动

问题:当用户按enter键时,如何禁用JTextArea的大小调整

这是我的密码:

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证明他们没有使用换行。否则我会解释的。