按标题选择标签

时间:2016-09-15 12:10:23

标签: 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();
    }
}

此代码,它可以按索引选择制表符。

在我的问题中如何通过查找标题来选择标签。所以,如果我输入"编译器"它可以选择标题"编译器"。

2 个答案:

答案 0 :(得分:4)

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

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()传递用户输入(和compoenent),如果返回的索引不是-1,你可以调用tab.setSelectedIndex()

答案 1 :(得分:2)

简单:执行拥有内务管理:创建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. 我“修复”了你的类的名字 - 类名总是启动UpperCase。
  2. 我将您的字段更改为私有&amp; final - 就像你应该努力的“默认”:确保你的类的内部保持内部(使用私有);并且您不必担心意外覆盖其内容(使用最终版本)。
  3. 如果你认为你会更频繁地需要这个,那么创建你自己的子类的JTabbedPane甚至是合理的,它使用上述机制并提供相应的getter方法。