0

ユーザーがグラフをプロットできるように、アプレットを設計しています。別のファイル (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);
}

 }

ここで、ユーザーが x 軸と y 軸の範囲を入力して [サイズ変更] ボタンをクリックすると、graph.java ファイルの変数がそれに応じて更新され、グラフが更新されます。サイズが変更されます。

Graph.java ファイルで話している変数は、57 行から 65 行の間にあります。

ありがとう

4

1 に答える 1

2

通常、複数のクラス間でデータを共有し、複数のクラスからそのデータを更新する必要がある場合は、データをいわゆる「モデル」に入れ、そのモデルを異なるクラス間で共有します。ビューはモデル内のデータの (視覚的な) 表現になり、アクション リスナーはモデル上で動作します。

モデルが監視可能であることを確認すると、データが変更されたときにビューが更新されます。したがってActionListener、データを変更するだけで、モデルはすべての関係者にそれが変更されたことを知らせ (あなたの場合はグラフ)、必要に応じて関係者はその変更に反応します (グラフの更新)。

ほとんどの場合、テキストよりもコードの方がわかりやすいと思うので、かなりばかげた例をまとめましたが、これは私の言いたいことを示しています。DataModelビュー ( ) で視覚化された1 つのモデル ( ) がDataPanelあり、外部クラスがモデル (この例では ) を定期的に更新し、のみが を認識し、を認識していないTimer間にビューが更新されます。TimerDataModelDataPanel

そうそう、コードはかなり長いですが、あなたは私たちにもたくさんのコードを投げかけました。

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();
  }
}
于 2012-06-17T17:30:30.000 に答える