当我的应用程序有多个相同的选项卡时,如何访问选项卡中的组件?(如何确定活动选项卡?)

Posted

技术标签:

【中文标题】当我的应用程序有多个相同的选项卡时,如何访问选项卡中的组件?(如何确定活动选项卡?)【英文标题】:how to reach a component in a tab when my app has several same tabs?(how to determin the active tab?) 【发布时间】:2012-08-01 00:09:36 【问题描述】:

我编写了一个连接到多个数据库的应用程序(检查link)。我分别有几个选项卡,其中包含带有 INPUT 文本字段的查询面板。现在我想访问选定选项卡中的特定文本字段以查询相关数据库...请让我现在如何访问它?

我应该提到我已经为 JPanel 创建了一个类,它应该被添加到 jTabbedPane 中,如下所示:

package testGUI_V2;

import javax.swing.BorderFactory;
import javax.swing.JButton;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.JTabbedPane;
import javax.swing.JTextField;
import javax.swing.JTextPane;
import javax.swing.SwingConstants;
import javax.swing.border.BevelBorder;
import static testGUI_V2.DialogBoxTest.service;

public class TabbedPane 
private String state;
private JLabel jLabel3;
private JTextField jTextField2;
private JTextPane jTextPane1;
private JButton jButton4;
private static int item = 0;
private int tabIndex;

public JPanel CreatePanel()
    state = service.toUpperCase();
    tabIndex = item;
    JPanel inst1 = new JPanel();
    String tabTitle =String.format("Query Panel %d",item+1);
    inst1.setSize(302, 138);
    inst1.setLayout(null);
    inst1.setBorder(BorderFactory
                    .createTitledBorder(BorderFactory
                    .createEtchedBorder(BevelBorder.LOWERED), tabTitle));
    inst1.setPreferredSize(new java.awt.Dimension(321, 108));

        jLabel3 = new JLabel("Employee ID", SwingConstants.LEFT);
        inst1.add(jLabel3);
        jLabel3.setBounds(12, 15, 103, 26);
        jLabel3.setVisible(true);

        jTextField2 = new JTextField();
        inst1.add(jTextField2);
        jTextField2.setVisible(true);
        jTextField2.setBounds(109, 15, 93, 30);

        jTextPane1 = new JTextPane();
        inst1.add(jTextPane1);
        jTextPane1.setBounds(6, 50, 307, 50);

        jButton4 = new JButton("Search");
        inst1.add(jButton4);
        jButton4.setVisible(true);
        jButton4.setBounds(231, 15, 82, 29);
        //jButton4.addActionListener(search);

        item++;
        return inst1;

public JTextField getQueryJTextField()
    return jTextField2;

public String getPanelState()
    return state;

public int getTabIndex()
    return tabIndex;


此外,以下代码与调用TabbedPane类的createPanel()方法的“连接”按钮相关:

            
            jButton2 = new JButton();
            getContentPane().add(jButton2);
            jButton2.setText("Connect");
            jButton2.setBounds(229, 50, 90, 29);
            jButton2.setVisible(false);
            jButton2.addActionListener(new ActionListener() 
                public void actionPerformed(ActionEvent evt) 
                    LinkedFrame inst2 = new LinkedFrame(inst, true);
                    inst2.setLocationRelativeTo(rootPane);
                    inst2.setVisible(true);
                    if (Connector.getProcessStatue()) 
                        TabbedPane inst= new TabbedPane();
                        jPanel3.setVisible(true);
                        tabbedPane1.addTab(connectionItem,null ,info.get(inst.getTabIndex()));
                        info.add(inst.CreatePanel());
                        System.out.println(inst.getPanelState());
                        jButton2.setVisible(false);
                        jButton3.setVisible(true);
                        setSize(342, 265);
                    

                
            );
        

请告诉我我的策略是否属实?

【问题讨论】:

您能否阐明这个问题与您之前关于此主题的问题how to create several tabs dynamically? 有何不同?请编辑您的问题以包含一个证明问题的sscce。 在我之前的问题中,我正在寻找一种在我的应用程序中创建多个选项卡的解决方案....它已解决,我的应用程序中有它们,但现在我无法访问面板中的文本字段时有多个标签...:( 【参考方案1】:

我几乎总是为我的 GUI 编程创建 JPanel 的子类。当我需要访问组件以供以后使用时,我还要确保在我的 JPanel 类中保留对这些组件的引用,并为我希望检索的数据提供访问器方法:

public class MyPanel extends JPanel 
  private JTextField myTextField = new JTextField();

  String getText() 
    return myTextField.getText();
  

我还创建了 JFrame 的子类来保存我的自定义面板。与 JPanel 子类一样,我将保留对自定义面板实例的私有引用:

public class MyFrame extends JFrame 
  private MyPanel myPanel = new MyPanel();

  public MyFrame() 
    this.add(myPanel);

    JButton someButton = new JButton("Do It!");
    someButton.addActionListener(new ActionListener() 
      public void actionPerformed(ActionEvent evt) 
        String text = MyFrame.this.myPanel.getText();

        // Do something with the text
      
    );
  

包含 MyPanel 实例的类可以是任何东西,而不仅仅是 JFrame。不过,基本思想适用:子类化 Swing 组件并保留创建后需要访问的组件的引用。

【讨论】:

感谢您的帮助....请考虑到应该有几个选项卡,每个选项卡都有自己的搜索按钮...所以我必须以这样的方式创建面板,我可以区分每个面板并达到自己的搜索按钮...请给我一个解决方案如何处理这个问题?!!! 请编辑您的问题或向我们提出一个新问题,告诉我们您到目前为止尝试了什么。 每个选项卡上的控件是相同还是不同? 您的意思是您不希望能够返回到上一个选项卡,或者您想要,但您当前的实现不允许它? 是的,我希望能够使用以前的选项卡,但我当前的代码不允许我....我可以将我的可运行 Jar 文件发送给您以更好地理解问题或我的所有代码和类。

以上是关于当我的应用程序有多个相同的选项卡时,如何访问选项卡中的组件?(如何确定活动选项卡?)的主要内容,如果未能解决你的问题,请参考以下文章

当我从一个选项卡单击到另一个选项卡时,如何使TabLayout中的选项卡不可滚动

关闭选项卡时如何防止调试器停止

如何更改 TabHost 中的选项卡图像

打开多个应用程序选项卡时通知未关闭

单击另一个选项卡时撤消折叠工具栏

更改选项卡时避免/防止片段刷新