2012-09-25 13 views
6

Umieściłem kilka JPaneli w innym JPanelu, którego układem jest Układ boków i Oś Y. Po tym, jak położyłem wszystkie panele, potrzebuję uzyskać pozycję Y każdego dodanego JPanela z panelu kontenera JPanel. Ale kiedy próbuję to uzyskać, zawsze otrzymuję zero dla pozycji Y każdego JPanela. Proszę mi powiedzieć, jak uzyskać pozycję Y każdego Jpanel z JPanel pojemnika JPanel.Znajdź lokalizację komponentu wahadłowego

To co mam zrobić,

JPanel panelHolder = new JPanel(new BoxLayout(this, BoxLayout.Y_AXIS)); 
for(int i = 0; i< 10; i++){ 
    JPanel p = new JPanel(); 
    panelHolder.add(p); 
} 

int componentCount = panelHolder.getComponentCount(); 

for (int j = 0; i < componentCount ; j++) { 

    Component c = pnlRowHolder.getComponent(i); 
    JPanel p = (JPanel)c; 
    System.out.println(p.getY());//I get zero for all 
} 
+9

Spróbuj sprawdzić _after_ 'validate()' lub 'pack()'; edytuj swoje pytanie, dołączając [sscce] (http://sscce.org/), które pokazują twoje podejście. – trashgod

Odpowiedz

3

Dodaj swoje JPanel do JFrame s ContentPane umożliwiając w ten sposób, aby uzyskać X i Y wspólnie rzędne używając getX() i get() chociaż sugeruję dodanie wszystko w pierwszej kolejności, ponieważ punkty mogą się zmieniać wraz z dodawaniem kolejnych składników, a następnie, jak powiedział trashgod, po prostu wywołaj pack() w instancji ramki.

zrobiłem krótką próbkę wykazać:

import java.awt.BorderLayout; 
import javax.swing.JFrame; 
import javax.swing.JLabel; 
import javax.swing.JPanel; 
import javax.swing.SwingUtilities; 

public class Test { 

    public static void main(String[] args) { 
     SwingUtilities.invokeLater(new Runnable() { 

      @Override 
      public void run() { 
       new Test().createAndShowUI(); 
      } 
     }); 
    } 

    private void createAndShowUI() { 
     JFrame frame = new JFrame("Test"); 
     frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
     frame.setResizable(false); 
     initComponents(frame); 

     frame.pack();//call pack 

     printPanelCompPoints(mainPanel);//produces correct coords 

     frame.setVisible(true); 
    } 

    private JPanel mainPanel; 

    private void initComponents(JFrame frame) { 
     mainPanel = new JPanel(new BorderLayout()); 
     JPanel centerPanel = new JPanel(); 
     JPanel northPanel = new JPanel(); 
     JPanel southPanel = new JPanel(); 
     JPanel westPanel = new JPanel(); 
     JPanel eastPanel = new JPanel(); 

     centerPanel.add(new JLabel("CENTER")); 
     northPanel.add(new JLabel("NORTH")); 
     eastPanel.add(new JLabel("EAST")); 
     southPanel.add(new JLabel("SOUTH")); 
     westPanel.add(new JLabel("WEST")); 

     mainPanel.add(centerPanel, BorderLayout.CENTER); 
     mainPanel.add(northPanel, BorderLayout.NORTH); 
     mainPanel.add(southPanel, BorderLayout.SOUTH); 
     mainPanel.add(eastPanel, BorderLayout.EAST); 
     mainPanel.add(westPanel, BorderLayout.WEST); 

     frame.getContentPane().add(mainPanel); 

     printPanelCompPoints(mainPanel);//produces all 0's 
    } 

    private void printPanelCompPoints(JPanel mainPanel) { 
     for (int i = 0; i < mainPanel.getComponentCount(); i++) { 
      System.out.println(mainPanel.getComponent(i).getX() + ", " + mainPanel.getComponent(i).getY()); 
     } 
    } 
} 

Jak widać nazywając printPanelCompPoints(mainPanel); w initComponents(JFrame frame) produkuje wszystkie 0-tych (jak zostały one dodane do ramy ale `pakiet() nie został nazywa) .

0, 0

0, 0

0, 0

0, 0

0, 0

jednak w createAndShowUI() po wywołaniu pack() w instancji JFrame nce nazywając printPanelCompPoints(mainPanel); produkuje poprawne współpracowników odrinates:

44, 26

0, 0

0, 52

99, 26

0, 26

4

Współrzędne odnoszą się do ich rodzica. Na przykład wszystkie komponenty potomne są dodawane wzdłuż górnej części kontenera nadrzędnego, tworząc tam pozycję 0 (w stosunku do elementu nadrzędnego).

Spróbuj dodać pustą granicę do kontenera nadrzędnego, powinieneś zobaczyć zmianę pozycji y.

Można użyć SwingUtilities.convertPoint do konwersji pomiędzy układami współrzędnych

3

Paczka ramka przed uzyskaniem stanowiska. Wygląda na to, że wszystko się nakłada, zaczynając od początku (0,0), aż się spakujesz.

Oto kod działa:

import java.awt.Component; 
import java.awt.Dimension; 
import javax.swing.BoxLayout; 
import javax.swing.JFrame; 
import javax.swing.JPanel; 

public class TestBoxLayout { 

    public static void main(String[] args) { 
     JFrame frame = new JFrame(); 

     JPanel panelHolder = new JPanel(); 
     panelHolder.setLayout(new BoxLayout(panelHolder, BoxLayout.Y_AXIS)); 

     for (int i = 0; i < 10; i++) { 
      JPanel p = new JPanel(); 
      p.setPreferredSize(new Dimension(100, 13)); //I set the height just to make sure. 
      panelHolder.add(p); 
     } 
     frame.add(panelHolder); 

     /** 
     * Pack before you get the position. 
     */ 
     frame.pack(); 

     int componentCount = panelHolder.getComponentCount(); 
     for (int j = 0; j < componentCount; j++) { 
      Component c = panelHolder.getComponent(j); 
      JPanel p = (JPanel) c; 
      System.out.println(p.getY());//I get 0, 13, 26, 39, ..... 
     } 

     frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
     frame.setVisible(true); 
    } 
} 

Wynik:

0 
13 
26 
39 
52 
65 
78 
91 
104 
117 

Uwaga: Podpis dla BoxLayout jest BoxLayout(Container target, int axis). target to rzeczy, na które ustawiasz swój układ. Z tego powodu, jeśli chcesz użyć BoxLayout, powinieneś zawsze najpierw utworzyć panel. Następnie użyj component.setLayout(), aby cel już istniał. this w twoim konstruktorze JPanel odnosiło się do czegoś innego, a nie panelHolder. Domyślam się, że klasa, w której stworzyłeś tę funkcję, jest również podklasą Container i dlatego nie dostałeś błędu.

+0

+1 tak blisko prawdy, [ale domyślnie nie jest to powód, dla którego należy ustawić XxxSize] (http://stackoverflow.com/questions/7229226/może-uzyskać-używać-zaproponowaćmaksymalnieminimalnejsymetrii- in-java-swi) – mKorbel

+0

@mKorbel Zazwyczaj pozwalam menedżerowi układu organizować preferowane rozmiary komponentów. Użyłem tylko 'setPreferredSize' tylko do przetestowania z innym numerem. Bez tego uzyskałem "0,10,20, ...", co nadal jest poprawne. – davidXYZ

+0

hehehe ... proszę ponownie przeczytać pytanie :-) – mKorbel

1

Proszę mi powiedzieć, jak uzyskać pozycję Y każdego Jpanel z JPanel pojemnika JPanel.

  • BoxLayout akceptując XxxSize (Preferred w tym przypadku), która zwraca swoje dziecko,

  • JPanel powraca (0, 0) jest to prawidłowa wartość

  • ten lub simlair wynik co możliwe uzyskać od wszystkich LayoutManager, na przykład built_in FlowLayout dla JPanel (akceptując tylko PreferredSiz e), zwraca te same współrzędne (0, 0)

  • wyjątkiem BorderLayout następnie jest generowany 10pixels (dla W, X, Y, S miejscach) i dotyczy tylko w przypadku, CENTER area jest używany przez pewien JComponent

  • JPanel jest Container i pusty JPanel przez defualt zwraca zerowy rozmiar na ekranie

  • JPanel can zwrotów odpowiednie współrzędne, jeśli jest jakiś JComponent lub zastąpić XxxSize w JPanel konstruktor

0

Problem polega często na tym, że układ lub rysunek jest wykonywany dopiero po zwróceniu całej metody. W takim przypadku, getX i getY powrotnej 0.

To może pomóc, aby zadzwonić pack() w oknie ramki, lub doLayout() lub validate() na JPanel nad którym pracujesz. Często jednak to nie pomaga, bo mają niewielki wpływ na planowanie wewnętrznego: http://www.oracle.com/technetwork/java/painting-140037.html

Co ma mi pomóc w tym przypadku jest umieszczenie części, w której muszę X i Y położenia do wątku roboczego:

JPanel panelHolder = new JPanel(new BoxLayout(this, BoxLayout.Y_AXIS)); 
for(int i = 0; i< 10; i++){ 
    JPanel p = new JPanel(); 
    panelHolder.add(p); 
} 

int componentCount = panelHolder.getComponentCount(); 

SwingUtilities.invokeLater(new Runnable() {   
    @Override 
    public void run() { 
     for (int j = 0; i < componentCount; j++) {  
      Component c = pnlRowHolder.getComponent(i); 
      JPanel p = (JPanel) c; 
      System.out.println(p.getY()); 
     } 
    } 
}); 

W ten sposób pobieranie X i Y zostanie odroczone do momentu zakończenia układania.

0

Załóżmy, że masz ojca Jpanel, który zawiera syna JPanel. Jeśli cx jest współrzędną x syna w odniesieniu do ojca, a cy jest współrzędną y syna w odniesieniu do ojca, to:

cx = son.getLocationOnScreen(). GetX() - father.getLocationOnScreen() .getX()

cy = son.getLocationOnScreen() getY() -.. father.getLocationOnScreen() getY()

myślę to najprostszy sposób ...

Powiązane problemy