2012-06-18 2 views
0

FNAKLNFDKA.javaИзменение переменных в одном классе из другого класса

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

public class GraphApplet extends JApplet{ 

private static final long serialVersionUID = 1L; 
public static Graphics p; 

public void init(){ 

    SwingUtilities.invokeLater(new Runnable() { 
     public void run() { 


    }); 
    } 
} 

FANKJ.java

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

class FASKHF extends JPanel { 


public static Graphics p; 
private static final long serialVersionUID = 1L; 

public Graph(){ 
    this.setBackground(Color.yellow); 
} 

@Override 
public Dimension getPreferredSize() 
{ 
    return (new Dimension(560,560)); 
} 

public static void updateGraph() { 


    repaint(); 
} 



public void paint(Graphics F) { 



    //line co-ordinates 
    //the numbers represent the number of boxes on the graph 
    //1st line on the l/h side 
    int xstart1 = 2; 
    int ystart1 = 3; 

    int xfinish1 = 1; 
    int yfinish1 = 9; 

    //2nd line on the r/h side 
    int xstart2 = 8; 
    int ystart2 = 3; 

    int xfinish2 = 9; 
    int yfinish2 = 9; 

    //drawing upper arc 
    int arcX = 2; 
    int arcY = 1; 
    int imagRectWid = 6; 
    int imagRectHei = 4; 
    int startAngle = 0; 
    int arcAngle = 180; 

    //other 



    f = xaxis22; 
    g = xaxis11; 

    //to be assigned later. 
    //the values of xaxis and yaxis need to be separated 
    //yaxis3 = 5; 
    //yaxis4 = -5; 

    //change -ve num to +ve 
    int g3 = Math.abs(g); 

    int a1 = g3 + f; 
    int b1 = a1; 

    int d = (appletWidth/a1); 
    int e = (Height/b1); 

    /** 
    to determine the 
    ammount of pixles there 
    is in each box of the 
    graph, both y-axis and 
    x-axis 
    */ 
    int xbox = x1/10; 
    int ybox = y1/10; 

    //line variables 
    //the xstart, ystart, etc represent the number of boxes 

    //top point of the line on the graph 
    px1 = xbox * xstart1;//start x 
    py1 = ybox * ystart1;//start y 

    //lowwer point of the line on the graph 
    px = xbox * xfinish1;//finish x 
    py = ybox * yfinish1;//finish y 

    //other line on the right hand side 
    p2x = xbox * xstart2; 
    p2y = ybox * ystart2; 

    p2x2 = xbox * xfinish2; 
    p2y2 = ybox * yfinish2; 

    //drawing arc 
    int arcBoxX = arcX * xbox; 
    int arcBoxY = arcY * ybox; 
    int arcBoxWidth = imagRectWid * xbox; 
    int arcBoxHeight = imagRectHei * ybox; 


    //draw y-axis numbers 
    //(+ve) 
    while(f != 0){ 
     String s = String.valueOf(f); 
     p.drawString(s,(x + 5),m + 13); 
     m = m + b; 
     f = f - 1; 
    } 
    //(-ve) 
    m2 = y; 
    while(f2 != g-1){ 
     String u = String.valueOf(f2); 
     p.drawString(u,(x + 5),m2 - 3); 
     m2 = m2 + b; 
     f2 = f2 - 1; 
    } 
    //draw x-axis numbers. 
    //(-ve) 
    while(g != 0){ 
     String t = String.valueOf(g); 
     p.drawString(t,n,y - 5); 
     n = n + a; 
     g = g + 1; 
    } 
    //(+ve) 
    n2 = x + a; 
    while(g2 != g3+1){ 
     String vw = String.valueOf(g2); 
     p.drawString(vw,n2 -10,y - 5); 
     n2 = n2 + a; 
     g2 = g2 + 1; 
    } 

    BasicStroke aLine2 = new BasicStroke(1.0F, 
             BasicStroke.CAP_ROUND,BasicStroke.JOIN_ROUND); 
    graph.setStroke(aLine2); 

    //notch on numbers and grid lines 
    //left to right, top to bottom notches 
    int v2 = -5; 
    int v5 = 0; 
    while(i <= a1-1){ 

     p.drawLine(Da,0,Ea,y1); 
     a = a + d; 
     b = b + e; 
     i = i + 1; 
    } 
    //notches 
    while(i2 <= a1){ 
     p.setColor(Color.blue);//notch color 
     p.drawString("x",v2+2,y+3);//xaxis 
     p.drawString("x",x-4,v5+4);//yaxis 
     v5 = v5 + e; 
     v2 = v2 + d; 
     i2 = i2 + 1; 
    } 


    } 
    } 
} 




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


} 
} 



/* 
    * this code is to accept a user input in order for him to 
    * change the ranges of the xaxis and yaxis to his needs 
    */ 

import javax.swing.Box; 
import javax.swing.JButton; 
import javax.swing.JTextField; 
import java.awt.*; 
import java.awt.event.*; 
import javax.swing.*; 

class ControlsB extends JPanel{ 

    private static final long serialVersionUID = 1L; 
    public static int xaxis1,xaxis2,yaxis3,yaxis4; 

    //public int xaxis11,xaxis22,yaxis33,yaxis44; 
    //public Object ControlsB; 
    //private Graph graph; 
    //public static Graphics p; 
    public String s; 

public ControlsB(Box box2) { 

    JButton btn1 = new JButton("Resize"); 

    final Box b = Box.createHorizontalBox(); 
    b.add(new JLabel("Please enter range: ")); 
    Box b0 = Box.createVerticalBox();//create a vertical box to stack the controls 

    Box b1 = Box.createHorizontalBox(); // create a horizontal box for the x-axis 

    //x-axis 
    b1.add(new JLabel("x-axis ")); 
    b1.add(new JLabel("from")); 

    final JTextField f1 = new JTextField(" 0"); 

    f1.setMaximumSize(new Dimension(100,30)); 


b.add(btn1); 
} 

protected Object Integer(int xaxis12) { 
    return null; 
} 
} 

Теперь проблема с этой программой; в ControlsB У меня есть метод, который размещает элементы управления в нижней части (под желтым полем/графом), теперь эти элементы управления должны принимать диапазон графика по оси X-оси (ось x только на потому что код для оси y еще не готов). Когда пользователь нажимает кнопку «resize», график должен появиться с изменениями.

Однако этого не происходит, и кнопка ни на что не нажимается ... и я не могу понять, что у меня неправильно.

В ControlsB файла У меня есть слушатель действия для btn1, который является «размером» кнопки, и сразу же после нажатия нижнего он меняет текст поле входов (f1 и f2) в целые числа и назначен х ось1, оси х 2, и т.д ...

Теперь я делаю ссылку из тезисов переменных (найденная в методе действий слушателя) к классу Graph.java с этой линией: общественности static int xaxis11 = ControlsB.xaxis1;

Может кто-нибудь пожалуйста, дайте мне знать, что это лучшее решение для этой проблемы у меня есть .. ?? ..

Примечание: все эти файлы компиляции. но график не появляется.

ответ

1

Способ, которым он в настоящее время закодирован, присваивается только xaxis11, xaxis22, yaxis33 и yaxis44. Переменные не обновляются динамически, когда они меняются в ControlsB. Это означает, что вам просто нужно обновлять их каждый раз при изменении значений. Чтобы сделать это, добавьте метод к вашему Graph класс:

public static void updateGraph() { 
    xaxis11 = ControlsB.xaxis1; 
    xaxis22 = ControlsB.xaxis2; 
    yaxis33 = ControlsB.yaxis3; 
    yaxis44 = ControlsB.yaxis4; 
} 

Затем, когда пользователь изменяет значения в ControlsB, вызовите Graph.update(). Убедитесь, что вы также вызываете перерисовку, когда это происходит.

Также обратите внимание, что сделать все эти вещи статическими не является вашим единственным вариантом. Вы также можете просто ссылаться на объект как на поле другого класса, задавать его в конструкторе и при необходимости называть методы на нем. Из-за этой проблемы у вас могут возникнуть проблемы с вашей реализацией, так как все статические могут повлиять на вашу способность вызывать repaint() для объекта, что вам нужно сделать, чтобы его обновить.

Обходной путь к этой проблеме заключается в том, чтобы добавить repaint() в нижней части метода updateGraph, описанного выше.

+0

Не могли бы вы дать мне больше информации о Graph.update() и перекраске, пожалуйста, спасибо. – Matthew

+0

Раньше, честно говоря, я пытался с repaint(), но этого не случилось, я что-то делаю неправильно? – Matthew

+1

@Matthew Я просто хотел добавить метод 'updateGraph()' в ваш класс 'Graph' с этими четырьмя операторами и' repaint() 'в конце. Затем в вашем 'actionPerformed (...)' вы вызываете 'Graph.updateGraph()' после обновления значений (xaxis1 и т. Д.). – purtip31

1

При настройке статических переменных в Graph, вы делаете копию переменных в ControlB, поэтому, когда вы чейнинг их в ControlB, изменения не отражают в Graph.Вместо того, чтобы получить доступ к переменным через ControlB (предпочтительно с помощью открытого метода в ControlB)

Update

для включения вызова перекрашивать, удалить все статические модифицирует из Graph и ControlsB; добавить переменную, содержащую экземпляр графа для ControlsB и передать этот экземпляр в конструктор

public class ControlsB extends JPanel 
{ 
    Graph my_graph; 
    //... 
    public ControlsB(Box box2, Graph graph) 
    { 
    my_graph = graph; 
    // ... 
    } 
} 

затем изменить метод updateGraph() в Graph к

public void updateGraph(int xaxis1, xaxis2, yaxis3, yaxis4) 
{ 
    xaxis11 = xaxis1; 
    xaxis22 = xaxis2; 
    yaxis33 = yaxis3; 
    yaxis44 = yaxis4; 

    repaint(); 
} 

и назвать его, как это в actionperformed() методе баттона:

graph.updateGraph(xaxis1, xaxis2, yaxis3, yaxis4); 

Примечание: вы не используете чтобы использовать box2 в конструкторе ControlsB, поэтому вы можете удалить этот параметр.

+0

Спасибо за ваш ответ, однако можете ли вы объяснить это через какой-то код, чтобы я мог лучше представить, что вы имеете в виду. – Matthew

+0

@Matthew - быстрый и грязный способ заменить все ссылки 'xaxis11' на ссылки ControlB.xaxis1 (аналогично другим), поскольку эти статические переменные в' ControlB' являются общедоступными. Таким образом, в любое время 'Graph' нужны значения осей, они будут читать те, которые находятся в' ControlB', соответственно, – Attila

+0

сделали это (см. Обновленный вопрос), однако график остается пустым и не перерисовывается поверх программного обеспечения, которое я использую (eclipse) указывает на ошибку в строке 30: * repaint() *. Я не понимаю, почему ... – Matthew

Смежные вопросы