Hey Java Forum!
Also erstmal ein bischen code..
Also obrige Methode wird von paintComponent() meiner Visualisierungsklasse aufgerufen. Sie zeichnet im Prinzip einen Graphen. Auf der X-Achse wird eine numerierte Basensequenz (DNA) gezeichnet und die Y-Achse gibt Scores von 0-100% an. Funktioniert an sich auch wunderbar. Der Haken liegt jetzt in der Größe.
Für kurze Sequenzen läuft es flüssig, wenn nun aber Sequenzen die millionen und mehr Basenpaare lang sind dargestellt werden sollen so kann man ja nicht mehr alles zeichnen - mist und jetzt?
Also klar ist das ich die for schleifen irgendwie abändern muss - leider verstehe ich aber grundsätzlich diese Sache mit dem parameterisierten repaint(Rectangle r) nicht.
Ich hab mir auch überlegt das ich vielleicht jedem WindowScore Object ( jedes ist ein treffer und enthält infos über position und score und teilsequence) eine paint methode verpassen sollte und sie somit quasie intelligent Gestalte indem sie eigenständig entscheiden können ob sie gezeichnet werden müssen. Nicht desto trotz ist mir das mit dem parameterisierten repaint() irgendwie unklar...
Bitte um Vorschläge wie ich solche extrem großen Komponenten noch flüssig teilzeichnen kann.
Die Komponente ist in eine JScrollPane eingepackt und von dort sollte ja dann auch der sichtbare Bereich übergeben werden - aber wie?
Also erstmal ein bischen code..
Code:
private void drawSequenzeAndScaleAndScores(Graphics g) {
if(analysedSequence!=null){
Dimension d = getActualComSize();
int widthPlus = 0;
// draws the base sequence and positions
for(int i=0,n=analysedSequence.length();i<n;++i){
g.setFont(fontBase);
//base sequence
g.drawString(getBase(analysedSequence.charAt(i)),
((int) (d.width-(d.width-30)))+widthPlus,((int) (d.height-(d.height-d.height/1.1f))));
Integer tmp = i+1;
int shiftY = ((getBaseWidth(analysedSequence.charAt(i)))-getPosWidth(tmp.toString()))/2;
g.setFont(fontPosition);
//positions
g.drawString(tmp.toString(),
((int) (d.width-(d.width-30)))+widthPlus+shiftY,((int) (d.height-(d.height-d.height/1.06f))));
widthPlus+= getBaseWidth(analysedSequence.charAt(i));
}
// draws the percent axis
g.drawLine((int) (d.width-(d.width-20)), // x
d.height-(d.height-5), // y
(int) (d.width-(d.width-20)), // x
((int) (d.height-(d.height-d.height/1.12f)))-fontBaseHigh); // y
float scaleLength = ((d.height-(d.height-5))-(((int) (d.height-(d.height-d.height/1.12f)))-fontBaseHigh))*-1.0f;
float tenPercent = scaleLength/10.0f;
float oneUp= 0.0f;
int unit = 0;
// draws the percent scale units
for(int i=0;i<10;++i){
Integer tennerUnits = new Integer(unit);
g.drawString(tennerUnits.toString(),(int) (d.width-d.width),
(((int) (d.height-(d.height-d.height/1.12f)))-fontBaseHigh)-(int)oneUp);
unit+=10;
oneUp+=tenPercent;
}
preferedXsize = widthPlus+100;
preferedYsize = (int) (scaleLength+fontBaseHigh+fontPosHigh+30);
// draws the scores
float onePercent = scaleLength/100.0f;
for(int i=0, n=allScores.size();i<n;++i){
WindowScore tmp = (WindowScore) allScores.get(i);
int shiftYleft = getBaseWidth(analysedSequence.charAt(tmp.getLeftPosition()))/2;
g.setColor(Color.red);
g.fillRect((int) ((d.width-(d.width-30))+getXforBar(tmp.getLeftPosition()))+shiftYleft,
(int) ((int) (d.height-(d.height-d.height/1.12f))-fontBaseHigh-(tmp.getScore()*onePercent)),
(int) getXforBar(matrixLength-1),
(int) (tmp.getScore()*onePercent));
g.setColor(Color.black);
g.drawRect((int) ((d.width-(d.width-30)+getXforBar(tmp.getLeftPosition()))+shiftYleft),
(int) ((int) (d.height-(d.height-d.height/1.12f))-fontBaseHigh-(tmp.getScore()*onePercent)),
(int) getXforBar(matrixLength-1),
(int) (tmp.getScore()*onePercent));
}
}
Also obrige Methode wird von paintComponent() meiner Visualisierungsklasse aufgerufen. Sie zeichnet im Prinzip einen Graphen. Auf der X-Achse wird eine numerierte Basensequenz (DNA) gezeichnet und die Y-Achse gibt Scores von 0-100% an. Funktioniert an sich auch wunderbar. Der Haken liegt jetzt in der Größe.
Für kurze Sequenzen läuft es flüssig, wenn nun aber Sequenzen die millionen und mehr Basenpaare lang sind dargestellt werden sollen so kann man ja nicht mehr alles zeichnen - mist und jetzt?
Also klar ist das ich die for schleifen irgendwie abändern muss - leider verstehe ich aber grundsätzlich diese Sache mit dem parameterisierten repaint(Rectangle r) nicht.
Ich hab mir auch überlegt das ich vielleicht jedem WindowScore Object ( jedes ist ein treffer und enthält infos über position und score und teilsequence) eine paint methode verpassen sollte und sie somit quasie intelligent Gestalte indem sie eigenständig entscheiden können ob sie gezeichnet werden müssen. Nicht desto trotz ist mir das mit dem parameterisierten repaint() irgendwie unklar...
Bitte um Vorschläge wie ich solche extrem großen Komponenten noch flüssig teilzeichnen kann.
Die Komponente ist in eine JScrollPane eingepackt und von dort sollte ja dann auch der sichtbare Bereich übergeben werden - aber wie?