当前位置: 首页 > 知识库问答 >
问题:

动态更新jTextPropertyChange区域

梁丘伟
2023-03-14

我试图建立在一个问题的答案关于SwingProperty tyChangeSupport

我试图修改这里给出的代码,这是一个非常有用的、满是鳗鱼的气垫船的回答: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);
    }
}

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

共有3个答案

汪正雅
2023-03-14

当我把显示输出。setText(mList)propertyChange方法中,它起到了作用:

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

感谢大家的帮助,尤其是你们的耐心。

邢修明
2023-03-14

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

周和安
2023-03-14

下面是一个在无模式对话框中使用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();
            }
        });
    }
}
 类似资料:
  • 区分状态和更新 在Subversion,我们已经设法抹去cvs status和cvs update之间的混乱。 cvs status命令有两个目的:第一,显示用户在工作拷贝的所有本地修改,第二,显示给用户哪些文件是最新的。很不幸,因为CVS难以阅读的状态输出,许多CVS用户并没有充分利用这个命令的好处。相反,他们慢慢习惯运行cvs update或cvs -n update来快速查看区别,如果用户忘

  • 问题内容: 我基本上有一个具有多个选项卡的MainActivity。每个选项卡都是一个ShowListFragment,它扩展了Fragment。现在,每个选项卡都包含我从数据库中获取的数据。我有一个MOVE按钮,可将数据从每个片段的一个选项卡移动到另一个选项卡: 片段不会直接更新,而是在选项卡之间滑动了几下(恰好3次)。单击按钮后如何强制片段立即更新?我不想通过ViewPager中的onPage

  • 我希望能够动态更新我的Swing GUI的LookAnd感到属性。在这种情况下,我有一个简单的Swing/Awt游戏,运行的最初是Nimbus。在启动后的不同时间点,我想更改(让我们说)一个细节:我的应用程序的背景颜色。 我可以通过这样做来改变背景颜色: 这“有效”,因为应用程序的背景颜色会正确更改并且程序不会崩溃。但是在命令行上我收到错误: 显然,有些东西是空的,但我不知道它是什么,也不知道如何

  • V1.1.1新增 <?php $data=array("URL_HTML_SUFFIX"=>".html"); $result=sp_set_dynamic_config($data); ?>

  • 计算属性检测对属性所做的更改,并在使用set()方法调用它们时动态更新计算属性。 语法 (Syntax) ClassName.set('VariableName', 'UpdatedValue'); 例子 (Example) 以下示例显示了对属性进行更改时动态更新的值 - import Ember from 'ember'; export default function() { var

  • 向最终用户提供一份货币清单。他们可以在任何时候选择他们感兴趣的一个。因此,需要根据所选货币更改中使用的区域设置。这似乎不是微不足道的。 是否有一种方法可以根据在运行时动态提供的货币代码来确定区域设置?