简体   繁体   中英

can't get graph to resize with window (Java)

I'm building a program to graph the popularity of baby names since 1900. I've gotten the graph part, but I can't get the graph to resize with the window. I've added a component listener to a class extending GCanvas with the following code:

import acm.graphics.*;
import java.awt.event.*;
import java.util.*;
import java.awt.*;

public class NameSurferGraph extends GCanvas
implements NameSurferConstants, ComponentListener {

private static final long serialVersionUID = 1L;

//Sets up the graph
public NameSurferGraph() {
    addComponentListener(this);
    nameList = new ArrayList<NameSurferEntry>();
}

//Adds an entry to the array of names being graphed
public void addEntry(NameSurferEntry entry) {
    nameList.add(entry);
}

//Clears and then redraws the graph
public void update() {
    removeAll();
    drawBackground();
    for (int i=0; i<nameList.size(); i++) {
            drawLineForOneName(i);
    }
}

//Draws the background lines and labels for the graph
private void drawBackground() {
    String decade = "";
    for (int i = 0; i<NDECADES; i++) {
        double x = (APPLICATION_WIDTH/NDECADES)*i;
        decade = new Integer(STARTING_DECADE+10*i).toString();
        GLine line = new GLine(x,0,x,APPLICATION_HEIGHT);
        GLine hLine = new GLine(0,GRAPH_MARGIN_SIZE,APPLICATION_WIDTH-APPLICATION_WIDTH/NDECADES,GRAPH_MARGIN_SIZE);
        GLine hLine2 = new GLine(0,APPLICATION_HEIGHT-GRAPH_MARGIN_SIZE,APPLICATION_WIDTH-APPLICATION_WIDTH/NDECADES,APPLICATION_HEIGHT-GRAPH_MARGIN_SIZE);
        GLabel label = new GLabel(decade);
        label.setLocation(x+4,APPLICATION_HEIGHT);
        add(line);
        add(hLine);
        add(hLine2);
        add(label);
        }
}

//More code draws the actual lines.

//ivars
private ArrayList<NameSurferEntry> nameList;
private GLine line;

//Implementation of the ComponentListener interface
public void componentHidden(ComponentEvent e) { }
public void componentMoved(ComponentEvent e) { }
public void componentResized(ComponentEvent e) { update(); }
public void componentShown(ComponentEvent e) { }
}
}
}

But when I call a method on it from another class, nothing happens.

import acm.program.*;
import java.awt.event.*;
import javax.swing.*;

public class NameSurfer extends Program implements NameSurferConstants {

private static final long serialVersionUID = 1L;

private NameSurferDataBase database;
private String name;
private NameSurferEntry entry = new NameSurferEntry(name);

//Initializes the program
public void init() {
    putInteractors();
    database = new NameSurferDataBase(NAMES_DATA_FILE);
}

//Adds the interactors
public void putInteractors() {
    JButton clear = new JButton("Clear");
    JButton clickGraph = new JButton("Graph");
    JLabel nameLabel = new JLabel("Name");
    add(graph);
    add(nameLabel,SOUTH);
    add(textfield,SOUTH);
    add(clickGraph,SOUTH);
    add(clear,SOUTH);
    addActionListeners();
    textfield.addActionListener(this);
    getMouseListeners();
}
//Other code gets user input    

//Graphs the name
public void graphName(String name) {
    entry = database.findEntry(name);
    graph.addEntry(entry);
    graph.update();
}

//ivars
private JTextField textfield = new JTextField(20);
public NameSurferGraph graph = new NameSurferGraph();

}

Any ideas about what I might be doing wrong?

Are APPLICATION_WIDTH and APPLICATION_HEIGHT changed anywhere? The all uppercase name implies fixed values to me (without seeing the actual definition). Since you are calculating everything based on those values, I wouldn't be surprized if that is what's preventing you from handling the resize properly

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM