Partage
  • Partager sur Facebook
  • Partager sur Twitter

Comment donner la priorité du focus à un JPanel ?

    22 juin 2017 à 8:39:17

    J'essaye de déplacer des JPanel qui comprennent des JButton et JTable, cependant lorsque j'en créer plusieurs, lorsque que je déplace un JPanel par dessus un autre,  c'est l'autre qui prend le focus et du coup le panneau que j'avais en sélection ne bouge plus jusqu'a ce que je sorte la souris des autres pannels.

    Voici mon code:

    Mon listener  :

       

    import java.awt.*;
        import java.awt.event.*;
        
        import javax.swing.*;
        import javax.swing.border.*;
       
        public class ComponentMove extends MouseAdapter {
        
            private boolean move;
            private int relx;
            private JComponent component;
            private int rely;
            private Container container;
       
            public ComponentMove(Container container) {
                this.container=container;
            }
       
            @Override
            public void mousePressed(MouseEvent e) {
                if ( move ) {
                    move=false; // arrêt du mouvement
                    component.setBorder(null); // on  supprime la bordure noire
                    component=null;
                }
                else {
                    component = getComponent(e.getX(),e.getY()); // on mémorise le composant en déplacement
                    if ( component!=null ) {
                        container.setComponentZOrder(component,0); // place le composant le plus haut possible
                        relx = e.getX()-component.getX(); // on mémorise la position relative
                        rely = e.getY()-component.getY(); // on mémorise la position relative
                        move=true; // démarrage du mouvement
                        component.setBorder(BorderFactory.createLineBorder(Color.BLACK)); // on indique le composant sélectionné par une bordure noire
                    }
                }
            }
       
            private JComponent getComponent(int x, int y) {
                // on recherche le premier composant qui correspond aux coordonnées de la souris
                for(Component component : container.getComponents()) {
                    if ( component instanceof JComponent && component.getBounds().contains(x, y) ) {
                        return (JComponent)component;
                    }
                }
                return null;
            }
       
            @Override
            public void mouseMoved(MouseEvent e) {
                if ( move ) {
                    // si on déplace
                    component.setLocation(e.getX()-relx, e.getY()-rely);
                }
            }
        }
    
    

    Voici les tables qui contiennent ma JTable et mes JButton:

    import javax.swing.*;
    import java.awt.*;
    import java.util.*;
    import java.text.*;
    import java.awt.Color;
    
    public class PanneauPrincipal extends javax.swing.JPanel{
    
    private Tables tables1;
    private Tables tables2;
    private Tables tables3;
    private Tables tables4;
    private Tables tables5;
    private Tables tables6;
    private ArrayList<JPanel> contient;
    public Color background = new Color(171,214,224);
    int c; //Set the placement of the panel
    double percentage; //number of table
    int posX;
    int posY;
    
    public PanneauPrincipal(int x, int y, String nomTable){
        c = 0;
        percentage = 0.5;
        Dimension screenSize = Toolkit.getDefaultToolkit().getScreenSize();
        posX = screenSize.width;
        posY = screenSize.height;
        contient = new ArrayList<JPanel>();
    
    
    
        this.setLayout(null);
        tables1 = new Tables("Table1");
        tables2 = new Tables("Table2");
        tables3 = new Tables("Table3");
        tables4 = new Tables("Table4");
        tables5 = new Tables("Table5");
        tables6 = new Tables("Table6");
    
        displayPanel(tables1);
        displayPanel(tables2);
        displayPanel(tables3);
        displayPanel(tables4);
        displayPanel(tables5);
        displayPanel(tables6);
    
        this.setBackground(background);
    }
    
    public void displayPanel(Tables tableToAdd){
    
        contient.add(new JPanel());
        contient.get((contient.size()-1)).setLayout(new BorderLayout());
        contient.get((contient.size()-1)).setBounds((int)(percentage * posX),(int) (percentage * posY),700,300);
        contient.get((contient.size()-1)).add(tableToAdd);
        contient.get((contient.size()-1)).setEnabled(false);
        this.add(contient.get((contient.size()-1)));
    
        if(percentage > 0.2){
            percentage -= 0.1;
        }
    
       }
    }

    Et l'application principale qui comprend mon listener :

    import javax.swing.*;
    import java.awt.*;
    import javax.swing.border.*;
    
    public class Application extends javax.swing.JFrame{
    private TableauDeBord barreHaut;
    private PanneauPrincipal milieu1;
    private InfoBDD info;
    public Color background = new Color(171,214,224);
    
    public Application(String titre){
        super(titre); 
        Color infoColor = new Color(255,255,255);
        barreHaut = new TableauDeBord();
        milieu1 = new PanneauPrincipal(200,200, "Table 1");
        info = new InfoBDD();
        Dimension screenSize = Toolkit.getDefaultToolkit().getScreenSize();
    
        info.setBackground(infoColor);
    
        ComponentMove listener1 = new ComponentMove(milieu1);
        milieu1.addMouseListener(listener1);
        milieu1.addMouseMotionListener(listener1);
    
        this.setLayout(new BorderLayout());
        this.add(barreHaut, BorderLayout.NORTH);
        this.add(milieu1);
        this.add(info, BorderLayout.WEST);
        this.setVisible(true);
        this.pack();
        this.setSize(screenSize.width,screenSize.height);
        this.setDefaultCloseOperation(EXIT_ON_CLOSE);
    }
    
    }




    • Partager sur Facebook
    • Partager sur Twitter

    Comment donner la priorité du focus à un JPanel ?

    × 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