我正在尝试建立有关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);
}
}
-编辑-
希望删除编译错误.
解决方法:
这是一个在无模式对话框中使用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();
}
});
}
}