Re: Is there a limit to the size or complexity of JPanel's paintComponent
method?
Paul.Lee.1971@gmail.com 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