Hallo Leute,
also ich habe folgenden Anwenungszweck. Ich habe eine Tabelle + mehrere Dendrogramme die mit der Tabelle über ScrollPanes aliniert sind. Sprich scrollt man dann scrollen die Dendrogramme mit.
Nun hat der Benutzer auch die Möglichkeit die Sachen zu exportieren. Da gibt es im ersten Schritt zwei Anwendungsfälle. Er kann alles oder einfach den aktuellen Bildschirm Inhalt exportieren.
So jetzt muss ich dazu sagen ich habe die Funktionen die kommen nicht geschrieben sondern soll diese anpassen. Ich habe diese versucht zu verstehen und auch wo der Fehler auftritt.
Folgendes Problem habe ich. Man kann die Größe des Tables ändern, was ebenfalls die Größe der Dendrogramme ändert. Diese Funktion merkt sich auch den aktuellen ScrollBar Wert für beide Achsen und Setzt diesen nachdem alle Änderungen gemacht wurden prozentual wieder hin (das stimmt meist bis auf ein bis zwei Pixel).
Das Ändern der Größe (ist eine Methode in einer Klasse die von JTable erbt):
Ich könnte euch hier jede Menge Zeilen posten werde dies aber erstmal nicht machen (scrollToFocus oder scrollToFocusUpdate).
Beim Export ist es so das ein Panel exportiert wird. Sprich was in dem Panel ist wird auch exportiert (als PNG z.B.). Hier ist die Export Methode:
Die wichtige Unterscheid beginnt bei Zeile 18. Der Alles Fall ist super da habe ich ja keine Begrenzung durch die ScrollPane. Wenn dann der untere Teil ausgeführt wird (ab Zeile 152). Wenn ich die beiden Zeilen (186 und 187) einblenden dann exportiert der auch den richtigen Teil allerdings nicht den Teil der durch die ScrollPane sichtbar ist also wo der Benutzer hingescrollt hat. Wenn ich den Teil ausblende dann funktioniert das für das topPnl (wo das Table enthalten ist) aber die anderen Teile werden gar nicht angezeigt in dem Bild. Also der Teil ist einfach grau. Nehme ich das validate auf das Hauptframe wieder rein geht es.
Ganz lange Rede kurzer Sinn. Versteht hier einer was ich vorhabe und kann sich ungefähr vorstellen wie das abläuft? Und warum es für Teile funktioniert wenn ich das frame.validate() auskommentiere? Gibt es vielleicht andere bessere Lösung, um an den sichtbaren Teil eines Panels welches in einer ScrollPane steckt zu kommen?
Hoffe ihr könnt mir helfen und sorry wenn das so ein langer post ist aber ich habe versucht die wichtigen Teile zu posten.
also ich habe folgenden Anwenungszweck. Ich habe eine Tabelle + mehrere Dendrogramme die mit der Tabelle über ScrollPanes aliniert sind. Sprich scrollt man dann scrollen die Dendrogramme mit.
Nun hat der Benutzer auch die Möglichkeit die Sachen zu exportieren. Da gibt es im ersten Schritt zwei Anwendungsfälle. Er kann alles oder einfach den aktuellen Bildschirm Inhalt exportieren.
So jetzt muss ich dazu sagen ich habe die Funktionen die kommen nicht geschrieben sondern soll diese anpassen. Ich habe diese versucht zu verstehen und auch wo der Fehler auftritt.
Folgendes Problem habe ich. Man kann die Größe des Tables ändern, was ebenfalls die Größe der Dendrogramme ändert. Diese Funktion merkt sich auch den aktuellen ScrollBar Wert für beide Achsen und Setzt diesen nachdem alle Änderungen gemacht wurden prozentual wieder hin (das stimmt meist bis auf ein bis zwei Pixel).
Das Ändern der Größe (ist eine Methode in einer Klasse die von JTable erbt):
Java:
//merken des focus in der scrollbar
scrollToFocus(cellsize,false);
//merken von cellsize
zoomfactor = cellsize;
this.setCellSize(cellsize);
//nur wenn es das linke dendrogram gibt
if(HeatMapHelper.hasyDendrogram()){
mw.createyDendrogram(false);
mw.showyDendrogram(mw.getLabelWidth());
}
//rechtes gibt es immer und dann werden die sachen da gemacht
mw.getxDendrogram().setCellSize(cellsize);
mw.getxDendrogram().getDendrogram().setAddValue(cellsize);
mw.showxDendrogram(mw.getxDendrogram());
//update den split zwischen den panels
mw.updateSplit();
mw.setSelectedCellSize(cellsize);
//den tableheader formatieren
formatRowHeader(forexport);
//scroll zu dem prozentuallen scrollbar wert
scrollToFoucsUpdate();
this.repaint();
Ich könnte euch hier jede Menge Zeilen posten werde dies aber erstmal nicht machen (scrollToFocus oder scrollToFocusUpdate).
Beim Export ist es so das ein Panel exportiert wird. Sprich was in dem Panel ist wird auch exportiert (als PNG z.B.). Hier ist die Export Methode:
Java:
public Component getExportPanel(boolean hm, boolean s_tree, boolean a_tree, boolean anno, boolean all, Object cellsize){
int docell = Integer.valueOf(cellsize.toString());
JPanel returnpnl = new JPanel();
boolean hasDendro = HeatMapHelper.hasyDendrogram();
//change cellsize for table and all other components
int tableHeight = table.getHeight();
int headerHeight = table.getTableHeader().getHeight();
oldAssayHeight = assaySplit.getDividerLocation();
fontexport = new Font("Dialog",Font.BOLD,Table.getCellSize());
oldCellSize = Table.getCellSize();
table.performCellSize(docell,true);
table.repaint();
if(all){
//build returnpnl which is the panel with the export components
JPanel northPanel = null;
JPanel centerPanel = null;
JPanel mapPanel = null;
returnpnl = new JPanel();
returnpnl.setLayout(new BoxLayout(returnpnl, BoxLayout.PAGE_AXIS));
//decision for layout
if(s_tree && !anno && !hm && !a_tree){
returnpnl.setLayout(new FlowLayout(FlowLayout.LEFT,0,0));
}else if(a_tree && !s_tree && !anno && !hm){
returnpnl.setLayout(new FlowLayout(FlowLayout.LEFT,0,0));
}
xDendrogram xDendroTmp = (xDendrogram) xDendrogram.clone();
int fixedTblHeight = table.getRowHeader().getHeight();
int fixedTblWidth = table.getRowHeader().getWidth();
tableOld = table.getParent();
rowHeaderOld = table.getRowHeader().getParent();
rowHeaderHeaderOld = table.getRowHeader().getTableHeader().getParent();
yDendrogram yDendroTmp = (yDendrogram) yDendrogram.clone();
if(a_tree){
northPanel = new JPanel(new FlowLayout(FlowLayout.RIGHT,0,0));
northPanel.add(xDendroTmp.getDendrogram());
}
table.getRowHeader().setAlignmentY(Component.TOP_ALIGNMENT);
table.getRowHeader().setAlignmentX(Component.LEFT_ALIGNMENT);
table.setAlignmentY(Component.TOP_ALIGNMENT);
table.setAlignmentX(Component.RIGHT_ALIGNMENT);
if (s_tree){
yDendroTmp.getDendrogram().setAlignmentY(Component.TOP_ALIGNMENT);
mapPanel = new JPanel();
if(hm || anno) mapPanel.setLayout(new BoxLayout(mapPanel, BoxLayout.LINE_AXIS));
else{
mapPanel.setLayout(new FlowLayout(FlowLayout.RIGHT,0,0));
}
Dimension d = new Dimension(yDendroTmp.getDendrogram().getWidth()+2, yDendroTmp.getDendrogram().getHeight());
yDendroTmp.getDendrogram().setSize(d);
yDendroTmp.getDendrogram().setPreferredSize(d);
yDendroTmp.getDendrogram().setMaximumSize(d);
yDendroTmp.getDendrogram().setMinimumSize(d);
yDendroTmp.getDendrogram().repaint();
mapPanel.add(yDendroTmp.getDendrogram());
}
if(hm && anno){
centerPanel = new JPanel(new FlowLayout(FlowLayout.RIGHT,0,0));
centerPanel.add(table.getRowHeader().getTableHeader());
centerPanel.add(table.getTableHeader());
if(mapPanel == null){
mapPanel = new JPanel();
mapPanel.setLayout(new BoxLayout(mapPanel, BoxLayout.LINE_AXIS));
}
mapPanel.add(table.getRowHeader());
mapPanel.add(table);
}else if(anno && !hm){
centerPanel = new JPanel(new FlowLayout(FlowLayout.RIGHT,0,0));
centerPanel.add(table.getRowHeader().getTableHeader());
if(mapPanel == null){
mapPanel = new JPanel();
mapPanel.setLayout(new BoxLayout(mapPanel, BoxLayout.LINE_AXIS));
}
mapPanel.add(table.getRowHeader());
}else if(!anno && hm){
centerPanel = new JPanel(new FlowLayout(FlowLayout.RIGHT,0,0));
centerPanel.add(table.getTableHeader());
if(mapPanel == null){
mapPanel = new JPanel();
mapPanel.setLayout(new BoxLayout(mapPanel, BoxLayout.LINE_AXIS));
}
mapPanel.add(table.getRowHeader());
mapPanel.add(table);
}
if(northPanel != null) northPanel.setAlignmentX(Component.RIGHT_ALIGNMENT);
if(centerPanel != null) centerPanel.setAlignmentX(Component.RIGHT_ALIGNMENT);
if(mapPanel != null) mapPanel.setAlignmentX(Component.RIGHT_ALIGNMENT);
if(northPanel != null) returnpnl.add(northPanel);
if(centerPanel != null) returnpnl.add(centerPanel);
if(mapPanel != null) returnpnl.add(mapPanel);
returnpnl.setVisible(true);
returnpnl.updateUI();
exportFrame = new JFrame();
exportFrame.setLayout(new BorderLayout());
exportFrame.add(returnpnl,BorderLayout.CENTER);
exportFrame.pack();
//calculating sizes for all
if(hm && anno || hm && !anno){
exportWidth = table.getRowHeader().getWidth()+table.getColumnCount()*docell;
exportHeight = table.getTableHeader().getHeight()+table.getRowCount()*docell;
}
if(anno && !hm){
exportWidth = fixedTblWidth;
exportHeight = fixedTblHeight + table.getRowHeader().getTableHeader().getHeight();
}
if(a_tree){
exportHeight += xDendroTmp.getDendrogram().getHeight();
if(exportWidth == 0) exportWidth = xDendroTmp.getDendrogram().getWidth();
}
if (s_tree){
exportWidth += yDendroTmp.getDendrogram().getWidth();
if(exportHeight == 0) exportHeight = table.getRowCount()*docell;
}
if(hm && anno || hm && !anno && !a_tree && !s_tree){
exportHeight += 5;
}
//set sizes
returnpnl.setPreferredSize(new Dimension(exportWidth,exportHeight));
returnpnl.setSize(new Dimension(exportWidth,exportHeight));
returnpnl.setMinimumSize(new Dimension(exportWidth,exportHeight));
returnpnl.setMaximumSize(new Dimension(exportWidth,exportHeight));
returnpnl.updateUI();
exportFrame.repaint();
return returnpnl;
}else{
if(scrl.getVerticalScrollBar()!=null && scrl.getVerticalScrollBar().isVisible()){
if(tableHeight > scrl.getVerticalScrollBar().getHeight()){
tableHeight = scrl.getVerticalScrollBar().getHeight();
}
exportWidthOffset = scrl.getVerticalScrollBar().getWidth();
}
// Height of table + height of header + margin between table & header
exportHeight = tableHeight + headerHeight + 6;
}
if(!a_tree) {
assaySplit.setDividerLocation(1);
assaySplit.updateUI();
}
else exportHeight += oldAssayHeight;
if(s_tree && hasDendro && yDendrogram != null){
//slider.setVisible(false);
//pnlcutoffvalue.setVisible(false);
yDendrogram.getScrollPane().getHorizontalScrollBar().setVisible(false);
yDendrogram.getScrollPane().getVerticalScrollBar().setVisible(false);
}
if(!hm){
table.setVisible(false);
table.getRowHeader().setVisible(false);
table.getTableHeader().setVisible(false);
}
leftPnl.updateUI();
rightPnl.updateUI();
topPnl.updateUI();
pnl.updateUI();
//frame.invalidate();
//frame.validate();
if(hm && !s_tree && a_tree) return rightPnl;
if(hm && !s_tree && !a_tree){
exportHeight-=5;
return pnlheatmap;
}
if(!hm && !s_tree && a_tree) return pnlassaydendrogram;
if(!hm && s_tree && !a_tree){
returnpnl = pnlsubstdendrogram;
return returnpnl;
}
return topPnl;
}
Die wichtige Unterscheid beginnt bei Zeile 18. Der Alles Fall ist super da habe ich ja keine Begrenzung durch die ScrollPane. Wenn dann der untere Teil ausgeführt wird (ab Zeile 152). Wenn ich die beiden Zeilen (186 und 187) einblenden dann exportiert der auch den richtigen Teil allerdings nicht den Teil der durch die ScrollPane sichtbar ist also wo der Benutzer hingescrollt hat. Wenn ich den Teil ausblende dann funktioniert das für das topPnl (wo das Table enthalten ist) aber die anderen Teile werden gar nicht angezeigt in dem Bild. Also der Teil ist einfach grau. Nehme ich das validate auf das Hauptframe wieder rein geht es.
Ganz lange Rede kurzer Sinn. Versteht hier einer was ich vorhabe und kann sich ungefähr vorstellen wie das abläuft? Und warum es für Teile funktioniert wenn ich das frame.validate() auskommentiere? Gibt es vielleicht andere bessere Lösung, um an den sichtbaren Teil eines Panels welches in einer ScrollPane steckt zu kommen?
Hoffe ihr könnt mir helfen und sorry wenn das so ein langer post ist aber ich habe versucht die wichtigen Teile zu posten.