SwingPropertyChangeSupport для динамического обновления JTextArea
Я пытаюсь опираться на ответ на вопрос, касающийся SwingPropertyChangeSupport
Я пытаюсь изменить код, приведенный здесь в ответе очень полезным, Hovercraft Full Of Eels: WindowListener не работает должным образом, чтобы позволить отображаемому массиву обновляться, когда изменения вводятся через диалог ввода.
Массив обновлен нормально, но не обновляется в графическом интерфейсе. Я надеялся, что кто-то сможет сказать мне, где я ошибся.
вот код:
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- Надеюсь, удалены ошибки компиляции.
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);
}
}
Спасибо всем за вашу помощь и особенно ваше терпение.
Вот полный пример, который использует 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();
}
});
}
}
Код выглядит более или менее корректно (т.е. я не смог найти никаких очевидных ошибок). Вы должны попытаться запустить его в отладчике и задать новый вопрос, когда вы застряли при отладке кода.