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