【问题标题】:Accessing the components from another class从另一个类访问组件
【发布时间】:2012-09-02 15:41:18
【问题描述】:

我对java很陌生。

我有一个正在创建 gui 的类和另一个类(主类),我正在访问 gui 类。在 gui 类中,我正在创建一些组件并返回它们。

gui类,

        public class Gui {

            public Component getTopPanelContent(){
                Jpanel jp = new Jpanel();
                JComboBox cbo1 = new JComboBox();
                JComboBox cbo2 = new JComboBox();
                JComboBox cbo3 = new JComboBox();
                JComboBox cbo4 = new JComboBox();
                JComboBox cbo5 = new JComboBox();
                JButton button = new JButton();

                jp.add(cbo1);
                jp.add(cbo2);
                jp.add(cbo3);
                jp.add(cbo4);
                jp.add(cbo5);
                jp.add(button);
                return jp; 
            }
        }

主类,

        public void addComponents(int id){
           Gui g = new Gui();
           Jpanel container = new Jpanel();

           if(id == 1){
               container.add(g.getTopPanelContent);     
           }
        }

到目前为止,它的工作正常。

在主类中有一个JTextArea,每当我打开一个文件时,我必须在cbo1中显示国家列表,该文件包含必须显示的国家列表,

       String[] countries = editArea.getContents().split("\n");

如何将国家/地区值传递给 cbo1

谢谢

【问题讨论】:

    标签: java swing oop class jcombobox


    【解决方案1】:

    两种方法....

    • 将 cbo1 设为 static...所以您必须在 Class 范围内的方法之外声明它...

      所以会是这样的..

      for(String s: countries){ 
      
       Gui.cbo1.addItem(s);
      
      
       }
      
    • 或使用Singleton principleGui 类设置为Singleton,然后使用Composition 访问JComboBox cbo1

    【讨论】:

      【解决方案2】:

      嗯,我通常看到一个 GUI 类具有摆动组件作为类属性。你为你的 GUI 制作了一个类似于“util”类的东西,所以你必须寻找你的 JComboBox

      我建议你去参加一个功能齐全的课程来代表你的 GUI,比如:

      import javax.swing.*;
      
      public class Gui extends JPanel {
      
          private JComboBox cbo1 = new JComboBox();
          private JComboBox cbo2 = new JComboBox();
          private JComboBox cbo3 = new JComboBox();
          private JComboBox cbo4 = new JComboBox();
          private JComboBox cbo5 = new JComboBox();
          private JButton button = new JButton();
      
          public Gui() {
              add(cbo1);
              add(cbo2);
              add(cbo3);
              add(cbo4);
              add(cbo5);
              add(button); 
          }
      }
      

      另外,添加 getter 和 setter ;-)。

      如果您想按自己的方式保留代码,可以按索引搜索组合框:

      System.out.println( jp.getComponent(0) );
      

      或者,更好的是,您可以命名您的 JComboBox,然后按名称搜索:

      cbo1.setName("countryCombo");
      jp.add(cbo1);
      

      然后:

      public Component findCbo1() {
          for (Component comp : this.getComponents()) {
              if(comp.getName() != null && comp.getName().equals("countryCombo")) {
                  return comp;
              }
          }
          return null;
      }
      

      【讨论】:

      • 这就是我在文章末尾所指的那种代码。 :)
      【解决方案3】:

      您可以将组件向上移动以成为类变量并添加公共 getter。这些 getter 可以从您的主类中访问。

      GUI类->

      public class Gui {
          private JPanel jp;
          private JComboBox cbo1;
          private JComboBox cbo2;
          private JComboBox cbo3;
          private JComboBox cbo4;
          private JComboBox cbo5;
          private JButton button;
      
          public Component getTopPanelContent(){
              jp = new JPanel();
              cbo1 = new JComboBox();
              cbo2 = new JComboBox();
              cbo3 = new JComboBox();
              cbo4 = new JComboBox();
              cbo5 = new JComboBox();
              button = new JButton();
      
              jp.add(cbo1);
              jp.add(cbo2);
              jp.add(cbo3);
              jp.add(cbo4);
              jp.add(cbo5);
              jp.add(button);
              return jp; 
          }
      
          /**
           * @return the jp
           */
          public JPanel getJp() {
              return jp;
          }
      
          /**
           * @return the cbo1
           */
          public JComboBox getCbo1() {
              return cbo1;
          }
      
          /**
           * @return the cbo2
           */
          public JComboBox getCbo2() {
              return cbo2;
          }
      
          /**
           * @return the cbo3
           */
          public JComboBox getCbo3() {
              return cbo3;
          }
      
          /**
           * @return the cbo4
           */
          public JComboBox getCbo4() {
              return cbo4;
          }
      
          /**
           * @return the cbo5
           */
          public JComboBox getCbo5() {
              return cbo5;
          }
      
          /**
           * @return the button
           */
          public JButton getButton() {
              return button;
          }
      }
      

      主类->

      public void addComponents(int id){
          Gui g = new Gui();
          g.getCbo1().addItem("text");
      }
      

      虽然这解决了您的问题,但它引出了一个问题,您创建一个类只是为了保存 GUI 组件是否有特定的原因?有比这更好的方法来处理组件(特别是如果您的应用程序将变得更大。

      【讨论】:

        【解决方案4】:

        在这里你可以做的是:

        public class Gui {
            public Component getTopPanelContent(){
                Jpanel jp = new Jpanel();
                JComboBox cbo1 = new JComboBox();
                ...
                return jp; 
            }
        
            public void addItemsToCBo1(String[] items){
                for(String item : items){
                    cbo1.addItem(item);
                }
           }
        }
        

        主类:

        public void addComponents(int id){
            Gui g = new Gui();
            Jpanel container = new Jpanel();
        
            if(id == 1){
                container.add(g.getTopPanelContent);
                g.addItemsToCBo1(editArea.getContents().split("\n"));
            }
        }
        

        【讨论】:

          猜你喜欢
          • 2012-09-07
          • 2014-04-06
          • 1970-01-01
          • 1970-01-01
          • 2012-10-25
          • 2014-05-25
          • 1970-01-01
          • 2015-02-05
          • 1970-01-01
          相关资源
          最近更新 更多