Re: Is there a limit to the size or complexity of JPanel's paintComponent method?



Paul.Lee.1971@xxxxxxxxx wrote:
Alright, heres the code. Its still embryonic (threading and tooltips
need to be done). I've highlighted the problem area. I've also missed
out the class that contains the data - its long, boring and doesn't
impact on the rest of the code.


import java.lang.*;
import java.awt.*;
import java.applet.*;
import java.awt.event.*;
import java.util.*;
import java.math.*;
import java.io.*;
import javax.swing.*;

public class IceDisplayApplet extends JApplet implements Runnable,
ActionListener
{

DataDisplayPanel displayPanel;


// NB: ratio of x:y sizes are 4610:6080

JButton buttonresetcanvas = new JButton("reset map"); // Change the
screen extent

JLabel labelcurrentdate = new JLabel("Current Date:", Label.LEFT);
JLabel labeltimebetweenincrements = new JLabel("Time Increment
(seconds):", Label.LEFT);

JTextField textcurrentdate = new JTextField("",7);
JTextField texttimeincrement = new JTextField("1",7);

JButton buttonstart = new JButton("start");
JButton buttonpause = new JButton("pause");
JButton buttonstop = new JButton("stop");

ButtonManipulator upbutton;
ButtonManipulator downbutton;
ButtonManipulator leftbutton;
ButtonManipulator rightbutton;


double northextent = 49.00;
double southextent = 40.00;
double westextent = 57.00;
double eastextent = 43.00; // the extent of the data
double actualnorthextent, actualsouthextent, actualwestextent,
actualeastextent; // the extent of

the map

public double onemilenorth = 6080.0;
public double onemilewest = 4610.0;


public double N(){return 0.0;}
public double NNE(){return 22.5;}
public double NE(){return 45.0;}
public double ENE(){return 67.5;}
public double E(){return 90.0;}
public double ESE(){return 112.5;}
public double SE(){return 135.0;}
public double SSE(){return 157.5;}
public double S(){return 180.0;}
public double SSW(){return 202.5;}
public double SW(){return 225.0;}
public double WSW(){return 247.5;}
public double W (){return 270.0;}
public double WNW(){return 292.5;}
public double NW(){return 315.0;}
public double NNW(){return 337.5;}

public double nauticalmile = 6080.0;

JPanel display, controls, separator;
Container content;


GraphicsDataList graphicsList;

Thread animator;

boolean pauseval;
boolean startval;


public double getactualnorthextent()
{
return actualnorthextent;
}

public double getactualsouthextent()
{
return actualsouthextent;
}

public double getactualeastextent()
{
return actualeastextent;
}

public double getactualwestextent()
{
return actualwestextent;
}

public void movemapup()
{
actualnorthextent+=0.16667; // this is decimal
actualsouthextent+=0.16667;
displayPanel.repaint();
}

public void movemapdown()
{
actualnorthextent-=0.16667; // this is decimal!
actualsouthextent-=0.16667;
displayPanel.repaint();


}

public void movemapleft()
{
actualwestextent+=0.16667;
actualeastextent+=0.16667;
displayPanel.repaint();

}

public void movemapright()
{
actualwestextent-=0.16667;
actualeastextent-=0.16667;
displayPanel.repaint();

}

public GraphicsDataList getgraphicsList()
{
return graphicsList;

}


public void init()
{

resetactuallftorealextent();

GraphicsDataList graphicsList = new GraphicsDataList();



pauseval = true;
startval = false;

// draw GUI

content=getContentPane();

content.setLayout(new FlowLayout());

display = new JPanel();

//separator = new JPanel();
//separator.setPreferredSize( new Dimension(100, 50));

controls = new JPanel();

initialisegridbaglayout( content );


//display.add( displayPanel );

buttonstart.addActionListener(this);
buttonstop.addActionListener(this);
buttonpause.addActionListener(this);
buttonresetcanvas.addActionListener(this);

upbutton.addActionListener(this);
downbutton.addActionListener(this);
rightbutton.addActionListener(this);
leftbutton.addActionListener(this);

controls.setLayout(new BoxLayout( controls, BoxLayout.Y_AXIS ));

buttonstart.setAlignmentX(Component.CENTER_ALIGNMENT);
buttonstop.setAlignmentX(Component.CENTER_ALIGNMENT);
buttonpause.setAlignmentX(Component.CENTER_ALIGNMENT);
buttonresetcanvas.setAlignmentX(Component.CENTER_ALIGNMENT);


controls.add(buttonstart);
controls.add(Box.createRigidArea(new Dimension(0,5)));


controls.add(buttonstop);
controls.add(Box.createRigidArea(new Dimension(0,5)));


controls.add(buttonpause);
controls.add(Box.createRigidArea(new Dimension(0,5)));


controls.add(buttonresetcanvas);
controls.add(Box.createRigidArea(new Dimension(0,5)));


// Now time increment and current time


JPanel timeindicatorpanel = new JPanel();
timeindicatorpanel.add( labelcurrentdate );
timeindicatorpanel.add( textcurrentdate );

JPanel timeincrementpanel = new JPanel();
timeincrementpanel.add( labeltimebetweenincrements );
timeincrementpanel.add( texttimeincrement );

controls.add( timeindicatorpanel );
controls.add( timeincrementpanel );


content.add( display );
content.add( controls );

setVisible(true);
invalidate();
repaint();

//pack();


}


private void initialisegridbaglayout( Container pane )
{

pane.setLayout(new GridBagLayout());
GridBagConstraints c = new GridBagConstraints();

JPanel holdingPanel = new JPanel(new GridBagLayout());


upbutton = new ButtonManipulator("up", this);
upbutton.setPreferredSize(new Dimension( 420, 30));
c.gridx = 1;
c.gridy = 0;
holdingPanel.add(upbutton, c);

leftbutton = new ButtonManipulator("left", this);
leftbutton.setPreferredSize(new Dimension( 30, 356));
c.gridx = 0;
c.gridy = 1;
holdingPanel.add(leftbutton, c);

displayPanel = new DataDisplayPanel( this );
displayPanel.setPreferredSize(new Dimension( 420, 356 ));
displayPanel.setBackground( Color.BLACK );
c.gridx = 1;
c.gridy = 1;
holdingPanel.add(displayPanel, c);

rightbutton = new ButtonManipulator("right", this);
rightbutton.setPreferredSize(new Dimension( 30, 356));
c.gridx = 2;
c.gridy = 1;
holdingPanel.add(rightbutton, c);


downbutton = new ButtonManipulator("down", this);
downbutton.setPreferredSize(new Dimension( 420, 30));
c.gridx = 1; //aligned with button 2
c.gridy = 2; //third row
holdingPanel.add(downbutton, c);

pane.add(holdingPanel,new GridBagConstraints());


}



public void stop()
{
animator = null;
startval = false;
}

public void start()
{

if ( !startval )
{
startval = true;
animator = new Thread(this);
animator.start();
}
}


public void run()
{

while (Thread.currentThread() == animator && !pauseval )
{


}

animator = null;
startval = false;
}

public void actionPerformed(ActionEvent e)
{

if (e.getSource() == buttonstart )
{
pauseval = false;

if ( animator == null )
{
start();
}


}

if (e.getSource() == buttonstop )
{

stop();

}

if (e.getSource() == buttonpause )
{
pauseval = true;


}


if (e.getSource() == buttonresetcanvas )
{

resetactuallftorealextent();
displayPanel.repaint();

}


if (e.getSource() == upbutton)
{
movemapup();
}
else if (e.getSource() == leftbutton)
{
movemapleft();
}
else if (e.getSource() == rightbutton)
{
movemapright();
}
else if (e.getSource() == downbutton)
{
movemapdown();
}



}



public double convertstringcoordinatetodouble( String coord )
{
// first split up the String
String temp[] = coord.split("\\.");

double first = Double.parseDouble( temp[0] );
double second = Double.parseDouble( temp[1] );

return (first + (second/60.0));

}



public int[] determinescreencoordinates( double coords[] )
{
// where on the screen does this go?

System.out.println(coords[0] + " " + coords[1]);

double distancefromlefthandside = actualwestextent - coords[0];
double distancefromtop = actualnorthextent - coords[1];

System.out.println(distancefromlefthandside + " " + distancefromtop);


double latextent = actualnorthextent - actualsouthextent;
double longext = actualwestextent - actualeastextent;

int pixelsfromlefthandside = (int) ((distancefromlefthandside*420)/
(actualwestextent -

actualeastextent));

int pixelsfromtop = (int) ((distancefromtop*356)/(actualnorthextent -
actualsouthextent));


int [] screencoords = new int[2];

screencoords[0] = pixelsfromlefthandside;
screencoords[1] = pixelsfromtop;

return screencoords;

}

private void resetactuallftorealextent()
{

actualnorthextent = northextent;
actualsouthextent = southextent;
actualwestextent = westextent;
actualeastextent = eastextent;


}

public void resetscreencoords( int screenxinitial, int screenyinitial,
int eastwestextent, int

northsouthextent)
{

double northsouth = actualnorthextent - actualsouthextent;
double dummy = actualnorthextent;

actualnorthextent = actualnorthextent - (screenyinitial*northsouth)/
356;

actualsouthextent = dummy - ((northsouthextent +
screenyinitial)*northsouth)/356;

double eastwest = actualwestextent - actualeastextent;

actualwestextent = actualwestextent - (screenxinitial*eastwest)/420;

dummy = actualwestextent;

actualeastextent = dummy - ((eastwestextent +
screenxinitial)*eastwest)/420;

}

}



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

public class DataDisplayPanel extends JPanel implements MouseListener,
MouseMotionListener
{
IceDisplayApplet applet;

// TODO: Tooltips.

int initialx, initialy, finalx, finaly;
Boolean areadragged = false;


int screenxinitial, screenyinitial, eastwestextent, northsouthextent;
int eastwestsize, northsouthsize;


public void mouseClicked( MouseEvent e )
{

}

public void mouseEntered( MouseEvent e )
{
}

public void mouseExited( MouseEvent e )
{
}

public void mousePressed( MouseEvent e )
{

// Initial point for dragged/zoomed area

initialx = e.getX();
initialy = e.getY();
areadragged = true;

}

public void mouseReleased( MouseEvent e )
{

if ( areadragged )
{


areadragged = false;

// TODO: resize applet area

applet.resetscreencoords( screenyinitial, screenxinitial,
northsouthextent, eastwestextent );
repaint();
}

}

public void mouseDragged( MouseEvent e )
{
// Final point for zoomed area

finalx = e.getX();
finaly = e.getY();

eastwestsize = finalx - initialx;

northsouthsize = (int) (eastwestsize*356/420);

System.out.println("northsouthsize = " + northsouthsize);
System.out.println("unmodified northsouthsize = " +
(eastwestsize*356/420) );


if ( eastwestsize < 0 ) // swipe in this direction <-----
{
System.out.println("eastwestsize < 0");


if ( finaly > initialy ) // swipe downwards
{

screenxinitial = finalx;
screenyinitial = initialy;
eastwestextent = Math.abs( eastwestsize );
northsouthextent = Math.abs(northsouthsize);
}
else // swipe upwards
{

screenxinitial = finalx;
screenyinitial = finaly;
eastwestextent = Math.abs(eastwestsize);
northsouthextent = Math.abs(northsouthsize);
}


}
else // swipe in this direction ----->
{

if ( finaly > initialy ) // swipe downwards
{

screenxinitial = initialx;
screenyinitial = initialy;
eastwestextent = eastwestsize;
northsouthextent = northsouthsize;

}
else // swipe upwards
{

screenxinitial = initialx;
screenyinitial = finaly;
eastwestextent = eastwestsize;
northsouthextent = northsouthsize;

}
}


// TODO: resize extent in applet.

//applet.resetscreencoords(screenxinitial, screenyinitial,
eastwestextent, northsouthextent );

repaint();


}

public void mouseMoved( MouseEvent e )
{
}


public void paintComponent( Graphics g )
{
super.paintComponent( g );

// Draw points on map, depending on area, "other info", colour etc.

setBackground( Color.BLACK );

double north = applet.getactualnorthextent();
double south = applet.getactualsouthextent();
double west = applet.getactualwestextent();
double east = applet.getactualeastextent();

Boolean eastwestveto = false;
//int counteastwest = 0;

Boolean northsouthveto = false;
//int countnorthsouth = 0;

if ( west - east > 7 ) eastwestveto = true;
if ( north - south > 7 ) northsouthveto = true;


// Draw lines of longitude first

for (int i = (int) Math.ceil((int) east); i <= (int) Math.floor((int)
west); i++)
{

if ( eastwestveto && (i % 2 == 0))
{
double [] coords = {i,0};
int [] screencoords = applet.determinescreencoordinates( coords );


g.setColor ( Color.WHITE );

g.drawLine( screencoords[0], 0, screencoords[0], getHeight() );

g.drawString( new String(i + " W"), screencoords[0]+5,15 );
}

}


for (int j = (int) Math.ceil((int) south); j <= (int) Math.floor((int)
north); j++)
{


if ( northsouthveto && (j % 2 == 0))
{
double [] coords = {0, j};
int [] screencoords = applet.determinescreencoordinates( coords );

g.setColor ( Color.WHITE );

g.drawLine( 0, screencoords[1], getWidth(), screencoords[1] );

g.drawString( new String(j + " N"), 1, screencoords[1]-5 );

}
}

if ( areadragged )
{

g.setColor ( Color.CYAN);

g.drawRect( screenxinitial, screenyinitial, eastwestextent,
northsouthextent );

}

// START OF PROBLEM AREA

GraphicsDataList glist = applet.getgraphicsList();

int listsize = glist.getList().size();

// END OF PROBLEM AREA - REMOVE THE BITS BETWEEN THE DOUBLE SLASHES
AND THE GUI LOOKS OK.

if( listsize != 0 )
{
if( glist.getcanread())
{


// TODO: draw ice, fields, lines etc. on the screen.

for( int a=0; a< listsize ; a++ )
{
DataInfo dinfo = (DataInfo) glist.getList().get(a);

String dtype = dinfo.getdatatype();

if ( dtype.equals("FIELD") )
{
g.setColor( Color.RED );
}
else if ( dtype.equals("BERG") )
{
g.setColor( Color.YELLOW );

}
else if ( dtype.equals("FIELDBERG") )
{
g.setColor( Color.ORANGE );

}

String dsubdata = dinfo.getsubdata();

if ( dsubdata.equals("null") )
{
// Draw shape
// unless coords = 4 points, in which case, draw line

String [][] coords = dinfo.getcoords();

if (coords[1][0].equals("") && coords[1][1].equals(""))
{

}
else
{

}


}
else if ( dsubdata.equals("AREA") )
{
// Draw bounding box
}
else
{
// This is of the format N 8 S 67 - drawline
// unless it contains NOLINE

}

}


}

// END OF PROBLEM AREA
}

}


public DataDisplayPanel(IceDisplayApplet applet)
{
this.applet = applet;
addMouseListener( this );
addMouseMotionListener(this);
}


}



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

public class ButtonManipulator extends JButton
{

String direction;
IceDisplayApplet hostapplet;


public ButtonManipulator( String direction, IceDisplayApplet
hostapplet )
{
// Arguments = up, down, left, right

this.direction = direction;

// Arguments = main Applet, so that displaypanel can be changed.

this.hostapplet = hostapplet;

}

public void paintComponent(Graphics g)
{

super.paintComponent(g);

setVisible( true );

if ( direction.equals("up") )
{

Polygon poly = new Polygon();
poly.addPoint( getWidth()/2, 3);
poly.addPoint( (getWidth()/2)+25, 26);
poly.addPoint( (getWidth()/2)-25, 26);
g.fillPolygon(poly);

}
else if ( direction.equals("left") )
{

Polygon poly = new Polygon();
poly.addPoint( 3, getHeight()/2 );
poly.addPoint( 26, (getHeight()/2)+25);
poly.addPoint( 26, (getHeight()/2)-25);
g.fillPolygon(poly);

}
else if ( direction.equals("right") )
{

Polygon poly = new Polygon();
poly.addPoint( 27, getHeight()/2);
poly.addPoint( 3, (getHeight()/2)+25);
poly.addPoint( 3, (getHeight()/2)-25);
g.fillPolygon(poly);

}
else if ( direction.equals("down") )
{

Polygon poly = new Polygon();
poly.addPoint( getWidth()/2, 27);
poly.addPoint( (getWidth()/2)+25, 3);
poly.addPoint( (getWidth()/2)-25, 3);
g.fillPolygon(poly);

}
}


}



import java.util.*;

public class GraphicsDataList
{
private ArrayList GraphicsList;
Boolean canread;

public GraphicsDataList()
{

GraphicsList = new ArrayList();
canread = false;
}

public ArrayList getList()
{
return GraphicsList;
}

public void setcanread( Boolean value )
{
canread = value;
}

public Boolean getcanread()
{
return canread;
}

}



public class DataInfo
{
String date;
String shipname;
String coords[][];
String subdata;
String datatype;
String info;

DataInfo( String datevals, String shipnameval, String coordvals,
String subdatavals, String datatypevals, String infovals )
{

//System.out.println("Inside DataInfo constructor: coordvals = " +
coordvals);

coords = new String[2][2];

//System.out.println("Inside DataInfo constructor: created new
coords member");

coords[1][0]="";
coords[1][1]="";

//System.out.println("Inside DataInfo constructor: assigned dummy
data to coords");


String temp[] = coordvals.split(" ");

//System.out.println("Inside DataInfo constructor: Just split
coordvals: " + temp.length);
//System.out.println("temp coords " + coordvals);

coords[0][0] = temp[0];
coords[0][1] = temp[2];

//System.out.println("Inside DataInfo constructor: Just assigned
first variables");

if (temp.length == 8)
{

coords[1][0] = temp[4];
coords[1][1] = temp[6];

}

date = datevals;
subdata = subdatavals;
shipname = shipnameval;
datatype = datatypevals;
info = infovals;

//System.out.println("Finished with DataInfo constructor");

}

public String getdate()
{
return date;
}

public String getshipname()
{
return shipname;
}

public String[][] getcoords()
{
return coords;
}

public String getsubdata()
{
return subdata;
}

public String getdatatype()
{
return datatype;
}

public String getinfo()
{
return info;
}

}






This is almost unreadable. Is the first paintComponent() method part of the JApplet? If it is, that won't do anything because there is no paintComponent() method in JApplet.

I suggest you create an SSCCE, barring that, clean up the code so it is at least readable and put it in one class so it can be compiled as is.

--

Knute Johnson
email s/nospam/knute2008/

--
Posted via NewsDemon.com - Premium Uncensored Newsgroup Service
------->>>>>>http://www.NewsDemon.com<<<<<<------
Unlimited Access, Anonymous Accounts, Uncensored Broadband Access
.


Quantcast