簡體   English   中英

Java 獲取 JPanel 組件

[英]Java get JPanel Components

我有一個充滿 JTextFields 的 JPanel ......

for (int i=0; i<maxPoints; i++) {
    JTextField textField = new JTextField();
    points.add(textField);
}

我以后如何在該 JPanel 中獲取 JTextFields? 就像我想要他們的價值觀一樣

TextField.getText();

謝謝

Java 中的每個 JPanel 也是一個 AWT 容器。 因此,您應該能夠使用 getComponents 來獲取面板中包含的組件數組,對其進行迭代,檢查它們的類型(以確保您沒有獲得其他控件),並對它們進行任何您需要的操作。

然而,這通常是糟糕的設計。 如果您知道您將需要訪問特定組件,最好維護這些文本字段的數組並將其傳遞,即使它們在視覺上包含在容器中。

如果這是一個經常性的任務或者可以從多個點完成,甚至可以有一個特殊的類來表示一個帶有文本字段的面板,然后通過它的接口提供訪問這些字段的方法。

請記住,他們自己並沒有到達那里(我想閱讀一些關於在運行時動態創建這些面板的問題)

在那張貼的答案中,有人說您應該在數組中保留對這些文本字段的引用。 這正是您在這里需要的:

List<JTextField> list = new ArrayLists<JTextField>();

// your code...
for (int i=0; i<maxPoints; i++) { 
    JTextField textField = new JTextField();
    points.add(textField);
    list.add( textField ); // keep a reference to those fields.
}

// 之后

for( JTextField f : list ) { 
   System.out.println( f.getText() ) ;
}

那不是很容易嗎?

請記住將這些類型的工件(列表)盡可能保密。 它們僅供您控制,我認為它們不屬於界面。

假設您想要獲取文本數組,而不是

 public List<JTextField> getFields();

你應該考慮:

 public List<String> getTexts(); // get them from the textfields ... 

這就是我遞歸遍歷容器並獲取 JPanel 上的文本字段的方法。

private void ClearAllFields(Container myContainer) {

    Component myComps[] = myContainer.getComponents();

    for (int i=0; i<myComps.length; i++) {
      if(myComps[i] instanceof JPanel) {
          JPanel myPanel = (JPanel) myComps[i];
          ClearAllFields(myPanel);
      }
      if(myComps[i] instanceof JTextField) {
        JTextField myTextField = (JTextField) myComps[i];
        myTextField.setText("");
      }
    }        
}

然后使用它,你這樣稱呼它

ClearAllFields([jdialog or jframe etc].getContentPane());

您應該調用 getComponents 方法,該方法返回 JPanel 上所有元素的數組。 在您可以迭代數組並檢查它是否與尋求的組件相等之后。

List<JTextField> list = new ArrayLists<JTextField>();
Component[] components = panel.getComponents();

for (Component component : components) {
    if (component.getClass().equals(JTextField.class)) {
        list.add((JTextField)component);
    }
}
    //una forma de recorer todos los elementos dentro de un jpanel
    Component[] components = jPanelX.getComponents();

    for (int i = 0; i < components.length; i++) {

        if(components[i].getClass().getName().toString().equals("javax.swing.JTextField")){
            components[i].setEnabled(false);
        }
    }

在創建過程中動態地為其命名,然后執行此操作。

    Component[] components = panel.getComponents();
    for (Component component: components) {
        var name = component.getName();  
        if(name != null){    
            if(name.equals("textfield 1")){
                var field = (JTextField)component;
                field.setText("whatever you want / same for options and other components")
            }
        }

    }

您的問題是編寫繁瑣的代碼文本。 為什么不直接生成並粘貼到程序中!!...

for(int i=1 ; i<=maxpoints ;i++){
   System.out.println("JTextField tf"+i+" = new JTextField()"+";");
   System.out.println("points.add(tf"+i+")"+";");
}

將上述代碼的輸出粘貼到您的程序中,您就完成了。 現在,要訪問文本字段的內容,您可以以類似的方式生成繁瑣的代碼文本......

for(int i=1 ; i<=maxpoints ;i++){
   System.out.println("String s"+i+" = JTextField tf"+i+".getText()"+";");
}
public Component getComponentByName(Container parent,String name) {
        java.util.List<Component> clist = new ArrayList<>();
        listAllComponentsIn(parent,clist);
        for (Component c : clist) {
            System.out.println(c.getName());
            String s = c.getName();
            if(s!=null){
                if(s.equals(name)){
                    return c;
                }
            }
        }
        return null;
    }
    public void listAllComponentsIn(Container parent,java.util.List<Component> components)
    {
        for (Component c : parent.getComponents()) {
            components.add(c);
            if (c instanceof Container) {
                listAllComponentsIn((Container) c,components);
            }
        }
    }

如果您有父母,那么您可以隨時隨地獲取您的文本字段。 例如,我在名為 searchBar 的 JPanel 上添加了我的 textField。 首先,我給 textField 起了一個名字(“txt_search_box”),然后我可以從任何地方獲取這個 textField,因為我通過使用這個引用了 JPanel(searchBar)-

searchBar.setVisible(true);
                        JTextField jTextField = (JTextField) getComponentByName(searchBar,"txt_search_box");
                        if(jTextField!=null){
                            jTextField.requestFocusInWindow();
                        } 

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM