Newsgroup: it.comp.java
Titolo: BorderLayout

Salve a tutti;
Ho un contenitore JPanel con layout impostato su BorderLayout al suo interno
ho messo un JButton sulla posizione North ora vorrei sapere se è possibile a
codice ricavare la posizione del JButton (vorrei sapere dove e situato nel
mio caso North).
Ciao e grazie



Ciao,
ti anticipo che non ne vedo molto l'utilita'...ma questo dipende da te e
da come hai strutturato la tua applicazione.
Il modo piu' semplice per farlo e' quello di tenerne traccia tu.
In generale con le API "ufficiali" non mi pare che non si possa.
Pero' la classe BorderLayout ha un metodo (getChild) che restituisce il
componente posizionato nella zona passata come parametro al metodo stesso.
Purtroppo tale metodo e' private, quindi non puoi chiamarlo semplicemente,
ma solo mediante reflection disattivando i meccanismi di controllo di
accesso del linguaggio.
Il codice seguente mostra una possibile implementazione:
import java.awt.BorderLayout;
import java.awt.Component;
import java.awt.Container;
import java.awt.LayoutManager;
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;
import javax.swing.JButton;
import javax.swing.JFrame;
/**
 *
 * @author  Lucio Benfante
 */
public class TestBL {
 
    public static String getBorderLayoutPosition(Container cp, Component c) {
        String result = null;
        LayoutManager l = cp.getLayout();
        if (l instanceof BorderLayout) {
            Method m = null;
            try {
                m = BorderLayout.class.getDeclaredMethod("getChild",
                                  new Class[] {String.class, boolean.class});
            } catch (NoSuchMethodException e) {
                /*should never happen*/
                e.printStackTrace();
            }
            m.setAccessible(true);
            String[] positions = {BorderLayout.NORTH,
                                  BorderLayout.SOUTH,
                                  BorderLayout.EAST,
                                  BorderLayout.WEST,
                                  BorderLayout.CENTER};
            for (int i=0; i<positions.length; i++) {
                Component curr = null;
                try {
                    curr = (Component)m.invoke(l,
                            new Object[] {positions[i], Boolean.TRUE});
                } catch (IllegalAccessException e) {
                    /*should never happen*/ 
                    e.printStackTrace();
                }catch (InvocationTargetException e) {
                    /*should never happen*/ 
                    e.printStackTrace();
                }
                if ((curr != null) && (curr == c)) {
                    result = positions[i];
                    break;
                }
            }
        }
        return result;
    }
 
    public static void main(String[] args) {
        JFrame f = new JFrame("Prova BL");
        JButton bn = new JButton("North");
        JButton bs = new JButton("South");
        JButton be = new JButton("East");
        JButton bw = new JButton("West");
        JButton bc = new JButton("Center");
        Container cp = f.getContentPane();
        cp.add(bn, BorderLayout.NORTH);
        cp.add(bs, BorderLayout.SOUTH);
        cp.add(be, BorderLayout.EAST);
        cp.add(bw, BorderLayout.WEST);
        cp.add(bc, BorderLayout.CENTER);
        f.pack();
        f.setVisible(true);
 
        System.out.println("bn e' a "+ TestBL.getBorderLayoutPosition(cp, bn));
        System.out.println("bs e' a "+ TestBL.getBorderLayoutPosition(cp, bs));
        System.out.println("be e' a "+ TestBL.getBorderLayoutPosition(cp, be));
        System.out.println("bw e' a "+ TestBL.getBorderLayoutPosition(cp, bw));
        System.out.println("bc e' a "+ TestBL.getBorderLayoutPosition(cp, bc));
    }
 
}
-- 
Lucio Benfante
Java User Group Padova: 
http://www.jugpadova.it
Brainbench MVP for Java 1: 
http://www.brainbench.com
MyTranscript: 
http://www.brainbench.com/transcript.jsp?pid=167064