按标题选择标签

new*_*bie 5 java swing jtabbedpane

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

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();
    }
}
Run Code Online (Sandbox Code Playgroud)

此代码,可以按索引选择选项卡。

在我的问题中,如何通过查找标题来选择标签。因此,如果我输入“ compiler”,则可以选择标题为“ compiler”的标签。

a_h*_*ame 5

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

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;
}
Run Code Online (Sandbox Code Playgroud)

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


Gho*_*ica 3

简单:做你自己的家务:你创建一个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);
  }
Run Code Online (Sandbox Code Playgroud)

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

然后,您只需替换

tab.add("code",new JPanel());
Run Code Online (Sandbox Code Playgroud)

addComponentToPaneAndMap("code", new JPanel());
Run Code Online (Sandbox Code Playgroud)

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

 Component someComponent = componentsByName.get("compiler");
Run Code Online (Sandbox Code Playgroud)

请注意:

  1. 我“修复”了你的类的名称 - 类名总是以大写开头。
  2. 我将您的字段更改为私有和最终字段 - 这就像您应该争取的“默认”:确保类的内部保持内部(使用私有);并且您无需担心意外覆盖其内容(使用final)。

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