Select 标签按标题

Select tab by title

我已经创建了一个简单的代码:

import javax.swing.*;
import java.awt.event.*;
import java.awt.*;
class tab extends JFrame
{
    JTabbedPane tab=new JTabbedPane();
    JTextField input=new JTextField();
    JButton button=new JButton("process");
    tab()
    {
        setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        setSize(600,600);
        setLocation(100,100);
        setLayout(new BorderLayout());
        add(tab,"Center");

            tab.add("code",new JPanel());
            tab.add("assembly",new JPanel());
            tab.add("compiler",new JPanel());
            tab.add("Execution",new JPanel());
            tab.add("Structure",new JPanel());

        JPanel panel=new JPanel();
        add(panel,"South");
            panel.setLayout(new BorderLayout());
            panel.add(input,"Center");
            panel.add(button,"East");

        button.addActionListener(new ActionListener(){
            public void actionPerformed(ActionEvent e)
            {
                tab.setSelectedIndex(Integer.parseInt(input.getText()));
            }
        });

        show();
    }
    public static void main(String[]args)
    {
        new tab();
    }
}

这段代码,可以select按索引编辑标签。

在我的问题中,如何通过查找标题来 selected 选项卡。所以如果我输入 "compiler" 它可以 select 标签那个标题 "compiler".

简单:做你自己的内务管理:你创建一个Map<String, Component> componentsByName;每当您将组件添加到 TabbedPane 时,您也会将该组件添加到该地图。

当然,您希望尽可能方便;所以你应该这样做:

public class Tab extends JFrame {
  private final JTabbedPane tab=new JTabbedPane();
  private final Map<String, Component> componentsByName = new HashMap<>();

  ...
  private void addComponentToPaneAndMap(String title, Component component) {
    tab.add(title, component);
    componentsByName.put(title, component);
  }

(好吧,不仅是为了方便,也是为了确保 所有 进入您的窗格的组件也进入地图!)

然后,您只需替换

tab.add("code",new JPanel());

addComponentToPaneAndMap("code", new JPanel());

稍后,当您需要访问选项卡中的某个组件时;您可以像这样进行简单的查找:

 Component someComponent = componentsByName.get("compiler");

请注意:

  1. 我 "fixed" 你的名字 class - class 名字总是以大写开头。
  2. 我将您的字段更改为私有字段和最终字段 - 这就像您应该争取的 "default":确保您的 [=47= 的 internals ]es 留在内部(使用私有);并且您无需担心不小心覆盖它们的内容(使用 final)。

如果您认为您会更频繁地需要它,创建您自己的 JTabbedPane 的 subclass 甚至是合理的,它使用上述机制并提供相应的getter 个方法。

您可以简单地遍历选项卡并找到具有给定名称的索引:

public int findTabByName(String title, JTabbedPane tab)  
{
  int tabCount = tab.getTabCount();
  for (int i=0; i < tabCount; i++) 
  {
    String tabTitle = tab.getTitleAt(i);
    if (tabTitle.equals(title)) return i;
  }
  return -1;
}

然后在您的代码中调用 findTabByName() 并传递用户输入(和组件),如果返回的索引不是 -1,您可以调用 tab.setSelectedIndex()