2012-06-17 6 views
0

애플릿을 디자인하여 사용자가 그래프를 그릴 수있게했습니다. 다른 파일 (ControlsB.java)에서 Graph.java 파일의 변수가 업데이트되는 코드를 작성하는 데 문제가 있습니다. 다음은 내 코드입니다 :ActionListener를 사용하여 다른 클래스의 변수 업데이트

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의 스크롤 = 새로운 JScrollPane의 (텍스트, 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 감사합니다 일반적으로

+1

나는 귀하의 질문이 아닌 것을 알고 있지만 귀하의 코드는 끔찍합니다. 요점은, ** 객체 지향 프로그래밍 **의 기본 기능 중 하나 인'액션 리스너 (action listener) '를 소개하고자하지만, 코드는 객체 지향적이지 않습니다. 순수한 절차 적입니다. 그것을 유지하기 위해 페인트를 많이 가져올 것입니다. – dantuch

+0

@Matthew 답변을 얻은 후에는 질문을 부인하지 마십시오. –

답변

2

있습니다 여러 클래스의 해당 데이터를 소위 '모델'에 데이터를 저장하고 다른 클래스간에 해당 모델을 공유합니다. 뷰는 모델의 데이터를 (시각적으로) 나타내며 액션 리스너는 모델에서만 작동합니다.

모델을 관찰 할 수있는 경우 데이터가 변경되면보기가 업데이트 될 수 있습니다. 따라서 귀하의 ActionListener은 단지 데이터를 변경하고, 모델은 모든 이해 관계자가 그것이 변경되었다는 것을 귀하의 경우 그래프로 알려주고, 필요하다면 그 이해 관계자는 그 변화에 반응합니다 (그래프의 업데이트).

대부분의 경우 텍스트보다는 코드를 더 잘 보여 주므로 나는 멍청한 예제를 작성했지만 의미하는 바를 보여줍니다. 하나의 모델 (DataModel)은 시각 (DataPanel)으로 표시되며, 외부 클래스는 모델 (Timer 예)에서 정기적으로 업데이트하고 TimerDataModel만을 알고있는 동안 뷰가 업데이트됩니다. 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(); 
    } 
} 
+0

HEHE 고마워요 Robin :) – Matthew

+0

무슨 뜻인지 알 겠지만 문제는 코드에 어떻게 구현할 수 있느냐입니다. 저는 JAVA를 처음 접했고 새로운 말을 할 때만 2 개월 동안 Java를 해왔습니다. 특정 개념을 이해하는 것이 어렵다는 것을 알고 있습니다. 예를 들어 하나의 변수를 다른 클래스의 다른 변수에 연결하려면 어떻게해야합니까? 나는 내가 따라 가서 구현할 수있는 몇 가지 팁을 어디서 찾을 수 있는지 모르겠다. : S – Matthew

+0

@Matthew 만약 당신이 자바에 익숙하지 않다면, 당신은 그 기본 개념에 어려움을 겪고있다. 그래프와 UI를 프로그래밍 할 필요가 없습니다. 먼저 객체 지향 프로그래밍의 실제 기초를 이해했는지 확인하십시오. – Robin

관련 문제