2014-09-16 2 views
0

StackOverflow를 검색하여이 질문을 찾았지만 얻을 수 없습니다.문자열을 Java의 구성 요소 이름으로 변환

How do I invoke a Java method when given the method name as a string?

는 좀 JLabels와 JPanel의이 각 레이블은 특정 JPanel의 배경 색상을 변경하려면 사용자 정의 그래픽 버튼으로 작동하고이 라벨을 많이 있기 때문에 I는 사용자 정의의 MouseListener를 만든 있도록 각 JLabel의 이름으로 특정 JPanel의 배경색을 변경합니다. 이 JLabels이 문자열 값에 JPanel의 호출의 이름을 지정하는대로

지금,이

@Override 
public void mouseClicked(MouseEvent e) 
{ 
    e.getComponent().getName().setBackground(new COLOR.RED); 
} 

같은 것을 원하지만 난 그렇게 할 수 없습니다.

그냥 문자열을 JPanel의 이름으로 변환하고 싶습니다.

+0

아니요 나는이 JLabel이 많기 때문에 각 레이블에 직접 메서드를 호출하면 지옥이 될 것이라고 말합니다 –

+0

올바르게 이해한다면 레이블을 패널에 매핑해야합니다. 왜 'HashMap'을 사용하지 않고 왜 클릭 한 라벨과 연결된 패널? – user1803551

+0

그런 다음 HashMap을 사용하여 긴 목록을 작성하고 각 JPanel의 이름과 위치를 추적하여 해당 목록에서 호출 할 수 있도록해야합니다. 따라서 JLabel에서 오는 문자열을 JPanel 변수 이름으로 변환 할 수 있다면 더 좋은 아이디어가 될 수 있습니다. –

답변

0

당신은 이런 식으로 작업을 수행 할 수 있습니다 경우에 그런

map.put("jPanel1", jPanel1); 

:

Map<String, JPanel> map = new HashMap<String, JPanel>(); 

다음 키로 이름을 사용하여 귀하의 모든 JPanel의를 넣어 :

는지도를 만들 청취자 :

JPanel jPanel1 = map.get(e.getComponent().getName()); 
+2

'this'는 무엇을 나타 냅니까? 어디에서이 라인들을 넣을 것인가? – user1803551

+0

확인해 보겠습니다. 다시 확인하겠습니다. –

+0

멋지다, 내 변경 사항을 참조하십시오. –

2

JComponent의 "클라이언트 속성"을 사용할 수 있습니다. 각 Jcomponent는 내부에 속성을 넣을 Map을 포함합니다. 키에 대해서는 "associatedPanel", 값에 대해서는 JPanel과 같은 상수 String을 사용할 수 있습니다.

JPanel panel1 = new JPanel(); 
JLabel label1 = new JLabel(); 
label1.putClientProperty("associatedPanel", panel1); 

지금 마우스 청취자의 배경을 설정하는 관련 패널을 얻을 getClientProperty를 ("associatedPanel")를 사용 코드는 다음과 같은 수 있습니다.

+1

두 번째 매개 변수는 JPanel이지만 JLabel의 이름에서 오는 문자열입니다. –

+0

@AbdulJabbarWebBestow 두 번째 매개 변수 *는'JPanel'이고, 레이블의 문자열은 원하는 것입니다. 당신이 말한 것처럼 너무 많은 레이블과 패널을 가지고 있다면 손으로 (아마도 잘못되었을 때) 모두 코드를 작성 했습니까? 아니면 절차 적으로 작성 했습니까? 당신은 거의 확실하게 피할 수있는 문제를 해결하려고 노력하고 있습니다. – user1803551

0

UI의 두 요소를 연결하는 가장 간단한 해결책은이를 클래스로 결합하는 것입니다. 그런 다음 다른 요소에서 해당 요소를 참조하는 것이 명확 해집니다. 같은

뭔가 :

class LabelPanel { 
    JLabel label; 
    JPanel pane; 
    ... 
} 

기본 작업 예 :

import java.awt.Color; 
import java.awt.GridLayout; 
import java.awt.event.MouseAdapter; 
import java.awt.event.MouseEvent; 
import java.util.ArrayList; 
import java.util.List; 
import java.util.Random; 

import javax.swing.JFrame; 
import javax.swing.JLabel; 
import javax.swing.JPanel; 
import javax.swing.SwingUtilities; 


public class TestLabelPanelComposition { 

    public static class LabelPanel { 

     private final JLabel label; 
     private final JPanel panel; 
     private Color colorToSet; 
     public LabelPanel(String labelText, final Color colorToSet) { 
      super(); 
      this.colorToSet = colorToSet; 
      this.label = new JLabel(labelText); 
      this.panel = new JPanel(); 
      label.addMouseListener(new MouseAdapter() { 
       @Override 
       public void mouseClicked(MouseEvent e) { 
        Color old= panel.getBackground(); 
        panel.setBackground(LabelPanel.this.colorToSet); 
        LabelPanel.this.colorToSet = old; 
       } 
      }); 
     } 

     public JLabel getLabel() { 
      return label; 
     } 

     public JPanel getPanel() { 
      return panel; 
     } 

    } 

    public static void main(String[] args) { 
     SwingUtilities.invokeLater(new Runnable() { 
      public void run() { 
       new TestLabelPanelComposition().initUI(); 
      } 
     }); 
    } 

    protected void initUI() { 
     JFrame frame = new JFrame(); 
     frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
     Random r= new Random(); 
     List<LabelPanel> labelPanels =new ArrayList<TestLabelPanelComposition.LabelPanel>(); 
     for(int i=0;i<10;i++) { 
      LabelPanel labelPanel = new LabelPanel("My Label to click "+(i+1), new Color(r.nextInt(256),r.nextInt(256),r.nextInt(256))); 
      labelPanel.getPanel().add(new JLabel("Some dummy text inside panel "+(i+1))); 
      labelPanels.add(labelPanel); 
     } 
     frame.setLayout(new GridLayout(0, 5)); 
     for (LabelPanel labelPanel : labelPanels) { 
      frame.add(labelPanel.getLabel()); 
     } 
     for (LabelPanel labelPanel : labelPanels) { 
      frame.add(labelPanel.getPanel()); 
     } 
     frame.pack(); 
     frame.setVisible(true); 
    } 
} 

이것은 실제 상황에 적응하기 너무 어렵지 않을 것이다.

관련 문제