java - 使用复选框在文本区域包装文本

标签 java multithreading swing word-wrap jtextarea

我在 Swing 中创建了一个用于编辑数据的对话框。它包含一个 JTextArea、两个 JButton 实例(OKCancel)和一个 JCheckBox(换行)。我想要做的是在用户单击复选框时将文本区域中的文本换行。我最初使用 setLineWrap(true) 将文本换行。

我正在使用以下代码:

    Runnable r1=new Runnable() {
        @Override
        public void run() {
            System.out.println("True");
            keyField.setLineWrap(true);
            keyField.requestFocus();
        }
    };

    Runnable r2=new Runnable() {
            @Override
            public void run() {
               System.out.println("FALSE");
               keyField.setLineWrap(false);
               keyField.repaint();
               keyField.requestFocus();
            }
     };
    final Thread t1=new Thread(r1) ;
    final Thread t2=new Thread(r2);

    final JCheckBox chkSwing = new JCheckBox("Word Wrap",true);

    chkSwing.addItemListener(
            new ItemListener() {
                @Override
                public void itemStateChanged(ItemEvent e) {
                    //To change body of implemented methods use File | Settings | File Templates.
                    if (e.getStateChange() == ItemEvent.SELECTED) {
                        t1.start();
                    } else if (e.getStateChange() != ItemEvent.SELECTED){
                        t2.start();
                    }
                }
            });

    panel.add(chkSwing);

问题

问题是,一旦我取消选中该复选框,文本就会展开,但再次选中该复选框不会再次对文本进行换行。控制台显示正在调用线程。如何使复选框用于设置/取消设置文本区域的自动换行行为?

最佳答案

这是工作代码。 (有一个可爱的动画屏幕截图,上面有一条评论,强调了几个答案没有指出的东西。)

TextAreaWrapChooser

import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
import java.io.*;

class TextAreaWrapChooser {

    private JTextArea text = new JTextArea(8,30);

    TextAreaWrapChooser() {
        final JScrollPane scroll = new JScrollPane(text);

        JToolBar tb = new JToolBar();

        JCheckBox wrap = new JCheckBox("Line wrap", false);
        tb.add(wrap);
        wrap.addItemListener(new ItemListener() {
            // this method is called on the EDT
            public void itemStateChanged(ItemEvent ie) {
                boolean doWrap = ie.getStateChange() == ItemEvent.SELECTED;
                System.out.println("Wrap text: " + doWrap);
                text.setLineWrap( doWrap );
            }
        });

        // fill the text area
        try {
            File f = new File("TextAreaWrapChooser.java");
            FileReader fr = new FileReader(f);
            text.read( fr, f );
        } catch(Exception weTried) {
        }

        JPanel gui = new JPanel(new BorderLayout(2,2));
        gui.add(tb, BorderLayout.NORTH);
        gui.add(scroll, BorderLayout.CENTER);

        JOptionPane.showMessageDialog(null, gui);
    }

    public static void main(String[] args) {
        // construct/start the GUI on the EDT.
        SwingUtilities.invokeLater(new Runnable() {
            public void run() {
                new TextAreaWrapChooser();
            }
        });
    }
}

关于java - 使用复选框在文本区域包装文本,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10311727/

相关文章:

java - 在编辑 jtable 单元格时如何检测按下的输入?

java - 如何将数据从单独的线程类传递到 Android 中的 Activity

Java 泛型和不兼容类型 : bug in compiler?

java - 方法级别的Spring Profiles?

java - 如何避免多生产者和消费者的饥饿?

java - FutureTask 和 HttpSession 同步

Java Spark : Stack Overflow Error on GroupBy

c# - 线程非常快地获得 100% CPU

java - JTable所有列右对齐

java - 我正在从数据库读取数据到具有自定义 AbstractTableModel 的 jtable