[英]Using ActionListener to update variables in other classes
我正在设计一个applet,因此它允许用户绘制图形。 我有问题构建一个代码,从另一个文件(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 scroll = 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轴范围并点击按钮时, 调整 graph.java文件中的变量大小 ,从而更新图形调整大小。
我在Graph.java文件中讨论的变量是在57到65之间的行。
谢谢
通常,如果您需要在多个类之间共享数据,并从多个类对这些数据进行更新,则将数据放入所谓的“模型”中,并在不同类之间共享该模型。 您的视图将是模型中数据的(可视)表示,您的动作侦听器只对模型进行操作。
如果确保模型是可观察的,则视图可以在数据更改时自行更新。 因此,您的ActionListener
只是更改数据,模型让所有感兴趣的各方知道它已被更改(在您的情况下是图表),如果需要,那些感兴趣的各方会对该更改做出反应(图表的更新)。
在大多数情况下,我发现代码比文本更具说明性,我把一个相当愚蠢的例子放在一起,但这说明了我的意思。 我有一个模型( DataModel
),它在视图中可视化( DataPanel
),外部类对模型进行定期更新(在我的示例中为Timer
),并且视图得到更新,而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();
}
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.