gpt4 book ai didi

java - 使用ActionListener更新其他类中的变量

转载 作者:行者123 更新时间:2023-12-02 07:44:42 25 4
gpt4 key购买 nike

我正在设计一个小程序,以便它允许用户绘制图表。我在构造代码时遇到问题,该代码从另一个文件(ControlsB.java)更新 Graph.java 文件中的变量。下面是我的代码:

 import java.awt.*;
import javax.swing.*;


public class Calculator extends JFrame{

/**
*
*/
private static final long serialVersionUID = 1L;
private static final int HORIZONTAL_SCROLLBAR_NEVER = 0;
private static final int VERTICAL_SCROLLBAR_ALWAYS = 0;

public static void main (String[] args){

JFrame calculator = new JFrame("My Simple Calculator");

calculator.setSize(500,500);

JPanel panel = new JPanel();

panel.setLayout(new BorderLayout());

Box a = Box.createHorizontalBox();

JTextArea text = new JTextArea(10,15);

JScrollPane 滚动 = new JScrollPane(text, JScrollPane.VERTICAL_SCROLLBAR_​​ALWAYS,JScrollPane.HORIZONTAL_SCROLLBAR_​​NEVER);

Box b = Box.createHorizontalBox();


//JToolBar tool = new JToolBar(SwingConstants.HORIZONTAL);
JButton add = new JButton("+");
JButton minus = new JButton("-");
JButton multi = new JButton("x");
JButton div = new JButton("/");
JButton c = new JButton("C");
JButton eq = new JButton("=");

JTextField field = new JTextField(10);

JButton enter = new JButton("Enter");

b.add(add);
b.add(minus);
b.add(multi);
b.add(div);
b.add(c);
b.add(eq);

a.add(field);
a.add(enter);

panel.add(scroll,BorderLayout.NORTH);
panel.add(b,BorderLayout.CENTER);
panel.add(a,BorderLayout.SOUTH);

calculator.setContentPane(panel);
calculator.setVisible(true);
}

}

现在我主要关心的是 ControlsB.java 文件,我希望当用户输入 x 轴和 y 轴范围并点击调整大小按钮时strong> graph.java 文件中的变量会相应更新,从而调整图表大小。

我在 Graph.java 文件中讨论的变量位于第 57 到 65 行之间。

谢谢

最佳答案

通常,如果您需要在多个类之间共享数据,并更新多个类中的数据,则可以将数据放入所谓的“模型”中,并在不同的类之间共享该模型。您的 View 将是模型中数据的(视觉)表示,并且您的操作监听器仅对模型进行操作。

如果您确保模型是可观察的,则 View 可以在数据更改时自行更新。因此,您的 ActionListener 只是更改数据,模型让所有感兴趣的各方知道它已更改(在您的情况下为图表),并且如果需要,这些感兴趣的各方对该更改使用react(图表的更新)。

由于我发现在大多数情况下代码比文本更能说明问题,所以我整理了一个相当愚蠢的示例,但这说明了我的意思。我有一个模型 (DataModel),它在 View (DataPanel) 中可视化,并且外部类对模型进行定期更新(Timer) > 在我的示例中),并且 View 会更新,而 Timer 只知道 DataModel 而不是 DataPanel

哦,是的,代码相当长,但是您也向我们扔了很多代码。

import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.Timer;
import java.awt.EventQueue;
import java.awt.HeadlessException;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.beans.PropertyChangeEvent;
import java.beans.PropertyChangeListener;
import java.beans.PropertyChangeSupport;

public class ActionListenerDemo {

private static class DataModel{
private PropertyChangeSupport propertyChangeSupport = new PropertyChangeSupport( this );

private String data="";

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

public String getData() {
return data;
}

public void setData( String aData ) {
String old = data;
data = aData;
propertyChangeSupport.firePropertyChange( "data", old, data );
}
}

private static class DataPanel extends JFrame{
private final DataModel dataModel;
private final JLabel label;
private DataPanel( DataModel aDataModel ) throws HeadlessException {
dataModel = aDataModel;
dataModel.addPropertyChangeListener( new PropertyChangeListener() {
@Override
public void propertyChange( PropertyChangeEvent evt ) {
updateUIFromModel();
}
} );
label = new JLabel( dataModel.getData() );
add( label );
}
private void updateUIFromModel(){
label.setText( dataModel.getData() );
}
}

public static void main( String[] args ) {
final DataModel model = new DataModel();
model.setData( "Change me and watch the UI update !" );
EventQueue.invokeLater( new Runnable() {
@Override
public void run() {
DataPanel dataPanel = new DataPanel( model );
dataPanel.setDefaultCloseOperation( JFrame.EXIT_ON_CLOSE );
dataPanel.pack();
dataPanel.setVisible( true );
}
} );
Timer timer = new Timer( 1000, new ActionListener() {
private String[] values = {"Data changed", "More changes", "Lorem ipsum" };
private int counter = 0;
@Override
public void actionPerformed( ActionEvent e ) {
counter = counter%values.length;
model.setData( values[counter] );
counter++;
}
} );
timer.setRepeats( true );
timer.start();
}
}

关于java - 使用ActionListener更新其他类中的变量,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11073039/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com