SwingPropertyChangeSupport动态更新JTextArea

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

我试图在非常有用的Hovercraft Full Of Eels的答案中修改这里给出的代码: WindowListener不能按预期工作 ,以允许在通过输入对话框输入更改时更新显示的数组。

数组已更新,但未在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); } } 

-EDIT-希望删除编译错误。

这是一个在无模式对话框中使用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(); } }); } } 

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

当我将displayOutput.setText(mList)放在propertyChange方法中时,它有效:

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

感谢大家的帮助,特别是耐心等待。