2014-12-20 2 views
2

Так что это фрагмент более крупной программы. Не показано в приведенном ниже коде - это «фреймворк» JFrame, который я правильно настроил и который также содержит JPanel с различными JLabels. То, к чему я стремился в приведенном ниже коде, - это способ получить доступ к объекту «лицо», который имеет тип «facer», который расширяет JPanel, где «facer» правильно добавлен в «фреймворк» JFrame со всем этим отображением должным образом. В приведенном ниже коде показаны некоторые вещи, которые я пробовал. Независимо от того, где я использую .getName(), я всегда получаю null. «line4» получает мне доступ к scrollPane, а не к объекту, который я также добавил в JFrame. Мне также кажется странным, что getParent(). GetParent() дает JLayeredPane (который я не использую), а не JFrame.Как получить родительский объект щелкнутого компонента с помощью getParent()?

Все это в основном орошаемая версия реальной области кода, на которой я застрял, но решение этого по существу показало бы мне, что делать в другом сценарии. В принципе, все, что я прошу, это то, как я могу получить getParent(). GetName() или getParent(). GetParent(). GetName(), чтобы распечатать имя объекта (которое в этом случае является «facer» или «framer»)), а не нулевую или информацию о типе, как показано в моих выводах ниже.

face.addMouseListener(new MouseAdapter() 
     { 
      public void mouseClicked(MouseEvent e) 
      { 
       Component source = (Component) e.getSource(); //line1 
       System.out.println("source gives me " + source); //line2 
       System.out.println("getName() gives me " + source.getName()); //line3 
       System.out.println("getParent().getComponent(1) gives me " + source.getParent().getComponent(0)); //line4 
       System.out.println("getParent().getName() gives me " + source.getParent().getName()); //line5 
       System.out.println("getParent().getParent() gives me " + source.getParent().getParent()); //line6 
       System.out.println("getParent().getParent() gives me " + source.getParent().getParent().getName()); //line7 

      } 
     }); 

Выход дает мне

source gives me facer[,0,0,200x288,alignmentX=0.0,alignmentY=0.0,border=,flags=9,maximumSize=,minimumSize=,preferredSize=] 
    getName() gives me null 
    getParent().getComponent(1) gives me javax.swing.JScrollPane[,30,-18,140x18,layout=javax.swing.ScrollPaneLayout$UIResource,alignmentX=0.0,alignmentY=0.0,[email protected]e368,flags=328,maximumSize=,minimumSize=,preferredSize=,columnHeader=,horizontalScrollBar=javax.swing.JScrollPane$ScrollBar[,0,0,0x0,hidden,layout=javax.swing.plaf.metal.MetalScrollBarUI,alignmentX=0.0,alignmentY=0.0,border=,flags=4194632,maximumSize=,minimumSize=,preferredSize=,blockIncrement=10,orientation=HORIZONTAL,unitIncrement=1],horizontalScrollBarPolicy=HORIZONTAL_SCROLLBAR_NEVER,lowerLeft=,lowerRight=,rowHeader=,upperLeft=,upperRight=,verticalScrollBar=javax.swing.JScrollPane$ScrollBar[,0,0,0x0,hidden,layout=javax.swing.plaf.metal.MetalScrollBarUI,alignmentX=0.0,alignmentY=0.0,border=,flags=4194632,maximumSize=,minimumSize=,preferredSize=,blockIncrement=10,orientation=VERTICAL,unitIncrement=1],verticalScrollBarPolicy=VERTICAL_SCROLLBAR_NEVER,viewport=javax.swing.JViewport[,1,1,137x15,layout=javax.swing.ViewportLayout,alignmentX=0.0,alignmentY=0.0,border=,flags=25165832,maximumSize=,minimumSize=,preferredSize=,isViewSizeSet=true,lastPaintPosition=,scrollUnderway=false],viewportBorder=] 
    getParent().getName() gives me null.contentPane 
    getParent().getParent() gives me javax.swing.JLayeredPane[null.layeredPane,0,0,200x288,invalid,alignmentX=0.0,alignmentY=0.0,border=,flags=0,maximumSize=,minimumSize=,preferredSize=,optimizedDrawingPossible=true] 
    getParent().getParent() gives me null.layeredPane 
+0

Можете ли вы показать нам, как вы объявляете этот класс 'facer'? Где вы назовете 'setName()' на нем? – markspace

+1

Чтобы лучше помочь, опубликуйте [MCVE] (http://stackoverflow.com/help/mcve) (минимальный полный проверяемый пример) или [SSCCE] (http://www.sscce.org/) (Short, Self Содержащийся, правильный пример). –

+0

Хорошо оба хорошего совета. Похоже, что не назначать setName() было проблемой. Как раз для выяснения, печать из getParent() фактически распечатывает представление объекта, а не класса. Также вы могли бы объяснить, почему getParent(). GetParent() показывает тип JLayeredPane()? – Guitardeon

ответ

1

Вы говорите: 'объект "лицо", которое имеет тип "торцующего", который расширяет JPanel'. Я прочитал это, как говорят у вас есть что-то вроде:

public class facer extends JPanel { ... } 

, а позже у вас есть:

facer face = new facer(...); 

Теперь в вашем выводе, вы пытаетесь найти выход facer. Ваша проблема заключается в том, что вы неправильно поняли, что имя находится в компоненте Swing .... Имя - это значение, которое может быть присвоено компоненту swing (с использованием setName(String)), чтобы дать ему некоторое значащее имя для приложения.

Что вы действительно ищете, это ClassName, имя типа компонента.

Ваш класс facer может быть в пакете по умолчанию или может быть в одном из ваших собственных пакетов. Если, например, facer класс находится в пакете com.example.myapp затем, если добавить код:

System.out.println("source class name gives me " + source.getClass().getName()); 

, то он выведет:

com.example.myapp.facer 

Если вы хотите только простое имя класса, то попробуйте:

System.out.println("source class name gives me " + source.getClass().getSimpleName()); 
Смежные вопросы