package fr.unistra.pelican.gui; import java.awt.BorderLayout; import java.awt.Color; import java.awt.Cursor; import java.awt.Dimension; import java.awt.GridBagConstraints; import java.awt.GridBagLayout; import java.awt.GridLayout; import java.awt.Insets; import java.awt.Point; import java.awt.event.MouseAdapter; import java.awt.event.MouseEvent; import java.awt.event.MouseListener; import java.awt.event.MouseMotionListener; import java.awt.image.BufferedImage; import java.awt.image.DataBuffer; import java.awt.image.DataBufferByte; import java.awt.image.Raster; import java.awt.image.SampleModel; import javax.media.jai.RasterFactory; import javax.swing.BorderFactory; import javax.swing.BoxLayout; import javax.swing.JFrame; import javax.swing.JLabel; import javax.swing.JPanel; import javax.swing.JScrollPane; import javax.swing.JSlider; import javax.swing.ScrollPaneConstants; import javax.swing.ScrollPaneLayout; import javax.swing.SwingConstants; import javax.swing.event.ChangeEvent; import javax.swing.event.ChangeListener; import com.sun.media.jai.widget.DisplayJAI; import fr.unistra.pelican.ByteImage; import fr.unistra.pelican.Image; /** - This class creates a JFrame for the visualisation of byte valued images (fr.unistra.pelican format). * - Multiple channels and frames are only showed one image at a time by means of sliders. * - Only the case of images with exactly 3 channels and the parameter "color" set, results in color. * - ThreeDimensional(x,y,z) images are shown in 3 displays : face view (XY),left view (ZY) and bottom view (XZ) * ___x ___z * | | * y| y| * * ___x * | * z| * * - User can navigate(slide) through X/Y/Z/B/T axis using sliders. * - While grabbing (mouseClick+mouseMove) over each display User can navigate(slide) through the two other views. * - A status bar gives information about the pixel pointed an its gray(color) byte value(s). * TODO * 1/. mise en page: forcer une largeur minimale =400px afin que les infoBarText soient affichées entièrement. * 2/. implémenter fonction snapShot sur bouton(ou click gauche+ menu= snap 1 ou 3 displays) ! ---> nécessite accès fileSystem... //BouloBoulo * 3/. tester autres formats d'image: tiff, video*, Dicom, brainWeb ... * 4/. tester la dimension T !!! + video* * 5/. factoriser + le code ? reflechir a l'emplacement des methodes ? (normé / structure projet?): * - 3 nouvelles Méthodes dans frame3x2D : loadDisplayXY(), loadDisplayZY() et loadDisplayXZ(). + methode loadAllDisplays(); * - 1 Méthode pour tester isTrheeD au chargement(constructeur) et n'afficher qu'un seul display si 3D==false. * * * @author M.Sablier * @version 0.9 */ public class Frame3x2D extends JFrame { private Image img; private boolean color; final int xdim; final int ydim; final int bdim; final int tdim; final int zdim; private JPanel slidersSubPanel; private JScrollPane scrollSubPanel; private JPanel infoBarSubPanel; private JPanel slidersBTCont; private JPanel slidersXYZCont; private JPanel displaysCont; private JLabel infoBar; private JPanel sliderBBox; private JPanel sliderTBox; private JPanel sliderXBox; private JPanel sliderYBox; private JPanel sliderZBox; private JPanel displayXYCont; private JPanel displayZYCont; private JPanel displayXZCont; private String infoBarText; private JLabel sliderBLabel; private JSlider sliderBSlide; private JLabel sliderTLabel; private JSlider sliderTSlide; private JLabel sliderXLabel; private JSlider sliderXSlide; private JLabel sliderYLabel; private JSlider sliderYSlide; private JLabel sliderZLabel; private JSlider sliderZSlide; private DisplayJAI[] displayXY; private DisplayJAI[] displayZY; private DisplayJAI[] displayXZ; private int x; private int y; private int z; private int t; private int b; private boolean SurvolDisplayXYCont; private boolean SurvolDisplayZYCont; private boolean SurvolDisplayXZCont; Point displayXYLocation; Point displayXYContLocation; Point displayZYLocation; Point displayZYContLocation; Point displayXZLocation; Point displayXZContLocation; public Frame3x2D(fr.unistra.pelican.Image img,String title,boolean color) { this(img,color); if(title != null) this.setTitle(title); } public Frame3x2D(fr.unistra.pelican.Image img,boolean color) { xdim = img.getXDim(); ydim = img.getYDim(); bdim = img.getBDim(); tdim = img.getTDim(); zdim = img.getZDim(); this.img = img; final Frame3x2D ben = this;//:{ this.color = color; if(this.color == true && bdim != 3){ System.err.println("Only " + bdim + " channel" + ((bdim>1)?"s ":" ") + "found. Color visualisation cancelled"); this.color = false; } //______//DISPLAYS //DisplayXY displayXY = null; this.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE); DataBufferByte dbbXY; SampleModel sXY; Raster rXY; BufferedImage bimgXY = null; byte[] tmp2gray; byte[] tmp2color; if(this.color == false){ displayXY = new DisplayJAI[bdim * tdim * zdim]; for(int b = 0; b < bdim; b++){ for(int t = 0; t < tdim; t++){ for(int z = 0; z < zdim; z++){ ByteImage tmp = img.getByteChannelZTB(z,t,b); tmp2gray = new byte[tmp.size()]; for(int i = 0; i < tmp.size(); i++) tmp2gray[i] = (byte)tmp.getPixelByte(i); dbbXY = new DataBufferByte(tmp2gray,tmp.size()); sXY = RasterFactory.createBandedSampleModel(DataBuffer.TYPE_BYTE,tmp.getXDim(),tmp.getYDim(),1); rXY = RasterFactory.createWritableRaster(sXY,dbbXY,new Point(0,0)); bimgXY = new BufferedImage(tmp.getXDim(),tmp.getYDim(),BufferedImage.TYPE_BYTE_GRAY); bimgXY.setData(rXY); displayXY[b * tdim * zdim + t * zdim + z] = new DisplayJAI(bimgXY); } } } } if(this.color == true){ displayXY = new DisplayJAI[tdim * zdim]; int[] bandOffsets = {0,1,2}; for(int t = 0; t < tdim; t++){ for(int z = 0; z < zdim; z++){ ByteImage tmp = img.getColorByteChannelZT(z,t); tmp2color = new byte[tmp.size()]; for(int i = 0; i < tmp.size(); i++) tmp2color[i] = (byte)tmp.getPixelByte(i); dbbXY = new DataBufferByte(tmp2color,tmp.size()); sXY = RasterFactory.createPixelInterleavedSampleModel(DataBuffer.TYPE_BYTE,tmp.getXDim(),tmp.getYDim(),bdim,bdim * tmp.getXDim(),bandOffsets); rXY = RasterFactory.createWritableRaster(sXY,dbbXY,new Point(0,0)); bimgXY = new BufferedImage(tmp.getXDim(),tmp.getYDim(),BufferedImage.TYPE_3BYTE_BGR); bimgXY.setData(rXY); displayXY[t * zdim + z] = new DisplayJAI(bimgXY); } } } //DisplayZY displayZY = null; DataBufferByte dbbZY; SampleModel sZY; Raster rZY; BufferedImage bimgZY = null; if(this.color == false){ displayZY = new DisplayJAI[bdim * tdim * xdim]; for(int b = 0; b < bdim; b++){ for(int t = 0; t < tdim; t++){ for(int x = (xdim-1); x >=0 ; x--){ ByteImage tmp = img.getByteChannelXTB(x, t, b); byte[] tmp2 = new byte[tmp.size()]; for(int i = 0; i<tmp.size(); i++) tmp2[i] = (byte)tmp.getPixelByte(i); dbbZY = new DataBufferByte(tmp2,tmp.size()); sZY = RasterFactory.createBandedSampleModel(DataBuffer.TYPE_BYTE,tmp.getXDim(),tmp.getYDim(),1); rZY = RasterFactory.createWritableRaster(sZY,dbbZY,new Point(0,0)); bimgZY = new BufferedImage(tmp.getXDim(),tmp.getYDim(),BufferedImage.TYPE_BYTE_GRAY); bimgZY.setData(rZY); displayZY[b * tdim * xdim + t * xdim + x] = new DisplayJAI(bimgZY); } } } } if(this.color == true){ displayZY = new DisplayJAI[tdim * xdim]; int[] bandOffsets = {0,1,2}; for(int t = 0; t < tdim; t++){ for(int x = (xdim-1); x >=0 ; x--){ ByteImage tmp = img.getColorByteChannelXT(x,t); byte[] tmp2 = new byte[tmp.size()]; for(int i = 0; i < tmp.size(); i++) tmp2[i] = (byte)tmp.getPixelByte(i); dbbZY = new DataBufferByte(tmp2,tmp.size()); sZY = RasterFactory.createPixelInterleavedSampleModel(DataBuffer.TYPE_BYTE,tmp.getXDim(),tmp.getYDim(),bdim,bdim * tmp.getXDim(),bandOffsets); rZY = RasterFactory.createWritableRaster(sZY,dbbZY,new Point(0,0)); bimgZY = new BufferedImage(tmp.getXDim(),tmp.getYDim(),BufferedImage.TYPE_3BYTE_BGR); bimgZY.setData(rZY); displayZY[t * xdim + x] = new DisplayJAI(bimgZY); } } } //displayXZ displayXZ = null; DataBufferByte dbbXZ; SampleModel sXZ; Raster rXZ; BufferedImage bimgXZ = null; if(this.color == false){ displayXZ = new DisplayJAI[bdim * tdim * ydim]; for(int b = 0; b < bdim; b++){ for(int t = 0; t < tdim; t++){ for(int y = (ydim-1); y >=0 ; y--){ ByteImage tmp = img.getByteChannelYTB(y, t, b); byte[] tmp2 = new byte[tmp.size()]; for(int i = 0; i<tmp.size(); i++) tmp2[i] = (byte)tmp.getPixelByte(i); dbbXZ = new DataBufferByte(tmp2,tmp.size()); sXZ = RasterFactory.createBandedSampleModel(DataBuffer.TYPE_BYTE,tmp.getXDim(),tmp.getYDim(),1); rXZ = RasterFactory.createWritableRaster(sXZ,dbbXZ,new Point(0,0)); bimgXZ = new BufferedImage(tmp.getXDim(),tmp.getYDim(),BufferedImage.TYPE_BYTE_GRAY); bimgXZ.setData(rXZ); displayXZ[b * tdim * ydim + t * ydim + y] = new DisplayJAI(bimgXZ); } } } } if(this.color == true){ displayXZ = new DisplayJAI[tdim * ydim]; int[] bandOffsets = {0,1,2}; for(int t = 0; t < tdim; t++){ for(int y = (ydim-1); y >=0 ; y--){ ByteImage tmp = img.getColorByteChannelYT(y,t); byte[] tmp2 = new byte[tmp.size()]; for(int i = 0; i < tmp.size(); i++) tmp2[i] = (byte)tmp.getPixelByte(i); dbbXZ = new DataBufferByte(tmp2,tmp.size()); sXZ = RasterFactory.createPixelInterleavedSampleModel(DataBuffer.TYPE_BYTE,tmp.getXDim(),tmp.getYDim(),bdim,bdim * tmp.getXDim(),bandOffsets); rXZ = RasterFactory.createWritableRaster(sXZ,dbbXZ,new Point(0,0)); bimgXZ = new BufferedImage(tmp.getXDim(),tmp.getYDim(),BufferedImage.TYPE_3BYTE_BGR); bimgXZ.setData(rXZ); displayXZ[t * ydim + y] = new DisplayJAI(bimgXZ); } } } //______//FRAME ROOT //rootPanel// JPanel rootPanel = new JPanel(); rootPanel.setPreferredSize(new Dimension( (19)+ 10+(10+xdim+10)+10+(10+zdim+10)+10 , (19)+ (80)+ 10+(10+ydim+10)+10+(10+zdim+10)+10 +(30) )); //TODO:forcer une taille minimale largeur=400px afin que les infoBarSuPanelText soient affichées entièrement //if(rootPanel.getSize().width<400) // rootPanel.setSize(400 , (19)+ (80)+ 10+(10+ydim+10)+10+(10+zdim+10)+10 + (30) ); rootPanel.setLayout(new BorderLayout(0,0)); rootPanel.setBackground(java.awt.Color.red); this.setContentPane(rootPanel); //______//FRAME CENTER //rootPanel(CENTER)/ <-- //scrollSubPanel// scrollSubPanel = new JScrollPane(ScrollPaneConstants.VERTICAL_SCROLLBAR_AS_NEEDED,ScrollPaneConstants.HORIZONTAL_SCROLLBAR_AS_NEEDED); scrollSubPanel.setPreferredSize(new Dimension( (19)+ 10+(10+xdim+10)+10+(10+zdim+10)+10 , (19)+ 10+(10+ydim+10)+10+(10+zdim+10)+10)); scrollSubPanel.setLayout(new ScrollPaneLayout()); scrollSubPanel.setBorder(BorderFactory.createLineBorder(Color.black)); scrollSubPanel.setBackground(java.awt.Color.white); rootPanel.add(scrollSubPanel, BorderLayout.CENTER); //rootPanel(CENTER)/scrollSubPanel/ <-- //displaysCont// displaysCont = new JPanel(); displaysCont.setSize(new Dimension(10+(10+xdim+10)+10+(10+zdim+10)+10 , 10+(10+ydim+10)+10+(10+zdim+10)+10 )); displaysCont.setLayout(new GridBagLayout()); displaysCont.setBackground(java.awt.Color.GRAY); scrollSubPanel.setViewportView(displaysCont); //rootPanel(CENTER)/scrollSubPanel/displaysCont/ <-- //displayXYCont// displayXYCont = new JPanel(); displayXYCont.setSize(10+xdim+10, 10+ydim+10); displayXYCont.setLayout(new GridBagLayout()); //survolXYCont MouseListener survolXYCont = new MouseAdapter() { public void mouseEntered(MouseEvent e) { SurvolDisplayXYCont = true; SurvolDisplayZYCont = false; SurvolDisplayXZCont = false; displayXYLocation = displayXY[z].getLocation(); displayXYContLocation = displayXYCont.getLocation(); } public void mouseExited (MouseEvent e) { SurvolDisplayXYCont = false; } public void mouseClicked(MouseEvent e) { /*takeSnapShot(); System.out.println("clicked*snap");*/ } }; //add displayXYCont.addMouseListener(survolXYCont); //viseurXYCont MouseMotionListener viseurXYCont = new MouseMotionListener() { public void mouseMoved(MouseEvent e) { Cursor croix = new Cursor(CROSSHAIR_CURSOR); displayXYCont.getComponent(0).setCursor(croix); } public void mouseDragged(MouseEvent e) { if(SurvolDisplayXYCont==true){ x= (int)e.getX() - (int)displayXYLocation.getX(); y= (int)e.getY() - (int)displayXYLocation.getY(); if(x>=xdim)x=xdim-1; if(x<0)x=0; if(y>=ydim)y=ydim-1; if(y<0)y=0; updateDisplayZY(); updateDisplayXZ(); updateSlidersSlide(); } } }; //add displayXYCont.addMouseMotionListener(viseurXYCont); displaysCont.add(displayXYCont, new GridBagConstraints(0,0,1,1,0,0,GridBagConstraints.CENTER,GridBagConstraints.NONE,new Insets(10,10,10,10), 0, 0)); //rootPanel(CENTER)/scrollSubPanel/displaysCont/ <-- //displayZYCont// displayZYCont= new JPanel(); displayZYCont.setSize(10+zdim+10, 10+ydim+10); displayZYCont.setLayout(new GridBagLayout()); //survolZYCont MouseListener survolZYCont = new MouseAdapter() { public void mouseEntered(MouseEvent e) { SurvolDisplayXYCont = false; SurvolDisplayZYCont = true; SurvolDisplayXZCont = false; displayZYLocation = displayZY[0].getLocation(); displayZYContLocation = displayZYCont.getLocation(); } public void mouseExited (MouseEvent e) { SurvolDisplayZYCont = false; } public void mouseClicked(MouseEvent e){ } }; //add displayZYCont.addMouseListener(survolZYCont); //viseurZYCont MouseMotionListener viseurZYCont = new MouseMotionListener() { public void mouseMoved(MouseEvent e) { Cursor croix = new Cursor(CROSSHAIR_CURSOR); displayZYCont.getComponent(0).setCursor(croix); } public void mouseDragged(MouseEvent e) { if(SurvolDisplayZYCont==true){ z= (int)e.getX() - (int)displayZYLocation.getX(); y= (int)e.getY() - (int)displayZYLocation.getY(); if(z>=zdim)z=zdim-1; if(z<0)z=0; if(y>=ydim)y=ydim-1; if(y<0)y=0; updateDisplayXY(); updateDisplayXZ(); updateSlidersSlide(); } } }; //add displayZYCont.addMouseMotionListener(viseurZYCont); displaysCont.add(displayZYCont,new GridBagConstraints(1,0,1,1,0,0,GridBagConstraints.CENTER,GridBagConstraints.NONE,new Insets(10,10,10,10), 0, 0)); //rootPanel(CENTER)/scrollSubPanel/displaysCont/ <-- //displayXZCont// displayXZCont = new JPanel(); displayXZCont.setSize(10+xdim+10, 10+zdim+10); displayXZCont.setLayout(new GridBagLayout()); //survolXZCont MouseListener survolXZCont = new MouseAdapter() { public void mouseEntered(MouseEvent e) { SurvolDisplayXYCont = false; SurvolDisplayZYCont = false; SurvolDisplayXZCont = true; displayXZLocation = displayXZ[0].getLocation(); displayXZContLocation = displayXZCont.getLocation(); } public void mouseExited (MouseEvent e) { SurvolDisplayXZCont = false; } public void mouseClicked(MouseEvent e){ } }; //add displayXZCont.addMouseListener(survolXZCont); //viseurXZCont MouseMotionListener viseurXZCont = new MouseMotionListener() { public void mouseMoved(MouseEvent e) { Cursor croix = new Cursor(CROSSHAIR_CURSOR); displayXZCont.getComponent(0).setCursor(croix); } public void mouseDragged(MouseEvent e) { if(SurvolDisplayXZCont==true){ x= (int)e.getX() - (int)displayXZLocation.getX(); z= (int)e.getY() - (int)displayXZLocation.getY(); if(x>=xdim)x=xdim-1; if(x<0)x=0; if(z>=zdim)z=zdim-1; if(z<0)z=0; updateDisplayXY(); updateDisplayZY(); updateSlidersSlide(); } } }; //add displayXZCont.addMouseMotionListener(viseurXZCont); displaysCont.add(displayXZCont,new GridBagConstraints(0,1,1,1,0,0,GridBagConstraints.CENTER,GridBagConstraints.NONE,new Insets(10,10,10,10), 0, 0)); //rootPanel(CENTER)/scrollSubPanel/displaysCont/display**Cont/ <-- //display**// displayXYCont.add(displayXY[0], new GridBagConstraints(0,0,1,1,0,0,GridBagConstraints.CENTER,GridBagConstraints.NONE,new Insets(10,10,10,10), 0, 0)); displayZYCont.add(displayZY[0], new GridBagConstraints(0,0,1,1,0,0,GridBagConstraints.CENTER,GridBagConstraints.NONE,new Insets(10,10,10,10), 0, 0)); displayXZCont.add(displayXZ[0], new GridBagConstraints(0,0,1,1,0,0,GridBagConstraints.CENTER,GridBagConstraints.NONE,new Insets(10,10,10,10), 0, 0)); //______//FRAME NORTH //rootPanel(NORTH)/ <-- //slidersSubPanel// slidersSubPanel = new JPanel(); slidersSubPanel.setPreferredSize(new Dimension(10+(10+xdim+10)+10+(10+zdim+10)+10 , 80)); slidersSubPanel.setLayout(new GridLayout(1, 2, 15, 0)); slidersSubPanel.setBorder(BorderFactory.createLineBorder(Color.black)); rootPanel.add(slidersSubPanel,BorderLayout.NORTH); //rootPanel(NORTH)/slidersSubPanel/ <-- //sliders**Cont// slidersBTCont = new JPanel(); slidersBTCont.setLayout(new GridLayout(3,1,0,10)); slidersSubPanel.add(slidersBTCont,0); slidersXYZCont = new JPanel(); slidersXYZCont.setLayout(new GridLayout(3,1,0,10)); slidersSubPanel.add(slidersXYZCont,1); //B //rootPanel(NORTH)/slidersSubPanel/slidersBTCont/ <-- //sliderBBox// sliderBBox = new JPanel(); sliderBBox.setLayout((new BoxLayout(sliderBBox,BoxLayout.X_AXIS))); //label sliderBLabel = new JLabel(" Channel : 1/" + bdim + " "); sliderBBox.add(sliderBLabel); //slide sliderBSlide = new JSlider(SwingConstants.HORIZONTAL,1,bdim,1); sliderBSlide.setSnapToTicks(true); sliderBBox.add(sliderBSlide); //listner sliderBSlide.addChangeListener(new ChangeListener(){ public void stateChanged(ChangeEvent e){ sliderBLabel.setText(" Channel : " + Integer.toString(sliderBSlide.getValue()) + "/" + bdim + " "); b = sliderBSlide.getValue() - 1; updateDisplayXY(); updateDisplayZY(); updateDisplayXZ(); updateInfoBarText(); } }); slidersBTCont.add(sliderBBox); if(bdim == 1 || color == true){ sliderBLabel.setEnabled(false); sliderBSlide.setEnabled(false); } //T //rootPanel(NORTH)/slidersSubPanel/slidersBTCont/ <-- //sliderTBox// sliderTBox = new JPanel(); sliderTBox.setLayout(new BoxLayout(sliderTBox,BoxLayout.X_AXIS)); //label sliderTLabel = new JLabel(" Frame : 1/" + tdim + " "); sliderTBox.add(sliderTLabel); //slide sliderTSlide = new JSlider(SwingConstants.HORIZONTAL,1,tdim,1); sliderTSlide.setSnapToTicks(true); sliderTBox.add(sliderTSlide); //listner sliderTSlide.addChangeListener(new ChangeListener(){ public void stateChanged(ChangeEvent e){ sliderTLabel.setText(" Frame : " + Integer.toString(sliderTSlide.getValue()) + "/" + tdim + " "); t = sliderTSlide.getValue() - 1; updateDisplayXY(); updateDisplayZY(); updateDisplayXZ(); updateInfoBarText(); } }); slidersBTCont.add(sliderTBox); if(tdim == 1){ sliderTLabel.setEnabled(false); sliderTSlide.setEnabled(false); } //X //rootPanel(NORTH)/slidersSubPanel/slidersXYZCont/ <-- //sliderXBox// sliderXBox = new JPanel(); sliderXBox.setLayout((new BoxLayout(sliderXBox,BoxLayout.X_AXIS))); //label sliderXLabel = new JLabel(" Xpos : 1/" + xdim + " "); sliderXBox.add(sliderXLabel); //slide sliderXSlide = new JSlider(SwingConstants.HORIZONTAL,1,xdim,1); sliderXSlide.setSnapToTicks(true); sliderXBox.add(sliderXSlide); //listner sliderXSlide.addChangeListener(new ChangeListener(){ public void stateChanged(ChangeEvent e){ sliderXLabel.setText(" Xpos : " + Integer.toString(sliderXSlide.getValue()) + "/" + xdim + " "); x = sliderXSlide.getValue() - 1; updateDisplayZY(); updateInfoBarText(); } }); slidersXYZCont.add(sliderXBox); if(xdim == 1){ sliderXLabel.setEnabled(false); sliderXSlide.setEnabled(false); } //Y //rootPanel(NORTH)/slidersSubPanel/slidersXYZCont/ <-- //sliderYBox// sliderYBox = new JPanel(); sliderYBox.setLayout((new BoxLayout(sliderYBox,BoxLayout.X_AXIS))); //label sliderYLabel = new JLabel(" Ypos : 1/" + ydim + " "); sliderYBox.add(sliderYLabel); //slide sliderYSlide = new JSlider(SwingConstants.HORIZONTAL,1,ydim,1); sliderYSlide.setSnapToTicks(true); sliderYBox.add(sliderYSlide); //listner sliderYSlide.addChangeListener(new ChangeListener(){ public void stateChanged(ChangeEvent e){ sliderYLabel.setText(" Ypos : " + Integer.toString(sliderYSlide.getValue()) + "/" + ydim + " "); y = sliderYSlide.getValue() - 1; updateDisplayXZ(); updateInfoBarText(); } }); slidersXYZCont.add(sliderYBox); if(ydim == 1){ sliderYLabel.setEnabled(false); sliderYSlide.setEnabled(false); } //Z //rootPanel(NORTH)/slidersSubPanel/slidersXYZCont/ <-- //sliderZBox// sliderZBox = new JPanel(); sliderZBox.setLayout((new BoxLayout(sliderZBox,BoxLayout.X_AXIS))); //label sliderZLabel = new JLabel(" Zpos : 1/" + zdim + " "); sliderZBox.add(sliderZLabel); //slide sliderZSlide = new JSlider(SwingConstants.HORIZONTAL,1,zdim,1); sliderZSlide.setSnapToTicks(true); sliderZBox.add(sliderZSlide); //listner sliderZSlide.addChangeListener(new ChangeListener(){ public void stateChanged(ChangeEvent e){ sliderZLabel.setText(" Zpos : " + Integer.toString(sliderZSlide.getValue()) + "/" + zdim + " "); z = sliderZSlide.getValue() - 1; updateDisplayXY(); updateInfoBarText(); } }); slidersXYZCont.add(sliderZBox); if(zdim == 1){ sliderZLabel.setEnabled(false); sliderZSlide.setEnabled(false); } //______//FRAME SOUTH //rootPanel(SOUTH)/ <-- //statusSubPanel// infoBarSubPanel = new JPanel(); infoBarSubPanel.setPreferredSize(new Dimension(xdim>zdim ? xdim+xdim:zdim+zdim , 30)); //infoBarSubPanel.setMinimumSize(new Dimension(400 , 30)); infoBarSubPanel.setBorder(BorderFactory.createLineBorder(Color.black)); infoBarSubPanel.setLayout(new GridLayout(1,2,0,0)); infoBar = new JLabel(infoBarText); infoBarSubPanel.add(infoBar); rootPanel.add(infoBarSubPanel,BorderLayout.SOUTH); //______//PACKING pack(); setVisible(true); } public void updateInfoBarText(){ if(color==false){ infoBarText = " position : " + "x:" + (x+1) + " / y:" + (y+1) + " / z:" + (z+1) + " / t:" + t + " / b:" + b +" " + "value : Gray:" + img.getPixelByte( x, y, z, t, b); } if(color==true){ infoBarText = " position : "+"x:"+ (x+1) + " / y:" + (y+1) + " / z:" + (z+1) + " / t:" + t + " " + " value : R:"+img.getPixelByte( x, y, z, t, 0)+ " / G:" + img.getPixelByte( x, y, z, t, 1) + " / B:" + img.getPixelByte( x, y, z, t, 2); } infoBar.setText(infoBarText); } public void updateDisplayXY(){ displayXYCont.removeAll(); if(color==false) displayXYCont.add(displayXY[b * tdim * zdim + t * zdim + z], new GridBagConstraints(0,0,1,1,0,0,GridBagConstraints.CENTER,GridBagConstraints.NONE,new Insets(10,10,10,10), 0, 0)); if(color==true) displayXYCont.add(displayXY[t * zdim + z], new GridBagConstraints(0,0,1,1,0,0,GridBagConstraints.CENTER,GridBagConstraints.NONE,new Insets(10,10,10,10), 0, 0)); displayXYCont.repaint(); } public void updateDisplayZY(){ displayZYCont.removeAll(); if(color==false) displayZYCont.add(displayZY[b * tdim * xdim + t * xdim + x], new GridBagConstraints(0,0,1,1,0,0,GridBagConstraints.CENTER,GridBagConstraints.NONE,new Insets(10,10,10,10), 0, 0)); if(color==true) displayZYCont.add(displayZY[t * xdim + x], new GridBagConstraints(0,0,1,1,0,0,GridBagConstraints.CENTER,GridBagConstraints.NONE,new Insets(10,10,10,10), 0, 0)); displayZYCont.repaint(); } public void updateDisplayXZ(){ displayXZCont.removeAll(); if(color==false) displayXZCont.add(displayXZ[b * tdim * ydim + t * ydim + y], new GridBagConstraints(0,0,1,1,0,0,GridBagConstraints.CENTER,GridBagConstraints.NONE,new Insets(10,10,10,10), 0, 0)); if(color==true) displayXZCont.add(displayXZ[t * ydim + y], new GridBagConstraints(0,0,1,1,0,0,GridBagConstraints.CENTER,GridBagConstraints.NONE,new Insets(10,10,10,10), 0, 0)); displayXZCont.repaint(); } public void updateSlidersSlide(){ sliderBSlide.setValue(b+1); sliderTSlide.setValue(t+1); sliderXSlide.setValue(x+1); sliderYSlide.setValue(y+1); sliderZSlide.setValue(z+1); updateInfoBarText(); } /* // SUPPRIMER DECLARATION : METHODE DESORMAIS INUTILE public void ResetAllDisplays(){ scrollSubPanel.repaint(); } */ /* TODO: debogguer * public void takeSnapShot(){ if(color==false){ ByteImage tmp = new ByteImage(x,y,1,1,1); tmp = img.getByteChannelZTB(z,t,b); PelicanImageSave.process(tmp, "output/slideXY.pelican"); } */ }