Toon posts:

[java applet] jpanel graphics probleem

Pagina: 1
Acties:

Verwijderd

Topicstarter
Ik heb een applet dat coorinaten plot op een jpanel.(scatterplot)

Probleem:
Als ik de applet start dan zie alleen mijn jpanel zonder spots. Als ik de applet restart
dan worden de punten/assen wel geplot in de jpanel, trek ik de window groter dan gaan de punten/assen naar de achtergrond(contenpane?) en blijft de jpanel op de voorgrond.

Wat doe ik niet goed, ik plot de spots wel op de jpanel maar als ik de applet start zie ik ze niet, als ik de applet restart zie ik ze wel.. maar maar ik de window groter dan worden ze op de contentpane gezet en is de jpanel weer leeg.

Ik ben er al een paar dagen mee bezig maar kom er niet uit, help will be much appreciated :)

Hier is de code:
code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
//=-=-=-=-=-=-=-=-=-=-=-=-=-
import javax.swing.*;
import java.awt.event.*;
import java.awt.Container;
import java.awt.FlowLayout;
import java.awt.Graphics;
import java.awt.geom.*;
import java.awt.Color;
import java.awt.Font; 
import java.awt.FontMetrics; 
import java.awt.BorderLayout;
import java.util.Iterator;
import java.util.ListIterator;
import java.util.Vector;
import org.gjt.mm.mysql.*;
import java.util.ArrayList;
import java.util.Collections;
import java.sql.*;
import java.util.List;


public class jpanelPlot extends JApplet implements MouseListener, MouseMotionListener{
  double scaleX, scaleY, originX, originY;  
  private List coordsTest, description;
  private double X, Y ;
  
    JTextField txt = new JTextField(10);
    JPanel panel = new JPanel();
    JLabel statusBar = new JLabel("Coords..");
  
 public void init() {
     Container cp = getContentPane();
     cp.setLayout(new BorderLayout());
     
     cp.setBackground(Color.yellow);
     panel.setBackground(Color.white);
     panel.addMouseListener(this);
     panel.addMouseMotionListener(this);
    
     cp.add(panel,BorderLayout.CENTER);
     cp.add(statusBar,BorderLayout.SOUTH);
     show();
 }
 public void start() {
     coordsTest = new ArrayList();  

     // Test coordinaten
    coordsTest.add(new Point2D.Double(10,0.3));
     coordsTest.add(new Point2D.Double(12,0.3));
     coordsTest.add(new Point2D.Double(9,-0.2));
     coordsTest.add(new Point2D.Double(8,1));
     List XValues = new ArrayList();
     List YValues = new ArrayList();
      
    for (Iterator i = coordsTest.iterator(); i.hasNext();) {
        Point2D.Double pt = (Point2D.Double) i.next();
        XValues.add(new Double(pt.x));
        YValues.add(new Double(pt.y));
    }
       
    final double MAXX = ((Double)Collections.max(XValues)).doubleValue();
    final double MINX = ((Double)Collections.min(XValues)).doubleValue();
    final double MAXY = ((Double)Collections.max(YValues)).doubleValue();
    final double MINY = ((Double)Collections.min(YValues)).doubleValue();
    final double rangeX = 20; // range of x values
    final double rangeY = 3; // range of y values
    
    // draw panel
    panel = new JPanel() {
    
     // Plot points on the panel
    public void paintComponent(Graphics g) {
        //super.paintComponent(g);
        
        int width = getWidth();   // get width and height of the canvas
        int height = getHeight();
        scaleX = width/rangeX; // number of pixels per unit x
        scaleY = height/rangeY; // number of pixels per unit y
        originX=0;
        originY=height/2;
        
       System.out.println("coordinaten: "+ coordsTest.get(2));
      // plot the points on the Panel
        for (Iterator i = coordsTest.iterator(); i.hasNext();) {
            Point2D.Double pt = (Point2D.Double)i.next();
            System.out.println("Pt: " + pt);
            g.setColor(Color.red);
            g.fillOval((int)(pt.x*scaleX + originX) , (int)(-pt.y*scaleY + originY) ,5,5);
        }

        // Draw the axes below.
        g.setColor(Color.black);
        g.drawLine(0, (int)originY, width, (int)originY); // x-axis
        g.drawLine((int)originX, 0, (int)originX, height); // y-axis
        // Draw the axes above.

        // Label the axes below.
        int numLabelsX = 1; // Number of X labels.
        int numLabelsY = 1; // Number of Y labels.
        
    // Declare new Font
    Font font = new Font("SanSerif", Font.BOLD, 11);
        // Set current font
        g.setFont(font);
    // Get information about the font
        FontMetrics fm = getFontMetrics(font);

        double ySpacing = height/(numLabelsY);
        for( int y = 0; y <= height; y += ySpacing) {
            g.drawString(Integer.toString((int)((y-originY)/-scaleY)), 
               (int)originX, y==0 ? y+fm.getAscent() : y); // so that the top label won't be missed off
        }

        double xSpacing = width/(numLabelsX);
        for(int x = 0; x <= width; x += xSpacing) {
            String xLabel = Integer.toString((int)((x-originX)/scaleX));
            int lblWidth = fm.stringWidth(xLabel);
                                // make sure right-most label is not missed off
            g.drawString(xLabel, x+lblWidth>width ? width-lblWidth : x, (int)originY);
        }
        // Label the axes above.
      }
    }; // draw panel
   
 } // end run()
 
 public void mouseClicked(MouseEvent event) {
      double expix= 3/scaleX;  // set click boundry
      double expiy= 3/scaleY;
      
      double xPos = event.getX(); // coords of the event retative to the source 
      double yPos = event.getY(); // coords of the event relative to the source
      double xPlot = (double)((xPos-originX)/scaleX); // coords translated to plot dimentions
      double yPlot = (double)((yPos-originY)/-scaleY); // coords translated to plot dimentions

      for (ListIterator i = coordsTest.listIterator(); i.hasNext(); ) {
           Point2D.Double pt = (Point2D.Double)i.next();
           if((Math.abs((double)pt.x - xPlot)) <= expix && (Math.abs((double)pt.x - xPlot)) >= 0 && (Math.abs((double)pt.y - yPlot)) <= expiy && (Math.abs((double)pt.y - yPlot)) >=0) {
                xPlot = (double)pt.x;
                yPlot = (double)pt.y;
                //statusBar.setText("A,M: [" + xPlot + ", " + yPlot + " ]" + " rp-value: " + description.get((i.nextIndex())-1));
                // get rpvalue
               // String rpvalue = "" + description.get((i.nextIndex())-1);
               // displayURL("http://www.ensembl.org/Mus_musculus/contigview?mapfrag=" + rpvalue);
                break;
             }
             else {
                statusBar.setText("no point [" + xPlot + ", " + yPlot + "]");
             }
       }
 }
 
 public void mouseDragged(MouseEvent e) {
 }
 
 public void mouseEntered(MouseEvent e) {
 }
 
 public void mouseExited(MouseEvent e) {
 }
 
 public void mouseMoved(MouseEvent e) {
 }
 
 public void mousePressed(MouseEvent e) {
 }
 
 public void mouseReleased(MouseEvent e) {
 }
 
} // end jpanelPlot

  • Boegel
  • Registratie: Maart 2002
  • Laatst online: 07-01-2018

Boegel

just boegel

Verwijderd schreef op 06 juli 2004 @ 12:21:
code:
1
2
3
4
5
6
7
<knip>

// Plot points on the panel
    public void paintComponent(Graphics g) {
        //super.paintComponent(g);

<knip>
Dit lijkt me geen goed idee... Het niet plaatsen van
code:
1
 super.paintComponent(g);

heeft me al veel problemen opgeleverd.
Krijg je nog steeds vreemde resultaten als je dit in orde brengt ? En al een geprobeerd in een JFrame ipv een JApplet?

[ Voor 3% gewijzigd door Boegel op 06-07-2004 14:15 ]

boegel - er zijn maar 10 soorten mensen in de wereld: diegene die het binaire stelsel kennen en diegene die het niet kennen


Verwijderd

Topicstarter
ja...Ik had
code:
1
2
 public void paintComponent(Graphics g) {
        super.paintComponent(g);

al eens gedaan maar zag geen verschil in de uitvoering van de applet, vandaar dat ik het gecommend had.
Wat JPanel betreft zou dat toch moeten lukken, hij tekent de spots wel alleen gaat er iets mis met het starten en restarten van de applet.
iemand nog suggesties?

  • Robtimus
  • Registratie: November 2002
  • Laatst online: 24-05 11:06

Robtimus

me Robtimus no like you

Op regel 69 assign je aan panel een nieuw object, waar je verder niks mee doet.
Door die assignment verwijst panel naar een nieuw object, en wordt niet je oude panel veranderd.

(wist je trouwens dat je deprecated methods gebruikt? om precies te zijn Component.show())


Als je rangeX en rangeY buiten je start haalt (static final class fields?) en die hele assignment inclusief definitie van paintcomponent aan panel ipv de eerste definitie van panel zet gaat het hier wel goed.

[ Voor 52% gewijzigd door Robtimus op 06-07-2004 15:31 ]

More than meets the eye
There is no I in TEAM... but there is ME
system specs


Verwijderd

Topicstarter
bedank voor je reactie Ice,
Maar ik kwam er niet helemaal uit, ik heb verschillende dingen geprobeerd.
zoals de rangeX en range Y in de init zetten. Maar ik weet niet wat ik met die panel(regel69) en paintComponent moet doen.

Ik dacht dat je een panel moest aanmaken en vervolgens daar de code voor het plotten op die panel neer moest zetten. bv.
code:
1
2
3
4
5
// creer panel
panel = new JPanel() {
    // code om dingen te plotten op de panel
    public void paintComponent(Graphics g) {
      blabla .. plot code


Ik heb de code veranderd naar jou uitleg, maar nogmaals ik ben nog lerende :)
Hij geeft nu alleen een wit vlak weer (de panel background) maar verder doet ie niets. (ook niet als ik restart en resize)

Meer hulp wordt zeer gewaardeerd :)
code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
import javax.swing.*;
import java.awt.event.*;
import java.awt.Container;
import java.awt.FlowLayout;
import java.awt.Graphics;
import java.awt.geom.*;
import java.awt.Color;
import java.awt.Font; 
import java.awt.FontMetrics; 
import java.awt.BorderLayout;
import java.util.Iterator;
import java.util.ListIterator;
import java.util.Vector;
import org.gjt.mm.mysql.*;
import java.util.ArrayList;
import java.util.Collections;
import java.sql.*;
import java.util.List;


public class jpanelPlot extends JApplet {
  double scaleX, scaleY, originX, originY;  
  private List coordsTest, description;
  JPanel panel = new JPanel();
    JLabel statusBar = new JLabel("Coords..");
      
  
 public void init() {
    
     panel.setBackground(Color.white);
     
     Container cp = getContentPane();
     cp.setLayout(new BorderLayout());
    // cp.setBackground(Color.yellow);
     cp.add(panel,BorderLayout.CENTER);
     cp.add(statusBar,BorderLayout.SOUTH);
     //show();
 }
  
 
  final class fields {
      final double rangeX = 20; // range of x values
      final double rangeY = 3; // range of y values
       
      public void paintComponent(Graphics g) {
      //  super.paintComponent(g);
        
        int width = getWidth();   // get width and height of the canvas
        int height = getHeight();
        scaleX = width/rangeX; // number of pixels per unit x
        scaleY = height/rangeY; // number of pixels per unit y
        originX=0;
        originY=height/2;
        
       System.out.println("coordinaten: "+ coordsTest.get(2)); //ff checkuh
      // plot the points on the Panel
        for (Iterator i = coordsTest.iterator(); i.hasNext();) {
            Point2D.Double pt = (Point2D.Double)i.next();
            System.out.println("Pt: " + pt);                    // ff checkuh
            g.setColor(Color.red);
            g.fillOval((int)(pt.x*scaleX + originX) , (int)(-pt.y*scaleY + originY) ,5,5);
        }

        // Draw the axes below.
        g.setColor(Color.black);
        g.drawLine(0, (int)originY, width, (int)originY); // x-axis
        g.drawLine((int)originX, 0, (int)originX, height); // y-axis
        // Draw the axes above.

        // Label the axes below.
        int numLabelsX = 1; // Number of X labels.
        int numLabelsY = 1; // Number of Y labels.
        
    // Declare new Font
    Font font = new Font("SanSerif", Font.BOLD, 11);
        // Set current font
        g.setFont(font);
    // Get information about the font
        FontMetrics fm = getFontMetrics(font);

        double ySpacing = height/(numLabelsY);
        for( int y = 0; y <= height; y += ySpacing) {
            g.drawString(Integer.toString((int)((y-originY)/-scaleY)), 
               (int)originX, y==0 ? y+fm.getAscent() : y); // so that the top label won't be missed off
        }

        double xSpacing = width/(numLabelsX);
        for(int x = 0; x <= width; x += xSpacing) {
            String xLabel = Integer.toString((int)((x-originX)/scaleX));
            int lblWidth = fm.stringWidth(xLabel);
                                // make sure right-most label is not missed off
            g.drawString(xLabel, x+lblWidth>width ? width-lblWidth : x, (int)originY);
        }
        // Label the axes above.
      }
 }
 public void start() {
     coordsTest = new ArrayList();  

     // Test coordinaten
     coordsTest.add(new Point2D.Double(10,0.3));
     coordsTest.add(new Point2D.Double(12,0.3));
     coordsTest.add(new Point2D.Double(9,-0.2));
     coordsTest.add(new Point2D.Double(8,1));
     List XValues = new ArrayList();
     List YValues = new ArrayList();
      
    for (Iterator i = coordsTest.iterator(); i.hasNext();) {
        Point2D.Double pt = (Point2D.Double) i.next();
        XValues.add(new Double(pt.x));
        YValues.add(new Double(pt.y));
    }
  
 } // end start
 
 
} // end jpanelPlot

[ Voor 18% gewijzigd door Verwijderd op 06-07-2004 16:48 ]


  • Robtimus
  • Registratie: November 2002
  • Laatst online: 24-05 11:06

Robtimus

me Robtimus no like you

Java:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
// imports

public class jpanelPlot extends JApplet {
    static final double rangeX = 20; // range of x values
    static final double rangeY = 3; // range of y values

    double scaleX, scaleY, originX, originY;  
    private List coordsTest, description;

    JPanel panel = new JPanel() {
        protected void paintComponent(Graphics g) { // waarom public??
            super.paintComponent(g);
            // rest hier
        }
    };
    JLabel statusBar = new JLabel("Coords..");
  
    public void init() {
        panel.setBackground(Color.white);

        Container cp = getContentPane();
        cp.setLayout(new BorderLayout());
        cp.setBackground(Color.yellow);
        cp.add(panel,BorderLayout.CENTER);
        cp.add(statusBar,BorderLayout.SOUTH);
        setVisible(true);
    }

    public void start() {
        // doe je stuff hier
    } // end start
} // end jpanelPlot  

rangeX en rangeY zijn dus velden van je klasse (static zorgt ervoor dat ze voor alle objecten van de klasse gelijk zijn).
Verder creeerde je je panel eerst goed, alleen op de verkeerde plek. Zoals ik het heb gezet wordt er nml maar 1 panel gecreeerd, met zijn eigen paintComponent (een zogenaamde anonieme klasse). Jij creeerde er eerst 2, waarvan de goede niet eens werd toegevoegd aan je applet.

More than meets the eye
There is no I in TEAM... but there is ME
system specs


Verwijderd

Topicstarter
bedankt voor je hulp ice het werkt, ik kan nu zelf verder met de db connectie.

Verwijderd

offtopic:
Waarom teken je dit allemaal zelf. Al eens gekeken naar JFreechart?
http://www.jfree.org/jfreechart

Verwijderd

Topicstarter
omdat ik alleen een scatter plot hoef te maken met data uit een database.
Ik probeer er straks een jsp van te maken, alleen was ik nu aan het proberen of ik
data punten uit de database in de plot kon zetten. Dit gaat nu redelijk :)
Pagina: 1