Добавление JMenuItems в JMenu из результатов ReGex через текстовый файл в определенном порядке
В моем JMenuBar я пытаюсь добавить другое JMenu с именем "Party", и в этом меню есть больше меню, которым назначены элементы. У меня проблема либо в том, что мой ReGex не захватывает все нужные значения, и я не уверен, как бы я добавил их в правильном порядке.
Текстовый файл, который я использую для тестирования, выглядит следующим образом (с номерами строк):
- ПК- Брэндон
- C- Дэйв
- C- Боб
- PC-CJ
- C- Джон
- C- Джим
- ПК- Надежда
- C- Элейн
- C- Ким
- C- Джо
- ПК-Райан
- С-Тед
У меня правильно загружается файл, но ReGex, похоже, не захватывает все то, что должен. Предполагаемый JMenu будет выглядеть так:
- Brandon
- Дейв
- боб
- CJ
- Джон
- Джим
- надежда
- Элейн
- Ким
- Джо
- Райан
- Тед
Что-нибудь, начинающееся с "PC- ", являющегося JMenu в JMenu Party, и что-либо, начинающееся с "C- ", являющегося JMenuItem под соответствующим JMenu. Вот мой текущий код для этого раздела.
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 из "^((\w+\W+)(\w+))" только захватывает: (ПК-Брэндон ПК-Брэндон, ПК-, Брэндон, ПК- CJ, ПК- CJ, ПК-, CJ, ПК- Надежда, ПК- Надежда, ПК-, Надежда) И ничего с "C- "
Буду признателен за любую помощь, и если вам нужна дополнительная информация, пожалуйста, просто спросите!
1 ответ
Во-первых, простите мою педантичность, но "регулярное выражение" - это сокращение от "регулярное выражение". Заглавная буква "ReGex" не имеет смысла, потому что нет слова, начинающегося с G. "RegEx" будет приемлемым, хотя на практике не применяется заглавная буква; это просто "регулярное выражение" или "регулярное выражение".
На самом деле вам нужно гораздо меньше функций регулярных выражений, чем вы думаете. Вместо того, чтобы пытаться прочитать весь файл, а затем проанализировать полученный в результате гигантский шарик текста, вам нужно просто обработать каждую строку, когда вы ее читаете:
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();
}
Приведенный выше код предполагает, что каждая строка "C-" может соответствовать первому регулярному выражению вашего кода. Как указывает @camickr, текстовые строки, которые вы указали в своем вопросе, вообще не содержат "http", поэтому совпадение никогда не будет успешным. Имейте в виду, что показ данных, которые не являются данными, с которыми вы действительно имеете дело, значительно затрудняет ответ на ваш вопрос.
Вам не нужно вызывать frame.revalidate() или frame.repaint(). Оба из них обрабатываются автоматически при добавлении компонентов в контейнер, если вы не используете пользовательский контейнер и / или пользовательский макет.