Java Netbeans:按钮事件上的更新文本字段

Java Netbeans:按钮事件上的更新文本字段,java,swing,netbeans,jbutton,jtextfield,Java,Swing,Netbeans,Jbutton,Jtextfield,我试图在netbeans中制作一个基本的角色创建计划器,作为学习Java的一种尝试,所以如果我的问题有点愚蠢,请原谅我 我已经创建了一个文本字段,每当相关统计数据发生变化时,该字段都需要用公式进行更新 在本例中,运气和魅力属性影响易货技能。因此,当我改变这些统计数据时,我需要再次运行公式来更新易货技能 当前,该公式在创建对象时运行,但在更新另一个统计数据时不运行 以下是我当前的(相关)代码: package-AppPackage; 导入javax.swing.JOptionPane; 公共类St

我试图在netbeans中制作一个基本的角色创建计划器,作为学习Java的一种尝试,所以如果我的问题有点愚蠢,请原谅我

我已经创建了一个文本字段,每当相关统计数据发生变化时,该字段都需要用公式进行更新

在本例中,运气和魅力属性影响易货技能。因此,当我改变这些统计数据时,我需要再次运行公式来更新易货技能

当前,该公式在创建对象时运行,但在更新另一个统计数据时不运行

以下是我当前的(相关)代码:

package-AppPackage;
导入javax.swing.JOptionPane;
公共类StartGUI扩展了javax.swing.JFrame{
公共StartGUI(){
初始化组件();
}
@抑制警告(“未选中”)
//                           
私有组件(){
BarterPts=newjavax.swing.JTextField();
Chr=newjavax.swing.JTextField();
ChrPlus=newjavax.swing.JButton();
Luck=newjavax.swing.JTextField();
BarterPts.setEditable(false);
Barterps.setText(“0”);
addActionListener(新java.awt.event.ActionListener(){
public void actionPerformed(java.awt.event.ActionEvent evt){
执行易货交易(evt);
}
});
getContentPane().add(BarterPts,new org.netbeans.lib.awtextra.AbsoluteConstraints(470,110,30,-1));
int a=Integer.parseInt(Chr.getText()),l=Integer.parseInt(Luck.getText()),易货;
易货=(2+(a*2)+(l/2));
setText(String.valueOf(barter));
//添加到魅力属性的加号按钮。
私有void ChrPlusActionPerformed(java.awt.event.ActionEvent evt){
inta=Integer.parseInt(Chr.getText()),i,l=Integer.parseInt(SLeft.getText());
如果(a==10){
//打印错误
JOptionPane.showMessageDialog(null,“魅力值不能超过10.”,“错误”,JOptionPane.Error\u消息);
}
else如果(l==0){
showMessageDialog(null,“您没有剩余的特殊点。”,“错误”,JOptionPane.Error\u消息);
}
否则{
l=--l;
SLeft.setText(String.valueOf(l));
i=++a;
Chr.setText(String.valueOf(i));
}                                       
}
private void BarterpsActionPerformed(java.awt.event.ActionEvent evt){
}       

下面有一些变量声明,但我没有包括它们。

因此,从您最初的问题来看,您似乎希望通过单击按钮来更新文本字段

当前,您的ActionListener已注册到文本字段。相反,您的ActionListener应注册到按钮

ChrPlus.addActionListener(final ActionEvent theEvent) {
     BarterPts.setText(//New text here based off a function);
}

将侦听器注册到按钮将强制按预期进行单击。

作为学习练习,现在可能是学习的好时机。Swing使用MVC的一种形式,更像M-VC,其中视图和控件的绑定比纯MVC实现更紧密

这里的要点是,您希望将模型(数据和规则)从视图(/controller)中分离出来。视图/控制器成为一种可以“操纵”模型的方式,但由于它是分离的,因此您可以更改模型及其工作方式,而无需更改视图

您应该学习的另一个原则是编程到接口、到实现的概念(参见和了解一些初学者)

基本上,这会进一步解耦代码,这意味着代码的某些部分不会对其他部分的状态或其功能做出假设,并允许您更改物理实现(规则),而无需更改一整套代码来适应它

我可能要做的第一件事是创建一个
接口
,它描述了我希望任何人都能从我的角色表中获得的非常基本的操作

public interface CharacterSheet {

    public int getLuck();
    public int getCharisma();
    public int getBarter();

}
因为我特别偏执,我不明白为什么“每个人”都可以在他们想要的时候更改角色表,相反,我通过另一个界面来限制这一点。想想看,一旦角色生成,你就不能更改统计数据,直到稍后某个时候(比如任务完成后),然后你可能想使用一些“经验”规则/算法来分发和更新统计数据,但这就是我;)

好的,现在我们有了一种更新字符表的方法。这个
界面还包括一个,它允许您检测字符表的更改,以便您可以采取适当的操作

现在,我们需要一个实现。通常,我可能会创建一个或多个提供基本/通用功能的
abstract
实现,例如对
PropertyChangeListener
的支持,但在这种情况下,我将直接使用默认实现

public class DefaultCharacterSheet implements MutableCharacterSheet {

    private PropertyChangeSupport propertyChangeSupport;
    private int luck;
    private int charisma;
    private int barter;

    public DefaultCharacterSheet() {
        propertyChangeSupport = new PropertyChangeSupport(this);
    }

    @Override
    public int getLuck() {
        return luck;
    }

    @Override
    public void setLuck(int value) {
        if (luck != value) {
            int old = luck;
            this.luck = value;
            propertyChangeSupport.firePropertyChange("luck", old, luck);
            updateBarter();
        }
    }

    @Override
    public int getCharisma() {
        return charisma;
    }

    @Override
    public void setCharisma(int value) {
        if (charisma != value) {
            int old = charisma;
            this.charisma = value;
            propertyChangeSupport.firePropertyChange("charisma", old, charisma);
            updateBarter();
        }
    }

    protected void updateBarter() {
        int luck = getLuck();
        int charisma = getCharisma();
        int old = barter;
        // Or what ever formula you want to use
        barter = (int) ((luck / 2d) * charisma);
        propertyChangeSupport.firePropertyChange("barter", old, barter);
    }

    @Override
    public int getBarter() {
        return barter;
    }

    @Override
    public void addPropertyChangeListener(PropertyChangeListener listener) {
        propertyChangeSupport.addPropertyChangeListener(listener);
    }

    @Override
    public void removePropertyChangeListener(PropertyChangeListener listener) {
        propertyChangeSupport.removePropertyChangeListener(listener);
    }

}
现在,这可能“看起来”很奇怪。我已经实现了
MutableCharacterSheet
,但是如果我不想让代码修改字符表,会发生什么呢?这就是OO的魔力所在

不应该修改工作表的代码部分应该只支持
字符表
接口,这意味着我可以向他们传递
默认字符表
的实例,但他们只能看到并能够做接口
字符表
允许他们做的事情

现在,我们需要一些方法来向用户显示它,并允许他们与它交互

import java.awt.EventQueue;
import java.awt.GridBagConstraints;
import java.awt.GridBagLayout;
import java.awt.Insets;
import java.beans.PropertyChangeEvent;
import java.beans.PropertyChangeListener;
import java.beans.PropertyChangeSupport;
import java.text.NumberFormat;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.JSpinner;
import javax.swing.JTextField;
import javax.swing.SpinnerNumberModel;
import javax.swing.UIManager;
import javax.swing.UnsupportedLookAndFeelException;
import javax.swing.event.ChangeEvent;
import javax.swing.event.ChangeListener;

public class Test {

    public static void main(String[] args) {
        new Test();
    }

    public Test() {
        EventQueue.invokeLater(new Runnable() {
            @Override
            public void run() {
                try {
                    UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName());
                } catch (ClassNotFoundException | InstantiationException | IllegalAccessException | UnsupportedLookAndFeelException ex) {
                    ex.printStackTrace();
                }

                MutableCharacterSheet characterSheet = new DefaultCharacterSheet();

                JFrame frame = new JFrame("Testing");
                frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
                frame.add(new CharacterSheetPane(characterSheet));
                frame.pack();
                frame.setLocationRelativeTo(null);
                frame.setVisible(true);
            }
        });
    }

    public class CharacterSheetPane extends JPanel {

        private JSpinner luckField;
        private JSpinner charismaField;
        private JTextField barterField;

        private MutableCharacterSheet characterSheet;

        public CharacterSheetPane(MutableCharacterSheet sheet) {

            this.characterSheet = sheet;
            characterSheet.addPropertyChangeListener(new PropertyChangeListener() {
                @Override
                public void propertyChange(PropertyChangeEvent evt) {
                    if ("barter".equals(evt.getPropertyName())) {
                        int value = (int) evt.getNewValue();
                        barterField.setText(NumberFormat.getNumberInstance().format(value));
                    }
                }
            });

            luckField = new JSpinner(new SpinnerNumberModel(0, 0, 10, 1));
            charismaField = new JSpinner(new SpinnerNumberModel(0, 0, 10, 1));
            barterField = new JTextField(5);
            barterField.setEditable(false);

            luckField.addChangeListener(new ChangeListener() {
                @Override
                public void stateChanged(ChangeEvent e) {
                    characterSheet.setLuck((int) luckField.getValue());
                }
            });
            charismaField.addChangeListener(new ChangeListener() {
                @Override
                public void stateChanged(ChangeEvent e) {
                    characterSheet.setCharisma((int) charismaField.getValue());
                }
            });

            setLayout(new GridBagLayout());
            GridBagConstraints gbc = new GridBagConstraints();
            gbc.gridx = 0;
            gbc.gridy = 0;
            gbc.insets = new Insets(2, 2, 2, 2);

            gbc.anchor = GridBagConstraints.EAST;
            add(new JLabel("Luck: "), gbc);
            gbc.anchor = GridBagConstraints.WEST;
            gbc.gridx++;
            add(luckField, gbc);

            gbc.anchor = GridBagConstraints.EAST;
            gbc.gridx = 0;
            gbc.gridy++;
            add(new JLabel("Charisma: "), gbc);
            gbc.anchor = GridBagConstraints.WEST;
            gbc.gridx++;
            add(charismaField, gbc);

            gbc.anchor = GridBagConstraints.EAST;
            gbc.gridx = 0;
            gbc.gridy++;
            add(new JLabel("Barter: "), gbc);
            gbc.anchor = GridBagConstraints.WEST;
            gbc.gridx++;
            add(barterField, gbc);
        }

    }

}
因此,随着luck和charisma字段的更改,我们更新模型,model intern更新
易货
值,这会触发
属性更改事件
,允许我们更新易货字段

这似乎需要很多时间
public class DefaultCharacterSheet implements MutableCharacterSheet {

    private PropertyChangeSupport propertyChangeSupport;
    private int luck;
    private int charisma;
    private int barter;

    public DefaultCharacterSheet() {
        propertyChangeSupport = new PropertyChangeSupport(this);
    }

    @Override
    public int getLuck() {
        return luck;
    }

    @Override
    public void setLuck(int value) {
        if (luck != value) {
            int old = luck;
            this.luck = value;
            propertyChangeSupport.firePropertyChange("luck", old, luck);
            updateBarter();
        }
    }

    @Override
    public int getCharisma() {
        return charisma;
    }

    @Override
    public void setCharisma(int value) {
        if (charisma != value) {
            int old = charisma;
            this.charisma = value;
            propertyChangeSupport.firePropertyChange("charisma", old, charisma);
            updateBarter();
        }
    }

    protected void updateBarter() {
        int luck = getLuck();
        int charisma = getCharisma();
        int old = barter;
        // Or what ever formula you want to use
        barter = (int) ((luck / 2d) * charisma);
        propertyChangeSupport.firePropertyChange("barter", old, barter);
    }

    @Override
    public int getBarter() {
        return barter;
    }

    @Override
    public void addPropertyChangeListener(PropertyChangeListener listener) {
        propertyChangeSupport.addPropertyChangeListener(listener);
    }

    @Override
    public void removePropertyChangeListener(PropertyChangeListener listener) {
        propertyChangeSupport.removePropertyChangeListener(listener);
    }

}
import java.awt.EventQueue;
import java.awt.GridBagConstraints;
import java.awt.GridBagLayout;
import java.awt.Insets;
import java.beans.PropertyChangeEvent;
import java.beans.PropertyChangeListener;
import java.beans.PropertyChangeSupport;
import java.text.NumberFormat;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.JSpinner;
import javax.swing.JTextField;
import javax.swing.SpinnerNumberModel;
import javax.swing.UIManager;
import javax.swing.UnsupportedLookAndFeelException;
import javax.swing.event.ChangeEvent;
import javax.swing.event.ChangeListener;

public class Test {

    public static void main(String[] args) {
        new Test();
    }

    public Test() {
        EventQueue.invokeLater(new Runnable() {
            @Override
            public void run() {
                try {
                    UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName());
                } catch (ClassNotFoundException | InstantiationException | IllegalAccessException | UnsupportedLookAndFeelException ex) {
                    ex.printStackTrace();
                }

                MutableCharacterSheet characterSheet = new DefaultCharacterSheet();

                JFrame frame = new JFrame("Testing");
                frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
                frame.add(new CharacterSheetPane(characterSheet));
                frame.pack();
                frame.setLocationRelativeTo(null);
                frame.setVisible(true);
            }
        });
    }

    public class CharacterSheetPane extends JPanel {

        private JSpinner luckField;
        private JSpinner charismaField;
        private JTextField barterField;

        private MutableCharacterSheet characterSheet;

        public CharacterSheetPane(MutableCharacterSheet sheet) {

            this.characterSheet = sheet;
            characterSheet.addPropertyChangeListener(new PropertyChangeListener() {
                @Override
                public void propertyChange(PropertyChangeEvent evt) {
                    if ("barter".equals(evt.getPropertyName())) {
                        int value = (int) evt.getNewValue();
                        barterField.setText(NumberFormat.getNumberInstance().format(value));
                    }
                }
            });

            luckField = new JSpinner(new SpinnerNumberModel(0, 0, 10, 1));
            charismaField = new JSpinner(new SpinnerNumberModel(0, 0, 10, 1));
            barterField = new JTextField(5);
            barterField.setEditable(false);

            luckField.addChangeListener(new ChangeListener() {
                @Override
                public void stateChanged(ChangeEvent e) {
                    characterSheet.setLuck((int) luckField.getValue());
                }
            });
            charismaField.addChangeListener(new ChangeListener() {
                @Override
                public void stateChanged(ChangeEvent e) {
                    characterSheet.setCharisma((int) charismaField.getValue());
                }
            });

            setLayout(new GridBagLayout());
            GridBagConstraints gbc = new GridBagConstraints();
            gbc.gridx = 0;
            gbc.gridy = 0;
            gbc.insets = new Insets(2, 2, 2, 2);

            gbc.anchor = GridBagConstraints.EAST;
            add(new JLabel("Luck: "), gbc);
            gbc.anchor = GridBagConstraints.WEST;
            gbc.gridx++;
            add(luckField, gbc);

            gbc.anchor = GridBagConstraints.EAST;
            gbc.gridx = 0;
            gbc.gridy++;
            add(new JLabel("Charisma: "), gbc);
            gbc.anchor = GridBagConstraints.WEST;
            gbc.gridx++;
            add(charismaField, gbc);

            gbc.anchor = GridBagConstraints.EAST;
            gbc.gridx = 0;
            gbc.gridy++;
            add(new JLabel("Barter: "), gbc);
            gbc.anchor = GridBagConstraints.WEST;
            gbc.gridx++;
            add(barterField, gbc);
        }

    }

}