SwingPropertyChangeSupportに関する質問への回答に基づいて構築しようとしています
非常に役立つHovercraftFullOf 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);
}
}
-編集-うまくいけば、コンパイルエラーを削除しました。