从ReGex的结果通过特定顺序的文本文件将JMenuItems添加到JMenu

时间:2015-10-25 20:35:22

标签: java regex swing frame

在我的JMenuBar中,我试图添加另一个名为" Party"的JMenu。并在该菜单中有更多菜单,分配有项目。 我遇到的问题是我的ReGex并没有抓住所有正确的值,我不确定如何以正确的顺序添加它们。

我用于测试的文本文件如下(带行号):

  1. PC- Brandon
  2. C-戴夫
  3. C- Bob
  4. PC-CJ
  5. C-约翰
  6. C-吉姆
  7. PC-希望
  8. C-Elaine
  9. C-Kim
  10. C- Joe
  11. PC- Ryan
  12. C-Ted
  13. 我正确地加载了文件但是ReGex似乎并没有抓住它所应该做的所有事情。 预期的JMenu看起来像这样:

    • 布兰登
      • 戴夫
      • 鲍勃
    • CJ
      • 约翰
      • 吉姆
    • 希望
      • 伊莱恩
    • 赖安
      • 泰德

    任何以" PC-"开头的东西作为JMenu党的JMenu 以及" C-"作为JMenu下的JMenuItem 这是我此部分的当前代码。

    void loadParty(File f, Frame frame, JMenuBar mb, JMenu me) throws FileNotFoundException {
       Scanner scan = new Scanner(new FileReader(f));
       List<String> text = new ArrayList<String>();
       JMenuItem item;
       me.setText("Party");
       JMenu subMen = new JMenu();
    
       while(scan.hasNextLine()) {
           text.add(scan.nextLine());
       }
       ArrayList<String> matchesCC = new ArrayList<String>();
       ArrayList<String> charLinks = new ArrayList<String>();
       String regexCC ="^(C- )+(\\w+)+( : )+(http:(.*))";
       Pattern cc = Pattern.compile(regexCC, Pattern.MULTILINE);
       for (String s:text) {
           Matcher m = cc.matcher(s);
           if (m.matches()) {
               charLinks.add(m.group(4));
           }
       }
    
       String regexTest = "^((\\w+\\W+)(\\w+))";
       ArrayList<String> matchTest = new ArrayList<String>();
       ArrayList<String> cT = new ArrayList<String>();
       Pattern dmTest = Pattern.compile(regexTest, Pattern.MULTILINE);
       for (String s:text) {
           Matcher m = dmTest.matcher(s);
           if (m.matches()) {
               for (int i = 0; i <= m.groupCount(); i++) {
                     System.out.println(m.group(i));
                }
               matchTest.add(m.group(2));
               cT.add(m.group(3));
           }
       }
       for(int i = 0; i < cT.size(); i++) {
           System.out.println(cT.get(i));
       }
    
       for(int i = 0; i < matchTest.size(); i++) {
          if(matchTest.get(i) == "PC- ") {
              subMen = new JMenu(cT.get(i));
              if(matchTest.get(i) == "C- ") {
                  item = new JMenuItem(cT.get(i));
                  item.setMnemonic(KeyEvent.VK_0);
                  item.addActionListener(new ActionListener() {
                      public void actionPerformed(ActionEvent e) {
                          for(int l = 0; l <charLinks.size(); l++) {
                              if(e.getActionCommand() == matchesCC.get(l)) {
                                  URL = charLinks.get(l);
                                  loadLink(URL);
                              }
                          }
                      }
                  });
                  subMen.add(item);
              }
          } 
              me.add(subMen);
       }
       frame.revalidate();
       frame.repaint();
     }
    

    出于某种原因,我的ReGex&#34; ^((\ w + \ W +)(\ w +))&#34;只是抓住:( PC-布兰登 PC-布兰登, PC-, 布兰登, PC-CJ, PC-CJ, PC-, CJ, PC-希望, PC-希望, PC-, 希望)并没有&#34; C-&#34;

    任何帮助将不胜感激,如果您需要更多信息,请询问!

1 个答案:

答案 0 :(得分:1)

首先,原谅我的迂腐,但&#34;正则表达式&#34;是&#34;正则表达式的缩写。&#34;资本化&#34; ReGex&#34;是荒谬的,因为没有一个单词以G开头。&#34; RegEx&#34;虽然在实践中没有应用资本化,但是可以接受;它只是&#34;正则表达式&#34;或&#34; regexp&#34;。

实际上,你需要的正则表达式功能远比你想象的要少得多。而不是尝试读取整个文件,然后解析生成的巨大文本块,您应该在阅读时处理每一行:

JMenu subMen = null;
while (scan.hasNextLine()) {
    String itemType = scan.next();
    String label = scan.next();

    if (itemType.equals("PC-")) {
        subMen = new JMenu(label);
        me.add(subMen);
    } else {
        final String url = scan.findInLine("http\\S+");

        JMenuItem item = new JMenuItem(label);
        item.addActionListener(e -> loadLink(url));
        subMen.add(item);
    }

    scan.nextLine();
}

上面的代码假定每个&#34; C - &#34; line能够匹配您的代码的第一个正则表达式。正如@camickr指出的那样,你在问题中显示的文字行不包含&#34; http&#34;在他们身上,所以这场比赛永远不会成功。请注意,显示与您正在处理的数据不相关的数据会使您的问题更难回答。

您不需要调用frame.revalidate()或frame.repaint()。除非您使用自定义容器和/或自定义布局,否则在将组件添加到容器时会自动处理这两者。