file-type

JavaFX TableView过滤教程:实现步骤与示例

TXT文件

下载需积分: 0 | 12KB | 更新于2024-08-03 | 55 浏览量 | 0 下载量 举报 收藏
download 立即下载
在JavaFX中实现表格过滤功能是一项常见的任务,特别是在处理大量数据时,用户通常希望能够根据输入的关键字动态筛选显示内容。以下是关于如何在JavaFX TableView中实现过滤功能的详细步骤: 1. 数据包装: 首先,你需要将原始的数据(通常是一个ObservableList)进行包装,以便于过滤和排序。可以创建一个`FilteredList`对象,它会基于提供的条件(过滤器)筛选数据。例如: ```java ObservableList<Person> originalData = FXCollections.observableArrayList(persons); FilteredList<Person> filteredList = new FilteredList<>(originalData); ``` 2. 排序列表: 在某些情况下,可能还需要对过滤后的数据进行排序,这时可以进一步包装`FilteredList`为`SortedList`。这样,用户可以根据不同的列头点击进行排序: ```java SortedList<Person> sortedList = new SortedList<>(filteredList); ``` 3. 初始化列: 初始化你的表格列,例如`TableColumn`,代表每个数据项的属性。例如,如果你有`firstName`和`lastName`列,可以这样设置: ```java @FXML private TableColumn<Person, String> firstNameColumn; @FXML private TableColumn<Person, String> lastNameColumn; // 在Fxml加载后设置cell值工厂 firstNameColumn.setCellValueFactory(cellData -> cellData.getValue().getFirstNameProperty()); lastNameColumn.setCellValueFactory(cellData -> cellData.getValue().getLastNameProperty()); ``` 4. 捕捉用户输入: 创建一个`TextField`来获取用户的输入,用户可以在该字段中输入关键字进行过滤: ```java @FXML private TextField filterField; // 在事件处理器中获取用户输入 filterField.textProperty().addListener((obs, oldText, newText) -> { filteredList.setPredicate(person -> person.getFirstName().toLowerCase().contains(newText.toLowerCase())); // 可能还需要根据姓氏或其他字段更新过滤逻辑 }); ``` 在这里,我们使用`toLowerCase()`方法确保不区分大小写,并通过`contains()`方法判断是否包含用户输入的关键字。 5. 应用过滤: 当用户输入发生变化时,调用`predicate`方法更新`FilteredList`的过滤条件,只显示满足条件的行。 6. 集成到`TableView`: 最后,在`PersonTableController`中,将`sortedList`绑定到`TableView`上: ```java @FXML private TableView<Person> tableView; tableView.setItems(sortedList); ``` 通过这些步骤,你就能在JavaFX的TableView中实现一个动态过滤的功能,允许用户根据输入快速浏览数据。记得根据实际需求调整代码细节,比如处理多字段过滤、实时更新等。

相关推荐

filetype

原处理的txt文件基本上都含有时间信息(例如02126093937_02126090040_20240223172540.txt),如何修改以下代码,使得同一天的sentence最后合并到一个CSV中,文件名为日期名。import os import csv import glob from openai import OpenAI from typing import List import re def english_sentence_split(text, max_length=60): """ 用英文标点分句,并合并到每行不超过max_length字符,尽量不截断语义。 """ # 用英文句号、问号、感叹号分句 sentences = re.split(r'(?<=[.!?])\s+', text) result = [] buffer = "" for sent in sentences: sent = sent.strip() if not sent: continue # 合并到不超过max_length,尽量不截断 if len(buffer) + len(sent) + 1 <= max_length: buffer = buffer + " " + sent if buffer else sent else: if buffer: result.append(buffer) buffer = sent if buffer: result.append(buffer) return result class MarketContentExtractor: def __init__(self, api_key: str): """初始化DeepSeek客户端""" self.client = OpenAI( api_key=api_key, base_url="https://api.deepseek.com" ) def extract_market_content(self, conversation_text: str) -> List[str]: """ 使用DeepSeek模型提取与市场相关的内容 """ system_prompt = """ 你是一个市场专家,只提取输出市场相关的句子,不要解释。 重要要求: 1. 与市场行情相关的内容就保留 3. 只输出市场行情相关的原句,不要修改任何内容 4. 每个完整的话题或相关联的句子组合占一行 5. 每行长度不宜过短(不少于15字),也不宜过长(不超过60字),如有需要可适当合并或拆分句子 6. 保持内容的原始顺序 7. 如果没有市场行情相关内容,输出"无相关内容" 8. 不要添加任何解释或标注 9. 相关联的句子之间用空格连接,保持原文的标点符号 10.若只讨论某个品类的相关信息,而不讨论其市场行情或库存量情况的,输出"无相关内容" 11.请将最终输出内容翻译成英文,并且只输出英文文本(非常重要) 示例若仅讨论高强度钢筋这种商品,而没讨论其价格或者库存量情况的,应输出"无相关内容" """ user_prompt = f"仅保留并输出与市场相关的内容(原句,最后一定要是英文),不改变原内容,请确保所有输出内容全部为英文,不要出现任何中文或其他非英文字符。:\n\n{conversation_text}" try: response = self.client.chat.completions.create( model="deepseek-reasoner", messages=[ {"role": "system", "content": system_prompt}, {"role": "user", "content": user_prompt} ], temperature=0.1, # 降低随机性,确保输出稳定 max_tokens=4000, stream=False ) result = response.choices[0].message.content.strip() # 如果没有相关内容 if "无相关内容" in result or "无市场相关内容" in result: return [] # 按行分割并清理空行 sentences = [line.strip() for line in result.split('\n') if line.strip()] return sentences except Exception as e: print(f"API调用失败: {e}") return [] def read_txt_file(self, file_path: str) -> str: """读取txt文件内容""" try: with open(file_path, 'r', encoding='utf-8') as file: return file.read() except UnicodeDecodeError: # 如果UTF-8失败,尝试GBK编码 try: with open(file_path, 'r', encoding='gbk') as file: return file.read() except Exception as e: print(f"读取文件 {file_path} 失败: {e}") return "" except Exception as e: print(f"读取文件 {file_path} 失败: {e}") return "" def save_to_csv(self, sentences: List[str], csv_path: str): """将句子保存到CSV文件,每行不超过60字""" try: with open(csv_path, 'w', newline='', encoding='utf-8-sig') as csvfile: writer = csv.writer(csvfile) # 写入表头 writer.writerow(['number', 'sentence']) idx = 1 for sentence in sentences: split_sentences = english_sentence_split(sentence, 60) for seg in split_sentences: writer.writerow([idx, seg.strip()]) idx += 1 print(f"成功保存 {idx-1} 条市场相关内容到 {csv_path}") except Exception as e: print(f"保存CSV文件 {csv_path} 失败: {e}") def process_single_file(self, txt_path: str, output_dir: str): """处理单个txt文件""" print(f"正在处理: {txt_path}") # 读取文件内容 conversation_text = self.read_txt_file(txt_path) if not conversation_text: print(f"文件 {txt_path} 内容为空或读取失败") return # 提取市场相关内容 market_sentences = self.extract_market_content(conversation_text) if not market_sentences: print(f"文件 {txt_path} 中未找到市场相关内容,不生成CSV文件。") return # 生成CSV文件路径 base_name = os.path.splitext(os.path.basename(txt_path))[0] csv_path = os.path.join(output_dir, f"{base_name}_market_content.csv") # 保存到CSV self.save_to_csv(market_sentences, csv_path) def remove_irrelevant_csv(self, output_dir: str): """遍历所有生成的CSV文件,若sentence列的第一行数据为No relevant content则删除该CSV文件""" csv_files = glob.glob(os.path.join(output_dir, "*.csv")) for csv_file in csv_files: try: with open(csv_file, 'r', encoding='utf-8-sig') as f: reader = csv.reader(f) header = next(reader, None) # 跳过表头 first_row = next(reader, None) if first_row and len(first_row) > 1 and first_row[1].strip().lower() == "No relevant content": f.close() os.remove(csv_file) print(f"已删除无相关内容的CSV文件: {csv_file}") except Exception as e: print(f"检查或删除CSV文件 {csv_file} 失败: {e}") def batch_process(self, input_dir: str, output_dir: str): """批量处理txt文件""" # 确保输出目录存在 os.makedirs(output_dir, exist_ok=True) # 查找所有txt文件 txt_files = glob.glob(os.path.join(input_dir, "*.txt")) if not txt_files: print(f"在目录 {input_dir} 中未找到txt文件") return print(f"找到 {len(txt_files)} 个txt文件") # 逐个处理文件 for i, txt_file in enumerate(txt_files, 1): print(f"\n[{i}/{len(txt_files)}] ", end="") self.process_single_file(txt_file, output_dir) self.remove_irrelevant_csv(output_dir) print(f"\n批量处理完成!结果保存在: {output_dir}") def main(): # 配置参数 API_KEY = "sk-8f3153cd288249358ee7db91f0d891f5" # 替换为您的DeepSeek API密钥 INPUT_DIR = "E:/voiceproject/data2/" # txt文件所在目录 OUTPUT_DIR = "E:/voiceproject/outputcsv/" # CSV输出目录 # 创建提取器实例 extractor = MarketContentExtractor(API_KEY) # 批量处理 extractor.batch_process(INPUT_DIR, OUTPUT_DIR) if __name__ == "__main__": main()

filetype

teacher-ai-platform/ ├── src/ │ ├── main/ │ │ ├── java/ │ │ │ └── com/ │ │ │ └── example/ │ │ │ └── teacherportal/ │ │ │ ├── ai/ # AI核心功能模块 │ │ │ │ ├── CourseDesigner.java # 备课与设计 │ │ │ │ ├── AssessmentGenerator.java # 考核内容生成 │ │ │ │ ├── LearningAnalyst.java # 学情数据分析 │ │ │ │ └── TongyiClient.java # 通义大模型客户端 │ │ │ ├── config/ │ │ │ │ ├── TongyiConfig.java # 通义API配置 │ │ │ │ └── AiConfig.java # AI功能配置 │ │ │ ├── controller/ │ │ │ │ ├── ai/ │ │ │ │ │ ├── CourseDesignController.java │ │ │ │ │ ├── AssessmentController.java │ │ │ │ │ └── AnalysisController.java │ │ │ │ └── ...其他控制器 │ │ │ ├── model/ │ │ │ │ ├── dto/ │ │ │ │ │ ├── ai/ │ │ │ │ │ │ ├── CourseDesignRequest.java │ │ │ │ │ │ ├── AssessmentRequest.java │ │ │ │ │ │ └── AnalysisRequest.java │ │ │ │ │ └── ...其他DTO │ │ │ │ ├── entity/ │ │ │ │ │ ├── Course.java │ │ │ │ │ ├── Assignment.java │ │ │ │ │ └── ...其他实体 │ │ │ │ └── ai/ │ │ │ │ ├── TeachingPlan.java # 教学计划模型 │ │ │ │ ├── Assessment.java # 考核模型 │ │ │ │ └── AnalysisResult.java # 分析结果模型 │ │ │ ├── service/ │ │ │ │ ├── DocumentService.java # 文档处理服务 │ │ │ │ └── ...其他服务 │ │ │ ├── util/ │ │ │ │ ├── PromptBuilder.java # 提示词构建工具 │ │ │ │ └── DocumentParser.java # 文档解析工具 │ │ │ └── Application.java # 启动类 │ │ └── resources/ │ │ ├── application.yml │ │ ├── prompts/ # 提示词模板 │ │ │ ├── course_design_prompt.txt │ │ │ ├── assessment_prompt.txt │ │ │ └── analysis_prompt.txt │ │ └── ...其他资源 │ └── test/ # 测试目录 ├── .gitignore ├── pom.xml └── README.md 这是你之前给的项目结构

filetype

import os import re import requests import json from datetime import datetime # 新增配置项 MEMORY_ROOT = "./memory" PERSONAL_DIR = os.path.join(MEMORY_ROOT, "personal") OTHERS_DIR = os.path.join(MEMORY_ROOT, "others") # 初始化存储目录 def init_memory_system(): os.makedirs(PERSONAL_DIR, exist_ok=True) os.makedirs(OTHERS_DIR, exist_ok=True) # 信息分类检测 def detect_info_type(text): personal_keywords = ['我', '我的', '自己'] others_keywords = ['他', '她', '他们', '朋友', '同事', '同学'] if any(keyword in text for keyword in personal_keywords): return "personal" elif any(keyword in text for keyword in others_keywords): return "others" return None # 实体提取 def extract_entity(text, info_type): if info_type == "personal": matches = re.findall(r'我的(\w+)[是|为](.*?)[,。]', text) if matches: return matches[0][0].strip(), matches[0][1].strip() elif info_type == "others": matches = re.findall(r'(朋友|同事|同学)(\w+)[的]?(\w+)[是|为](.*?)[,。]', text) if matches: return f"{matches[0][1]}_{matches[0][2]}", matches[0][3].strip() return None, None # 记忆存储 def save_to_memory(info_type, entity, content): try: target_dir = PERSONAL_DIR if info_type == "personal" else OTHERS_DIR filename = f"{entity}.txt" filepath = os.path.join(target_dir, filename) with open(filepath, "a") as f: timestamp = datetime.now().strftime("%Y-%m-%d %H:%M:%S") f.write(f"[{timestamp}] {content}\n") return True except Exception as e: print(f"存储失败:{e}") return False # 记忆检索 def search_memory(info_type, keywords): try: target_dir = PERSONAL_DIR if info_type == "personal" else OTHERS_DIR results = [] for filename in os.listdir(target_dir): if any(kw in filename for kw in keywords): filepath = os.path.join(target_dir, filename) with open(filepath, "r") as f: results.append(f.read()) return "\n".join(results) if results else None except Exception as e: print(f"检索失败:{e}") return None # 修改后的主函数 def main(): init_memory_system() print("欢迎使用增强版AI对话系统!输入'退出'结束对话。") while True: user_input = input("\n你:").strip() if user_input.lower() in ["退出", "exit"]: print("对话结束,再见!") break # 信息存储逻辑 info_type = detect_info_type(user_input) if info_type: entity, content = extract_entity(user_input, info_type) if entity and content: if save_to_memory(info_type, entity, content): print(f"[系统] 已存储{info_type}信息:{entity}") # 信息检索逻辑 required_info = detect_info_type(user_input) context = "" if required_info: keywords = re.findall(r'[\u4e00-\u9fa5]{2,}', user_input) memory_data = search_memory(required_info, keywords) if memory_data: context = f"\n[记忆库信息]\n{memory_data}\n" # 构造增强提示 enhanced_prompt = f"{format_conversation_history(conversation_history)}\n{context}\n请根据以上信息回答:{user_input}" # 发送请求 ai_response = send_request(enhanced_prompt) if ai_response: print(f"AI:{ai_response}") conversation_history.append(f"AI:{ai_response}") else: print("AI没有响应,请稍后再试。") 这段代码有问题

filetype

import requests import json # API配置 API_URL = "http://127.0.0.1:11434/api/generate" # 替换为你的API地址 HEADERS = {"Content-Type": "application/json"} # 请求头 # 对话历史存储 conversation_history = [] def send_request(prompt): """ 发送请求到AI模型,获取响应 """ payload = { "model": "your-model-name", # 替换为你的模型名称 "prompt": prompt, "options": { "max_tokens": 150, # 控制生成的最大长度 "temperature": 0.7, # 控制生成内容的随机性 } } try: response = requests.post(API_URL, json=payload, headers=HEADERS, timeout=10) if response.status_code == 200: return response.json().get("response", "").strip() else: print(f"请求失败,状态码:{response.status_code}") return None except Exception as e: print(f"请求出错:{e}") return None def format_conversation_history(history): """ 将对话历史格式化为字符串 """ return "\n".join(history) def main(): print("欢迎使用AI对话系统!输入'退出'结束对话。") while True: # 获取用户输入 user_input = input("\n你:").strip() # 退出条件 if user_input.lower() in ["退出", "exit"]: print("对话结束,再见!") break # 将用户输入加入对话历史 conversation_history.append(f"用户:{user_input}") # 格式化对话历史作为提示 prompt = format_conversation_history(conversation_history) # 发送请求并获取AI响应 ai_response = send_request(prompt) if ai_response: print(f"AI:{ai_response}") # 将AI响应加入对话历史 conversation_history.append(f"AI:{ai_response}") else: print("AI没有响应,请稍后再试。") if __name__ == "__main__": main()我现在想要添加一个新的逻辑,逻辑思路是这样的,在程序下,AI可以自动生成文件夹,文件夹以储存的信息种类进行分类,比如个人信息,他人信息等,在一般情况下ai只会读取个人信息,也就是ai当前所需要扮演的角色,而当用户与其交流时提及某些他人或个人信息时,ai可以选择暂停输出,并检索分类信息中它需要的资料,得到相应资料后再重新回复用户之前提出的问题,以这种方式简化记忆流程。

weixin_42144213
  • 粉丝: 0
上传资源 快速赚钱