ホームページ  >  記事  >  Java  >  SwingPropertyChangeSupport を使用して配列を変更した後、JTextArea が更新されないのはなぜですか?

SwingPropertyChangeSupport を使用して配列を変更した後、JTextArea が更新されないのはなぜですか?

DDD
DDDオリジナル
2024-11-05 21:57:02141ブラウズ

Why Does My JTextArea Not Update After Modifying an Array Using SwingPropertyChangeSupport?

JTextArea を動的に更新する SwingPropertyChangeSupport

SwingPropertyChangeSupport は、オブジェクトのプロパティの変更を監視するために使用できるクラスです。これにより、プロパティが変更されたときに他のオブジェクトに通知できるようになり、それに応じて GUI を更新するのに役立ちます。

この例では、SwingPropertyChangeSupport を使用して、JTextArea に表示される配列を変更時に更新できるようにしています。入力ダイアログを介して入力されます。配列は正常に更新されましたが、GUI は更新されません。

変更されたコードは次のとおりです:

<code class="java">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());
                updateDisplay();
            }
        }
    });

    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) &amp;&amp; (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);
}

public void updateDisplay() {
    displayOutput.setText(mList);
}
}

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();</code>

以上がSwingPropertyChangeSupport を使用して配列を変更した後、JTextArea が更新されないのはなぜですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。