Partage
  • Partager sur Facebook
  • Partager sur Twitter

Optimiser mon drawline

Pour que celui ci ne clignote pas

    18 février 2012 à 1:53:44

    Bonjour, à tous (plutôt bonsoir ^^),

    voici mon problème :

    dans mon application je trace une ligne qui relie 2 JTable contenu chacun dans une JInternalFrame, elles contenu dans un JPanel.

    Donc dès que je déplace une de mes 2 JTable j'appelle le repaint() du JPanel, ce qui fait clignoter la ligne
    j'ai par la suite trouver qu'il faut utiliser le double buffering mais malgré les différent topic d'aide que j'ai lue je n'ai pas trouver mon bonheur...

    Donc si quelqu'un peu m'aider je lui dis merci d' avance

    voici le code :

    package creation_de_table;
    import java.awt.BasicStroke;
    import java.awt.Graphics;
    
    import java.awt.*;
    import java.awt.event.*;
    import java.sql.Connection;
    import java.util.*;
    import java.util.List;
    import javax.swing.*;
    
    import sun.java2d.loops.DrawLine;
    import ui.Connexion;
    import ui.EnumPanel;
    import ui.UIController;
    
    import cir.DAO_ForeignKey;
    import cir.UI_CIR;
    
    
    //Voir ligne 104 - utilité du listener
    public class UI_AffichageTables extends JFrame implements MouseListener, ActionListener, ComponentListener
    {
    	private JPopupMenu popupMenu; 
    	private JMenuItem nouvelleTable;
    	private int x; 
    	private int y; 
    	private CTRL_CreationTable ctrl;
    	private UIController controlleurUI;
    	private static UI_AffichageTables instance = null;
    	private List<UI_Table> listeUiTables;
    	
    	private Connection connexion = null;
    	private DAO_ForeignKey daoFK = null;
    	
    	private UI_AffichageTables()
    	{
    		super("Création de Table");
    		
    		JDesktopPane desktop = new JDesktopPane();
    		ctrl = CTRL_CreationTable.getInstance();
    		ctrl.recupererTypes();
    		ctrl.recupererTables();
    		controlleurUI = UIController.getInstance();
    		
    		connexion = Connexion.getInstance().getCx();
    		daoFK = DAO_ForeignKey.getInstance(connexion);
    		
    		listeUiTables = new ArrayList();
    		
    		popupMenu = new JPopupMenu();
    		nouvelleTable = new JMenuItem("Nouvelle Table");
    		nouvelleTable.addActionListener(this);
    		popupMenu.add(nouvelleTable);
    		//popupMenu.setLightWeightPopupEnabled(false);
    		
    	
    		
    		JMenuBar menuBar = new JMenuBar();
    		
    		JMenu serveur = new JMenu("Serveur");
    		serveur.setMnemonic(KeyEvent.VK_S);
    		serveur.getAccessibleContext().setAccessibleDescription("Actions liées au serveur");
    		serveur.setToolTipText("Actions liées au serveur");
    		menuBar.add(serveur);
    		
    		
    		JMenuItem deconnectionMI = new JMenuItem("Déconnection", KeyEvent.VK_D);
    		deconnectionMI.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_D, ActionEvent.CTRL_MASK));
    		deconnectionMI.getAccessibleContext().setAccessibleDescription("Déconnexion du serveur");
    		deconnectionMI.setToolTipText("Déconnexion du serveur");
    		serveur.add(deconnectionMI);
    		deconnectionMI.addActionListener(this);
    		
    		
    		
    		JMenu tables = new JMenu("Tables");
    		tables.setMnemonic(KeyEvent.VK_T);
    		tables.getAccessibleContext().setAccessibleDescription("Actions liées aux tables");
    		tables.setToolTipText("Actions liées aux tables");
    		menuBar.add(tables);
    		
    		JMenuItem creerTableMI = new JMenuItem("Créer une table", KeyEvent.VK_C);
    		creerTableMI.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_C, ActionEvent.CTRL_MASK));
    		creerTableMI.getAccessibleContext().setAccessibleDescription("Création d'une table");
    		creerTableMI.setToolTipText("Création d'une table");
    		tables.add(creerTableMI);
    		creerTableMI.addActionListener(this);
    		
    		JMenuItem cirMI = new JMenuItem("Contraintes d'intégrité référentielle", KeyEvent.VK_I);
    		cirMI.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_I, ActionEvent.CTRL_MASK));
    		cirMI.getAccessibleContext().setAccessibleDescription("Création d'une contrainte d'intégrité référentielle");
    		cirMI.setToolTipText("Création d'une contrainte d'intégrité référentielle");
    		tables.add(cirMI);
    		cirMI.addActionListener(this);
    
    		
    		this.setJMenuBar(menuBar);
    		
    		
    		addMouseListener(this);
    		setContentPane(desktop);
    		pack();
    		//setSize(500,500);
    		setExtendedState(this.MAXIMIZED_BOTH);
    		setLocationRelativeTo(null);
    		setVisible(true);
    		setDefaultCloseOperation(EXIT_ON_CLOSE);
    		
    		dessinerTtLesTables();
    	}
    	
    	public synchronized static UI_AffichageTables getInstance()
    	{
    		if(instance == null)
    		{
    			instance = new UI_AffichageTables();
    		}
    		return instance;
    	}
    
    	public void actionPerformed(ActionEvent e) 
    	{
    		String action = e.getActionCommand();
    		
    		if(nouvelleTable == (JMenuItem) e.getSource())
    		 {
    			 new UI_CreationEdition(/*x,y,this, ctrl.getTypes()*/new ArrayList());
    		 }
    		
    		if(action.equals("Déconnection")){
    			controlleurUI.closeConnection();
    			controlleurUI.setPanel(EnumPanel.CHOIXSGBD);
    			controlleurUI.setVisible(true);
    			this.dispose();
    		}
    		
    		if(action.equals("Créer une table")){
    			 new UI_CreationEdition(/*x,y,this, ctrl.getTypes()*/new ArrayList());
    		}
    		
    		if(action.equals("Contraintes d'intégrité référentielle")){
    			 new UI_CIR(listeUiTables);
    		}
    	}
    
    	public void mouseClicked(MouseEvent e){
    	}
    
    	public void mouseEntered(MouseEvent e){
    	}
    
    	public void mouseExited(MouseEvent e){
    	}
    
    	public void mousePressed(MouseEvent e) 
    	{
    		if (e.getButton() == MouseEvent.BUTTON3)
    		 {
    			 	x = e.getX();
    			 	y = e.getY();
    				popupMenu.show(this, e.getX(),e.getY());
    		 }
    	}
    
    	public void mouseReleased(MouseEvent e) {
    	}
    	
    	
    	public UI_Table getUiTable(String nomTable)
    	{
    		for(int i = 0; i < listeUiTables.size(); i++)
    		{
    			if(nomTable.equals(listeUiTables.get(i).getNom()))
    			{
    				System.out.println(listeUiTables.get(i).getNom());
    				return listeUiTables.get(i);
    			}
    		}
    		
    		return null;
    	}
    	
    	public void addUiTable(UI_Table table)
    	{
    		listeUiTables.add(table);
    	}
    	
    	public void effacerTable(String nomTable)
    	{
    		for(int i = 0; i < listeUiTables.size(); i++)
    		{
    			if(nomTable == listeUiTables.get(i).getNom())
    			{
    				remove(listeUiTables.get(i));
    				listeUiTables.remove(i);
    			}
    		}
    		repaint();
    	}
    	
    	public void dessinerTable(String nomTable, List<List<String>> structure)
    	{
    		UI_Table nouvelleTable =new UI_Table(nomTable, structure,10,10);
    		nouvelleTable.addMouseListener(this);
    		addUiTable(nouvelleTable);
    		nouvelleTable.addComponentListener(this);
    		add(nouvelleTable);
    	}
    	
    	public void dessinerTtLesTables()
    	{
    		List<Table> lesTable= ctrl.getListeTables();
    		
    		for(int i = 0; i < lesTable.size() ; i++)
    		{
    			dessinerTable(lesTable.get(i).getNomTable(),lesTable.get(i).getStructureTable());
    		}
    	}
    	
    	public void paint(Graphics g){
    		super.paint(g);
    		Graphics2D g2 = (Graphics2D) g;
    		g2.setStroke(new BasicStroke((float) 2));
    		dessinerTtlesCIR(g2);
    	}
    	
    	@SuppressWarnings({ "rawtypes", "unchecked" })
    	private void dessinerTtlesCIR(Graphics g) {
    		List <Map> listFK = daoFK.ReadAll();
    		System.out.println(listFK.size());
    		for(int i =0 ; i<listFK.size(); i++){
    			dessinerCIR(listFK.get(i),g);
    		}
    		
    		
    	}
    	
    	private void dessinerCIR( Map<String, String> map, Graphics g){
    		System.out.println(map.toString());
    		Point pPK,pFK;
    		int yPK,yFK;
    		pPK = getPoint(map.get("PKTABLE_NAME"));
    		pFK = getPoint(map.get("FKTABLE_NAME"));
    		
    		int difX = (-pPK.x+pFK.x);
    		
    	
    		
    		if(difX>150){
    			int nCPK = getNumColumn(map.get("PKTABLE_NAME"), map.get("PKCOLUMN_NAME"));
    			g.drawLine(-pPK.x+2, -pPK.y+28+(16*nCPK), -pPK.x-10, -pPK.y+28+(16*nCPK));
    		
    			int nCFK = getNumColumn(map.get("FKTABLE_NAME"), map.get("FKCOLUMN_NAME"));
    			g.drawLine(-pFK.x+150, -pFK.y+28+(16*nCFK), -pFK.x+162, -pFK.y+28+(16*nCFK));
    		
    			g.drawLine(-pPK.x-10, -pPK.y+28+(16*nCPK), -pFK.x+162, -pFK.y+28+(16*nCFK));
    		}
    		
    		if(difX<-150){
    			int nCPK = getNumColumn(map.get("PKTABLE_NAME"), map.get("PKCOLUMN_NAME"));
    			g.drawLine(-pPK.x+150, -pPK.y+28+(16*nCPK), -pPK.x+162, -pPK.y+28+(16*nCPK));
    
    			int nCFK = getNumColumn(map.get("FKTABLE_NAME"), map.get("FKCOLUMN_NAME"));
    			g.drawLine(-pFK.x+2, -pFK.y+28+(16*nCFK), -pFK.x-10, -pFK.y+28+(16*nCFK));
    
    			g.drawLine(-pFK.x-10, -pFK.y+28+(16*nCFK), -pPK.x+162, -pPK.y+28+(16*nCPK));
    		}
    		
    		if(difX<150 && difX>-150){
    			int nCPK = getNumColumn(map.get("PKTABLE_NAME"), map.get("PKCOLUMN_NAME"));
    			g.drawLine(-pPK.x+150, -pPK.y+28+(16*nCPK), -pPK.x+162, -pPK.y+28+(16*nCPK));
    
    			int nCFK = getNumColumn(map.get("FKTABLE_NAME"), map.get("FKCOLUMN_NAME"));
    			g.drawLine(-pFK.x+150, -pFK.y+28+(16*nCFK), -pFK.x+162, -pFK.y+28+(16*nCFK));
    
    			g.drawLine(-pPK.x+162, -pPK.y+28+(16*nCPK), -pFK.x+162, -pFK.y+28+(16*nCFK));
    		}
    		
    	}
    	
    	private int getNumColumn(String nomTable, String nomAttribut){
    		String nomT = nomTable.toUpperCase();
    		UI_Table table = getUiTable(nomT);
    		for(int i =0; i< table.getStructure().size(); i++){
    			if(table.tableau.getValueAt(i, 0).equals(nomAttribut)){
    				return i;
    			}
    		}
    		return -1;
    	}
    	
    	private Point getPoint(String nomTable){
    		String nomT = nomTable.toUpperCase();
     		UI_Table table = getUiTable(nomT);
     		Point p = table.getContentPane().getLocation();
    		System.out.println(p.x);
    		System.out.println(p.y);
    		JRootPane rootpane = (JRootPane) SwingUtilities.getAncestorOfClass(
    				JRootPane.class, table.getContentPane().getParent());
    		SwingUtilities.convertPointFromScreen(p,rootpane);
    		System.out.println(p.x);
    		System.out.println(p.y);
     		return p;
    	}
    	
    
    	@Override
    	public void componentHidden(ComponentEvent e) {
    		// TODO Auto-generated method stub
    		
    	}
    
    	@Override
    	public void componentMoved(ComponentEvent e) {
    		// TODO Auto-generated method stub
    		System.out.println("chatte");
    	}
    
    	@Override
    	public void componentResized(ComponentEvent e) {
    		// TODO Auto-generated method stub
    		
    	}
    
    	@Override
    	public void componentShown(ComponentEvent e) {
    		// TODO Auto-generated method stub
    		
    	}
    	
    	public void update(Graphics g){
    		paint(g);
    	}
    
    }
    
    • Partager sur Facebook
    • Partager sur Twitter

    Optimiser mon drawline

    × Après avoir cliqué sur "Répondre" vous serez invité à vous connecter pour que votre message soit publié.
    × Attention, ce sujet est très ancien. Le déterrer n'est pas forcément approprié. Nous te conseillons de créer un nouveau sujet pour poser ta question.
    • Editeur
    • Markdown