Swing中JTextArea组件的setWrapStyleWord方法

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Swing中JTextArea组件的setWrapStyleWord方法相关的知识,希望对你有一定的参考价值。

JTextArea组件的setWrapStyleWord方法与setLineWrap方法有什么区别啊?
虚心求教哈~谢谢
我的API是这么说的:void setWrapStyleWord(boolean word)
如果word是true,超长的行会在子边框处换行。如果为false,超长的行被截断而不考虑字边框
请问什么是字边框啊?我知道setLineWrap一定是在视图上的换行也试过了(确实是换行),但是setWrapStyleWord没反应不知道为什么,想要个小例子最好

  JTextArea的构造函数和JTextField及JPasswordField的构造函数是相同雷同,而JTextArea多了一个字段的参数
值是因为JTextArea是二维的输入组件,在构造时不仅要设置字段长度也要设置行数。我们来看下面这个范例:
import java.awt.*;
import java.awt.event.*;
import javax.swing.*;

public class JTextArea1
public static void main(String[] args)
JFrame f=new JFrame("JTextArea1");
Container contentPane=f.getContentPane();
contentPane.setLayout(new BorderLayout());

JPanel p1=new JPanel();
p1.setLayout(new GridBagLayout());
GridBagConstraints gbc=new GridBagConstraints();
gbc.anchor=GridBagConstraints.WEST;
gbc.insets=new Insets(2,2,2,2);

p1.setBorder(BorderFactory.createTitledBorder("构造一般的JTextArea"));
JLabel l1=new JLabel("一:");
JLabel l2=new JLabel("二:");
JLabel l3=new JLabel("三:");
JLabel l4=new JLabel("四:");

JTextArea t1=new JTextArea();
JTextArea t2=new JTextArea(2,8);
JTextArea t3=new JTextArea("JTextArea3");
JTextArea t4=new JTextArea("JTextArea4",5,10);

t1.setText("JTextArea1");//setText()方法会将原来的内容清除
t2.append("JTextArea2");//append()方法会将设置的字符串接在原来JTextArea内容文字之后.
t4.setLineWrap(true);//设置换行

gbc.gridy=1;
gbc.gridx=0;
p1.add(l1,gbc);
gbc.gridx=1;
p1.add(t1,gbc);
gbc.gridy=2;
gbc.gridx=0;
p1.add(l2,gbc);
gbc.gridx=1;
p1.add(t2,gbc);
gbc.gridy=3;
gbc.gridx=0;
p1.add(l3,gbc);
gbc.gridx=1;
p1.add(t3,gbc);
gbc.gridy=4;
gbc.gridx=0;
p1.add(l4,gbc);
gbc.gridx=1;
p1.add(t4,gbc);
contentPane.add(p1);
f.pack();
f.show();
f.addWindowListener(new WindowAdapter()
public void windowClosing(WindowEvent e)
System.exit(0);

);


  在JTextArea中可以使用setTabSize()方法设置[Tab]键的跳离距离,或是setFont()方法设置字体。可以使用JScrollPane使JTextArea具备滚动的能力,或是搭配setLineWrap()方法就能让文字自动换行。JTextArea还提供一个setWrapStyleWord()方法,可以让换行的时候不会造成断字的现象,这在Word或使用OutLook写信时都可以看到这个效果。
  例如,在行尾中输入“自动换行”四个字,但此行最多只能在容纳两个字,因此JTextArea会将此四个字均移到下一行,不会造成“自动”在上行,"换行"在下行的情形。
参考技术A setLineWrap:设置在行过长的时候是否要自动换行。
setWrapStyleWord:设置在单词过长的时候是否要把长单词移到下一行。
参考技术B api上说的很清楚吧

一个是句子换行
一个是单词换行
不一样
word - 指示是否应该使用单词边界来换行本回答被提问者和网友采纳

Swing PropertyChangeSupport 动态更新 JTextArea

【中文标题】Swing PropertyChangeSupport 动态更新 JTextArea【英文标题】:SwingPropertyChangeSupport to dynamically update JTextArea 【发布时间】:2012-08-03 08:49:30 【问题描述】:

我正在尝试建立关于 SwingPropertyChangeSupport 问题的答案

我正在尝试修改此处给出的代码,这是非常有用的 Hovercraft Full Of Eels 的回答: WindowListener does not work as expected,允许在通过输入对话框输入更改时更新显示的数组。

阵列更新正常,但未在 GUI 中刷新。我希望有人能告诉我哪里出错了。

代码如下:

import java.awt.BorderLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.FocusListener;
import java.beans.PropertyChangeEvent;
import java.beans.PropertyChangeListener;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JOptionPane;
import javax.swing.JPanel;
import javax.swing.JTextArea;
import javax.swing.event.SwingPropertyChangeSupport;

public class Main 
public static void main(String[] arg) 
    GuiForUpdate display = new GuiForUpdate();
    display.setVisible(true);



class GuiForUpdate extends JFrame implements ActionListener 

/**
 * 
 */
private static final long serialVersionUID = 1L;
private FocusListener focusListener;
private String mList;
private JButton changeArrayButton;
private JTextArea codeIn, displayOutput;
private int arrayIndex;
private JPanel displayPanel;
private ArrayForUpdating arrayForUpdate = new ArrayForUpdating();

public GuiForUpdate() 
    setSize(224, 180);
    layoutLeft();
    layoutDisplay();
    layoutBottom();


/**
 * adds a display area for array
 */
public void layoutDisplay() 
    displayPanel = new JPanel();
    add(displayPanel, BorderLayout.CENTER);
    displayOutput = new JTextArea();
    displayPanel.add(displayOutput);
    displayOutput.addFocusListener(focusListener);

    mList = arrayForUpdate.getBoundProperty();

    arrayForUpdate.addPropertyChangeListener(new PropertyChangeListener() 

        @Override
        public void propertyChange(PropertyChangeEvent pcEvt) 
            if (pcEvt.getPropertyName().equals(
                    ArrayForUpdating.BOUND_PROPERTY)) 
                mList = (pcEvt.getNewValue().toString());
            
        
    );

    displayOutput.setText(mList);


/**
 * adds left hand side elements to left of GUI
 */
public void layoutLeft() 
    JPanel left = new JPanel();
    add(left, BorderLayout.WEST);
    codeIn = new JTextArea(2, 2);
    left.add(codeIn);
    codeIn.addFocusListener(focusListener);


/**
 * adds bottom elements to bottom of GUI
 */
public void layoutBottom() 
    JPanel bottom = new JPanel();
    changeArrayButton = new JButton("Modify array");
    changeArrayButton.addActionListener(this);
    bottom.add(changeArrayButton);
    add(bottom, BorderLayout.SOUTH);


/**
 * Process button clicks
 */
public void actionPerformed(ActionEvent ae) 

    if (ae.getSource() == changeArrayButton) 

        // first check if any code entered
        if (codeIn.getText().trim().length() != 0) 

            // call modifyMemory() method
            modifyArray();

         else
            JOptionPane.showMessageDialog(null,
                    "Please enter something first.");
    


/**
 * method to process modify array
 */
public void modifyArray() 

    // show dialog to retrieve entered address
    String addressToModify = (String) JOptionPane
            .showInputDialog("At which location?");

    // confirm if a string was entered
    if ((addressToModify != null) && (addressToModify.length() > 0)) 

        // convert to integer if decimal address entered
        arrayIndex = Integer.parseInt(addressToModify);
    
    // pass as integer
    processInput(arrayIndex);


public void processInput(int a) 

    String newValue = codeIn.getText();
    arrayForUpdate.instructionsIn(newValue, a);



class ArrayForUpdating 

public static final String BOUND_PROPERTY = "bound property";
private String boundProperty = "";

private SwingPropertyChangeSupport spcSupport = new SwingPropertyChangeSupport(
        this);
private StringBuilder mList;
private int[] myArray;

public ArrayForUpdating() 

    myArray = new int[5];
    for (int i = 0; i < myArray.length; i++) 
        myArray[i] = 0;
    
    setArrayyDisplayString();


/** 
 * method to create formatted string of array
 */
public void setArrayyDisplayString() 

    // create StringBuilder for display in memory tab
    mList = new StringBuilder();
    for (int i = 0; i < myArray.length; i++) 

        mList.append(String.format("%10s %02d %10s %02d", "Pos:   ", i,
                "Value:  ", myArray[i]));
        mList.append("\n");
    
    setBoundProperty(mList.toString());


/**
 * This method takes in a string passed through from the GUI
 */
public void instructionsIn(String codeIn, int loc) 

    String code = codeIn.trim();
    int oc = Integer.parseInt(code);

    // add the data to the array
    setArrayData(loc, oc);
    loc++;


/**   
 * method to add data to the array
 */
public void setArrayData(int a, int memData) 
    myArray[a] = memData;

    // print array to console for checking
    for (int i = 0; i < myArray.length; i++) 
        System.out.println("location: " + i + " value: " + myArray[i]);
    
    setArrayyDisplayString();


public SwingPropertyChangeSupport getSpcSupport() 
    return spcSupport;


public void setSpcSupport(SwingPropertyChangeSupport spcSupport) 
    this.spcSupport = spcSupport;


public String getBoundProperty() 
    return boundProperty;


public void setBoundProperty(String boundProperty) 
        String oldValue = this.boundProperty;
        System.out.println("old = " + oldValue);
        String newValue = boundProperty;
        System.out.println("new = " + newValue);
        this.boundProperty = newValue;
        spcSupport.firePropertyChange(BOUND_PROPERTY, oldValue, newValue);
    

    public void addPropertyChangeListener(PropertyChangeListener listener) 
    spcSupport.addPropertyChangeListener(listener);
    

-编辑- 希望消除编译错误。

【问题讨论】:

请编辑您的问题以包含一个 sscce 来展示您描述的问题。有相关的例子here和here。 抱歉,我已尝试对其进行编辑以使其更简单。 没问题,但是如果你的例子是完整的,你会得到更好的结果,就像引用的那样。 我刚刚添加了 Main 类,这就是现在的全部内容。 您的代码充满了编译错误,因此很难为您提供帮助。考虑重构您的代码,使其符合 [sscce](http//sscce.org) 规范,并且请仅发布经过测试的有效代码。 【参考方案1】:

代码看起来或多或少是正确的(即我找不到任何明显的错误)。您应该尝试在调试器中运行它,并在调试代码时遇到问题时提出一个新问题。

【讨论】:

我试过了,在“propertyChange”方法处设置了一个断点,但它似乎从未被调用过。不知道为什么,但谢谢。 setBoundProperty 中的firePropertyChange 上设置断点并单步执行其背后的代码。 嗯。该数组似乎没有在该方法中更新。还不知道为什么。谢谢。 如果属性的新旧值相等,则不会触发任何事件。 对不起,我的错误。新旧似乎确实不同。【参考方案2】:

这是一个在无模式对话框中使用ObservedPanel 的完整示例。

public class PropertyChangeDialog extends JPanel 

    private JLabel label = new JLabel("null", JLabel.CENTER);
    private ObservedPanel observed = new ObservedPanel();

    public PropertyChangeDialog() 
        this.setBorder(BorderFactory.createTitledBorder("Observer"));
        this.add(label);
        observed.addPropertyChangeListener(new PropertyChangeListener() 

            @Override
            public void propertyChange(PropertyChangeEvent e) 
                if (e.getPropertyName().equals(ObservedPanel.PHYSICIST)) 
                    String value = e.getNewValue().toString();
                    label.setText(value);
                
            
        );
    

    private void display() 
        JFrame f = new JFrame("PropertyChangeDialog");
        f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        f.add(this);
        f.pack();
        f.setLocationByPlatform(true);
        f.setVisible(true);
        JDialog dialog = new JDialog(f);
        dialog.setDefaultCloseOperation(JDialog.DISPOSE_ON_CLOSE);
        dialog.add(observed);
        dialog.pack();
        dialog.setLocationRelativeTo(null);
        dialog.setVisible(true);
    

    public static void main(String[] args) 
        EventQueue.invokeLater(new Runnable() 

            @Override
            public void run() 
                new PropertyChangeDialog().display();
            
        );
    

【讨论】:

谢谢,请原谅我的无知,但什么是“ObservedPanel”?我的 IDE 抱怨它无法解析为类型。 对,这是指向另一个 SO 答案的链接。 现在知道了,谢谢。我仍然没有更清楚,但会继续修补。 @Robert 我推断您正在使用 netbeans GUI 构建器,又名 matisse?如果是这样,那么“ObservedPanel”只是 JPanel 的扩展。请注意,PropertyChangeDialog extends JPanel 这正是 Netbeans 做事的方式。这允许您在设计视图中将这些类复制/粘贴到彼此中。编译完这些类后,切换到设计视图并复制您想要的类,粘贴到您想要的位置。 @Thufir:PropertyChangeDialogObservedPanel 都不使用 Matisse GUI 编辑器。对不起,如果我错过了什么。【参考方案3】:

当我将displayOutput.setText(mList) 放在propertyChange 方法中时,它起作用了:

@Override
public void propertyChange(PropertyChangeEvent pcEvt) 
    if (pcEvt.getPropertyName().equals(
        ArrayForUpdating.BOUND_PROPERTY)) 
        mList = (pcEvt.getNewValue().toString());
        displayOutput.setText(mList);
    

感谢大家的帮助,尤其是您的耐心。

【讨论】:

以上是关于Swing中JTextArea组件的setWrapStyleWord方法的主要内容,如果未能解决你的问题,请参考以下文章

Swing014——JTextArea:文本域组件

Java:JTextArea类

java的JTextArea 和 TextArea 到底有啥根本的区别。

JTextArea 问题

swing学习

java中如何在JTextArea中添加图片?