diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..744289d --- /dev/null +++ b/.gitignore @@ -0,0 +1,2 @@ +# Project exclude paths +/target/ \ No newline at end of file diff --git a/.idea/.gitignore b/.idea/.gitignore new file mode 100644 index 0000000..26d3352 --- /dev/null +++ b/.idea/.gitignore @@ -0,0 +1,3 @@ +# Default ignored files +/shelf/ +/workspace.xml diff --git a/.idea/aws.xml b/.idea/aws.xml new file mode 100644 index 0000000..b63b642 --- /dev/null +++ b/.idea/aws.xml @@ -0,0 +1,11 @@ + + + + + + \ No newline at end of file diff --git a/.idea/codeStyles/Project.xml b/.idea/codeStyles/Project.xml new file mode 100644 index 0000000..645f4a0 --- /dev/null +++ b/.idea/codeStyles/Project.xml @@ -0,0 +1,22 @@ + + + + + + + + \ No newline at end of file diff --git a/.idea/codeStyles/codeStyleConfig.xml b/.idea/codeStyles/codeStyleConfig.xml new file mode 100644 index 0000000..a55e7a1 --- /dev/null +++ b/.idea/codeStyles/codeStyleConfig.xml @@ -0,0 +1,5 @@ + + + + \ No newline at end of file diff --git a/.idea/compiler.xml b/.idea/compiler.xml new file mode 100644 index 0000000..0f5ad35 --- /dev/null +++ b/.idea/compiler.xml @@ -0,0 +1,13 @@ + + + + + + + + + + + + + \ No newline at end of file diff --git a/.idea/jarRepositories.xml b/.idea/jarRepositories.xml new file mode 100644 index 0000000..712ab9d --- /dev/null +++ b/.idea/jarRepositories.xml @@ -0,0 +1,20 @@ + + + + + + + + + + + \ No newline at end of file diff --git a/.idea/misc.xml b/.idea/misc.xml new file mode 100644 index 0000000..628b248 --- /dev/null +++ b/.idea/misc.xml @@ -0,0 +1,14 @@ + + + + + + + + + + \ No newline at end of file diff --git a/.idea/uiDesigner.xml b/.idea/uiDesigner.xml new file mode 100644 index 0000000..e96534f --- /dev/null +++ b/.idea/uiDesigner.xml @@ -0,0 +1,124 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/build/VocabularyDecoder.jar b/build/VocabularyDecoder.jar new file mode 100644 index 0000000..cec08fb Binary files /dev/null and b/build/VocabularyDecoder.jar differ diff --git a/build/start.bat b/build/start.bat new file mode 100644 index 0000000..e9761ec --- /dev/null +++ b/build/start.bat @@ -0,0 +1 @@ +java -jar VocabularyDecoder.jar \ No newline at end of file diff --git a/internalVocabPool/SAT3000Level2List01.json b/internalVocabPool/SAT3000Level2List01.json new file mode 100644 index 0000000..b66f1d2 --- /dev/null +++ b/internalVocabPool/SAT3000Level2List01.json @@ -0,0 +1,204 @@ +{ + "questions": [ + "protest", + "liberal", + "premise", + "virtually", + "justify", + "sweep", + "transition", + "keen", + "tendency", + "dedicate", + "tackle", + "boost", + "allege", + "jury", + "liability", + "veteran", + "tender", + "ultimate", + "dominant", + "consent", + "bonus", + "grasp", + "comply", + "correspondence", + "allocate", + "rational", + "probe", + "hedge", + "swell", + "defect", + "array", + "conservation", + "intervene", + "profound", + "prejudice", + "ideology", + "obscure", + "alien", + "articulate", + "ethical", + "chronic", + "stereotype", + "threshold", + "complement", + "competent", + "complication", + "marginal", + "monopoly", + "valve", + "unintelligible", + "epidemic", + "chromosome", + "enzyme", + "variant", + "pragmatic", + "composite", + "mentor", + "peripheral", + "gauge", + "optimal", + "singular", + "simulate", + "affirm", + "susceptible", + "paradox", + "contour", + "substitution", + "converge", + "discrete", + "hawk", + "facet", + "precipitate", + "transcribe", + "confound", + "novice", + "censor", + "elastic", + "watershed", + "parenthesis", + "descendant", + "senator", + "grip", + "recession", + "prescribe", + "equity", + "circuit", + "scandal", + "rumor", + "distress", + "premium", + "testimony", + "tragedy", + "coalition", + "merit", + "condemn", + "elegant", + "cruise", + "suspicion", + "cater" + ], + "answers": [ + "抗议", + "自由的", + "前提 房屋土地 预述", + "实际上 虚拟的", + "证明", + "打扫 迅速移动 卷走", + "转变", + "热切地", + "倾向", + "奉献 致力于", + "应对 处理", + "推进 提升", + "断言", + "陪审团", + "责任 累赘", + "老兵", + "温顺的 幼小的 敏感的", + "最终的", + "占主导地位的", + "同意", + "津贴", + "抓住 控制", + "遵守", + "相似 通信", + "分发 指派", + "有理的", + "探针", + "树篱 防备防范 回避", + "膨胀 浪潮", + "缺陷", + "阵列 排列", + "保守", + "干预", + "巨大的 深刻的", + "偏见 损害", + "意识形态", + "遮掩 隐藏 模糊的", + "外乡人 外星人", + "口齿清晰的", + "道德的", + "慢性的 积习难改的", + "旧框框", + "门槛", + "补足物", + "有竞争力的", + "难题 并发症", + "边际的 边缘的", + "垄断", + "阀门", + "不可理解的", + "流行的", + "染色体", + "酶", + "变体", + "务实的", + "混合物", + "导师", + "外围的 次要的", + "测量", + "最佳的", + "非凡的 单数的", + "假装", + "确认", + "善感的 易受影响的", + "悖论", + "轮廓", + "替代", + "汇聚", + "离散的 不连续的", + "鹰 兜售 叫卖", + "一面", + "使沉淀 使发生", + "做笔录", + "使困惑 证明\u2026是错的 混淆", + "新手", + "审查员", + "弹性的", + "分水岭", + "圆括号 插入语", + "后裔 子孙", + "参议员", + "抓牢紧握 吸引", + "衰退 经济萧条", + "规定 医嘱 开药方", + "公正 股本", + "电路板", + "丑闻", + "谣言", + "痛苦", + "优质的", + "证词", + "悲剧", + "联盟", + "价值 优点", + "谴责 判处 使陷入", + "优美的", + "巡航 巡游 缓慢行进 轻取", + "怀疑 预感 少许", + "为\u2026提供饮食" + ] +} \ No newline at end of file diff --git a/internalVocabPool/SAT3000Level2List02.json b/internalVocabPool/SAT3000Level2List02.json new file mode 100644 index 0000000..a2a35f9 --- /dev/null +++ b/internalVocabPool/SAT3000Level2List02.json @@ -0,0 +1,204 @@ +{ + "questions": [ + "confess", + "warrant", + "legacy", + "tenant", + "caution", + "vendor", + "thrust", + "clash", + "breach", + "mandate", + "landlord", + "superb", + "opt", + "insult", + "casualty", + "affection", + "patrol", + "prohibit", + "heritage", + "demographic", + "haunt", + "amend", + "concede", + "grief", + "exile", + "archive", + "despair", + "deploy", + "contemplate", + "flourish", + "hazard", + "disclosure", + "roar", + "bureau", + "anonymous", + "jurisdiction", + "doctrine", + "pharmaceutical", + "startle", + "warranty", + "miserable", + "vocal", + "splendid", + "utter", + "outrage", + "betray", + "affilate", + "batter", + "irritate", + "oversee", + "mock", + "crawl", + "illuminate", + "placement", + "persistent", + "cult", + "albeit", + "disguise", + "stagger", + "faction", + "spit", + "weep", + "partisan", + "divine", + "animate", + "enact", + "dread", + "assertion", + "fluctuate", + "compliment", + "temptation", + "generic", + "contingent", + "commence", + "grim", + "graze", + "dim", + "subscription", + "reconcile", + "archive", + "bruise", + "benchmark", + "escort", + "brutal", + "precedent", + "memoir", + "comtempt", + "mighty", + "glorious", + "heir", + "premature", + "slaughter", + "accountable", + "bob", + "vicious", + "bypass", + "intimidate", + "impair", + "verge" + ], + "answers": [ + "坦白", + "证明\u2026正当 为\u2026做担保", + "遗产 遗留问题", + "租户", + "小心 谨慎", + "小贩 卖主", + "推力 动力 猛推", + "冲突", + "违反 破裂 突破 打破", + "授权", + "地主", + "极好的 华丽的", + "v. 选择", + "辱骂", + "伤亡人员 死伤者", + "喜爱", + "巡逻", + "禁止", + "遗传", + "人口学的", + "经常出没于 鬼魂", + "补偿 修订 改善", + "承认", + "悲伤 伤心事", + "流放", + "档案", + "绝望", + "部署", + "凝视 沉思", + "繁荣 茂盛", + "陷入危险", + "揭露 披露", + "吼叫", + "局", + "匿名的", + "司法权 管辖权", + "信条", + "药物的", + "震惊", + "保证 保修期", + "痛苦的", + "声音的", + "壮丽的 极好的", + "发出声音 完全的", + "激怒愤慨 暴行", + "背叛", + "使附属", + "殴打 连续猛击", + "使恼怒 刺激", + "监督", + "嘲笑 仿制的", + "匍匐", + "点明 点亮", + "放置 实习", + "坚持不懈的", + "教派 狂热", + "尽管", + "掩盖", + "蹒跚 使震惊", + "派系", + "喷出 吐口水", + "哭泣 流脓", + "有倾向性的 拥护者", + "神性", + "使有生气", + "将\u2026制定成法律", + "恐惧", + "断言 主张", + "波动", + "难题", + "诱惑 引诱", + "普通的 无注册商标的", + "视情况而定的 一组", + "开始 着手", + "严肃的 令人沮丧的", + "放牧", + "昏暗的 使减小", + "订购 订阅", + "和解", + "档案", + "青肿", + "基准", + "护送 护卫", + "野蛮的", + "前例", + "回忆录", + "蔑视", + "强大的", + "宏伟的", + "继承人", + "过早的 早产的 未经深思熟虑的", + "屠杀", + "有责任的", + "上下快速移动 点头", + "邪恶的", + "越过 旁路", + "威吓", + "感官削弱", + "边缘 界限 接近" + ] +} \ No newline at end of file diff --git a/internalVocabPool/SAT3000Level2List03.json b/internalVocabPool/SAT3000Level2List03.json new file mode 100644 index 0000000..0412e8d --- /dev/null +++ b/internalVocabPool/SAT3000Level2List03.json @@ -0,0 +1,204 @@ +{ + "questions": [ + "resent", + "redeem", + "mourn", + "immunity", + "miniature", + "appliance", + "ambiguous", + "curb", + "confidential", + "sober", + "cynical", + "prestigious", + "proximity", + "hover", + "confer", + "congress", + "soothe", + "aspire", + "dissent", + "altar", + "decree", + "wedge", + "deter", + "temperament", + "rim", + "wicked", + "sprawl", + "idle", + "redundant", + "imminent", + "gratitude", + "flatter", + "turmoil", + "alley", + "moan", + "manifestation", + "menace", + "wary", + "shuffle", + "hypothetical", + "bait", + "tier", + "demolish", + "baseline", + "souvenir", + "dismay", + "gleam", + "therapeutic", + "cumulative", + "recollection", + "vault", + "ponder", + "stationary", + "catastrophe", + "tangible", + "skepitical", + "excavation", + "literal", + "supplementary", + "asylum", + "acclaim", + "discrepancy", + "chariatable", + "caravan", + "ascend", + "despise", + "intercept", + "console", + "linkage", + "demise", + "badge", + "paralyze", + "abide", + "sensor", + "upbringing", + "speculative", + "liaison", + "gloomy", + "segregate", + "insane", + "eccentric", + "daunt", + "relish", + "sob", + "intuition", + "glamorous", + "larva", + "dire", + "mortar", + "nuance", + "bald", + "canopy", + "reiterate", + "exclaim", + "preoccupy", + "petty", + "convene", + "remnant", + "rehearse" + ], + "answers": [ + "憎恶", + "挽回 兑现", + "哀悼 表遗憾 戴孝", + "免疫力 豁免权", + "微型的 小规模的", + "器具", + "含糊不清的", + "控制", + "机密的", + "冷静的 清醒的", + "愤世嫉俗的", + "有威望的", + "接近", + "盘旋", + "授予 给予 协商", + "国会", + "抚慰 缓和", + "渴望", + "持异议", + "祭坛", + "裁定", + "楔子", + "威慑 阻止", + "性情", + "外缘 边框", + "恶毒的", + "蔓延 伸展", + "无工作的 懒惰的", + "多余的 过剩的", + "临近的", + "感激之情", + "恭维", + "混乱", + "小巷", + "呻吟 抱怨", + "表现形式", + "威胁", + "谨慎的", + "拖着脚走 挪动", + "假设的 假定的", + "诱饵 鱼饵", + "一排 级别", + "摧毁", + "底线", + "纪念品", + "使惊愕", + "微光 闪光", + "有益健康的 治疗的", + "累积的", + "回忆", + "金库 穹顶 跳跃", + "仔细考虑 沉思", + "静止的", + "灾难性的", + "有形的", + "怀疑的", + "发掘", + "字面上的 完全的", + "补充的 额外的", + "避难所", + "称赞", + "差异", + "慈善的 宽容的", + "大篷车", + "上升", + "鄙视 轻视", + "拦截 窃听", + "安慰", + "联系", + "死亡", + "授予徽章", + "麻痹", + "忍受 容忍 遵守", + "传感器", + "养育", + "推测的 投机性的", + "联络人员", + "阴暗的", + "分离", + "精神失常", + "古怪异常的", + "使畏惧", + "喜爱 享受", + "啜泣", + "直觉", + "有魅力的", + "幼虫", + "致命的 严峻的", + "迫击炮 砂浆", + "细微差别", + "秃", + "树冠", + "重申", + "呼喊", + "使全神贯注", + "琐碎的 次要的", + "召开 开会", + "剩余部分", + "排练 预演" + ] +} \ No newline at end of file diff --git a/internalVocabPool/SAT3000Level2List04.json b/internalVocabPool/SAT3000Level2List04.json new file mode 100644 index 0000000..fd224e2 --- /dev/null +++ b/internalVocabPool/SAT3000Level2List04.json @@ -0,0 +1,204 @@ +{ + "questions": [ + "apt", + "plight", + "anguish", + "sentimental", + "provocative", + "ethnicity", + "parachute", + "lament", + "prominence", + "anecdote", + "usher", + "subdue", + "lavish", + "bolster", + "bewilder", + "disgrace", + "pertain", + "solicit", + "prophet", + "stipulate", + "navigation", + "affinity", + "mend", + "exquisite", + "reckless", + "allegiance", + "zoom", + "deduct", + "scrutinize", + "transcend", + "churn", + "hype", + "underscore", + "climax", + "syndicate", + "monumental", + "augment", + "thump", + "acquaint", + "mingle", + "benign", + "weld", + "tentative", + "relic", + "nostalgia", + "alleviate", + "glossy", + "obstruction", + "purport", + "huddle", + "baffle", + "tedious", + "aggravate", + "amenity", + "precursor", + "cerebral", + "lexicon", + "provisional", + "emulate", + "hymn", + "rhetorical", + "prudent", + "herald", + "afflict", + "succumb", + "pilgrim", + "thwart", + "assimilate", + "hilarious", + "protagonist", + "harass", + "confide", + "retrospect", + "unleash", + "relentless", + "determinant", + "jeopardize", + "filthy", + "topple", + "peril", + "ordeal", + "construe", + "renovation", + "mundane", + "versatile", + "contentious", + "brink", + "cliché", + "astound", + "myriad", + "seduce", + "salvage", + "incompatible", + "dangle", + "symmetry", + "conglomerate", + "melancholy", + "insulate", + "breathtaking" + ], + "answers": [ + "倾向于的 合适的", + "困境", + "极度痛苦", + "情感的 多愁善感的", + "撩人的", + "种族特点", + "降落伞", + "表达悲痛 痛惜 悲歌", + "显赫 显眼", + "轶事", + "迎接 引座 领座员", + "抑制", + "奢华的 丰富的", + "垫枕 支持", + "使迷惑", + "羞耻 丢脸的事 使\u2026蒙受耻辱", + "有关 从属", + "恳求 征集", + "先知", + "规定", + "导航", + "类同 喜爱 密切关系", + "缝补 改进", + "精致的 较好的", + "鲁莽的", + "忠诚", + "急行 急速上升 变焦摄影", + "扣除", + "仔细检查", + "超越", + "搅拌 搅动 翻腾", + "不实宣传", + "突出", + "达到高潮", + "企业联合", + "极大的 意义深远的", + "加强", + "重击", + "使熟悉", + "使混合", + "良性的", + "焊接 ", + "暂定的 犹豫不决的", + "遗迹 废墟", + "怀旧 怀旧之情", + "减轻", + "有光泽的 光滑的", + "妨碍 阻碍", + "意图 打算", + "挤成一团 暗中碰头", + "使迷惑", + "单调乏味的", + "加强 激怒", + "便利设施", + "先驱 先导", + "理智的 大脑的", + "全部词汇", + "暂时性的", + "效仿 模仿", + "圣歌", + "修辞的", + "精明的 深谋远虑的", + "预示", + "使痛苦", + "屈服", + "朝圣", + "挫败 使受挫", + "吸收 使同化", + "极有趣的 滑稽的", + "主角", + "不断骚扰", + "吐露", + "回顾 回忆", + "解开 释放", + "不间断的", + "决定性因素", + "危害 危及", + "肮脏的", + "倒下 跌倒 颠覆", + "危险 危害", + "磨难", + "理解 认为", + "翻新 整修", + "普通的 平凡的", + "多用途的 通用的", + "有争议的", + "边缘", + "陈词滥调", + "使震惊", + "无数的 大量的", + "引诱 诱惑", + "抢救 挽回", + "不兼容的 有冲突的", + "悬荡", + "对称性", + "企业集团 混合物", + "忧伤 悲伤的", + "使绝缘", + "惊人的" + ] +} \ No newline at end of file diff --git a/internalVocabPool/SAT3000Level2List05.json b/internalVocabPool/SAT3000Level2List05.json new file mode 100644 index 0000000..9d36668 --- /dev/null +++ b/internalVocabPool/SAT3000Level2List05.json @@ -0,0 +1,204 @@ +{ + "questions": [ + "indict", + "paranoid", + "perpetual", + "behold", + "agitate", + "patronize", + "stigma", + "acquit", + "clutter", + "clumsy", + "detrimental", + "disposable", + "dismal", + "plump", + "enchant", + "guru", + "censure", + "pertinent", + "impede", + "mural", + "traverse", + "parody", + "bestow", + "bluff", + "refurbish", + "solemn", + "kernel", + "taint", + "fumble", + "bristle", + "impart", + "latent", + "hunch", + "wither", + "involuntary", + "infuriate", + "disparate", + "curtail", + "inscribe", + "prairie", + "shrewd", + "conjecture", + "warp", + "savor", + "triumphant", + "thrash", + "contrive", + "outburst", + "conceivable", + "ludicrous", + "somber", + "womb", + "dissect", + "agonize", + "rectify", + "orchestrate", + "futile", + "fraudulent", + "forage", + "conspire", + "vanity", + "havoc", + "penalize", + "cunning", + "upheaval", + "deflect", + "blunder", + "diagonal", + "overdue", + "suspense", + "eminent", + "ignite", + "eloquent", + "renounce", + "hindsight", + "mediation", + "revere", + "disdain", + "caricature", + "extinguish", + "budgetary", + "ominous", + "concise", + "lofty", + "disillusion", + "mutant", + "predicament", + "hue", + "oblivious", + "pastime", + "poignant", + "confinement", + "grudge", + "ecstasy", + "tacit", + "burgeon", + "adamant", + "hoist", + "whim" + ], + "answers": [ + "控告", + "多疑的", + "无休止的", + "看见", + "使激动", + "经常光顾", + "耻辱 柱头", + "宣判\u2026无罪 表现", + "杂乱的东西", + "笨拙的", + "有害的", + "一次性的", + "阴沉的", + "胖乎乎的 使蓬松", + "使陶醉", + "导师 权威", + "谴责", + "有关的", + "阻碍", + "壁画", + "穿过", + "拙劣的模仿", + "授予", + "虚张声势", + "整修", + "庄严的", + "果核", + "污染", + "摸索", + "发怒 鬃毛 充满", + "传授 给与(特定品质)", + "潜在的", + "直觉 预感", + "凋零", + "无意识的 非自愿的", + "使大怒", + "迥然不同的", + "缩减", + "题写", + "大草原", + "精明的", + "猜测", + "扭曲", + "品尝 享受", + "成功的", + "抽打 快节奏金属乐", + "设法促成 出乎意料的做到", + "爆发", + "想象得到的", + "荒唐可笑的", + "昏暗的 阴郁的", + "子宫", + "解剖", + "使痛苦", + "校正", + "将\u2026谱成管弦乐曲", + "无益的", + "欺诈性的", + "搜寻粮草 饲料", + "密谋", + "虚荣 徒劳无用", + "严重破坏 浩劫", + "处罚 处于不利地位", + "狡猾的 灵巧", + "动乱 剧变", + "使\u2026偏斜 劝阻", + "犯大错", + "对角线的", + "到期未付的 迟来的", + "中止", + "名声显赫的", + "点燃 引发", + "雄辩的", + "宣布放弃", + "后见之明", + "调解 仲裁", + "敬畏 ", + "鄙视", + "漫画 拙劣地模仿", + "扑灭", + "预算的", + "不祥的", + "简洁的", + "高耸的", + "使幻想破灭", + "变种的 突变的", + "窘境", + "色调 色彩", + "未察觉的", + "娱乐 消遣", + "酸楚的", + "监禁 限制", + "积怨 勉强给", + "摇头丸 狂喜", + "心照不宣的", + "发芽", + "坚决的 固执的", + "提升 升起", + "突发奇想" + ] +} \ No newline at end of file diff --git a/internalVocabPool/SAT3000Level2List06.json b/internalVocabPool/SAT3000Level2List06.json new file mode 100644 index 0000000..98cdb72 --- /dev/null +++ b/internalVocabPool/SAT3000Level2List06.json @@ -0,0 +1,204 @@ +{ + "questions": [ + "delve", + "brim", + "espouse", + "defiant", + "blockbuster", + "mediocre", + "impartial", + "immaculate", + "containment", + "vindicate", + "ardent", + "disclaimer", + "epoch", + "crumple", + "apprehend", + "acronym", + "flimsy", + "reproach", + "prerogative", + "compulsive", + "blatant", + "repercussion", + "pavilion", + "tapestry", + "ornate", + "liken", + "airborne", + "deport", + "veer", + "miraculous", + "nobility", + "brag", + "synchronize", + "floral", + "savvy", + "vulgar", + "elongate", + "avid", + "vernacular", + "captivate", + "allure", + "fragrance", + "deplore", + "harmonic", + "abort", + "brook", + "haste", + "sneer", + "aristocracy", + "neutrality", + "remorse", + "gape", + "reimburse", + "eclectic", + "decency", + "treacherous", + "charisma", + "coax", + "varnish", + "carcass", + "creed", + "idiosyncratic", + "intangible", + "resurgence", + "illiterate", + "accentuate", + "hysteria", + "detour", + "galvanize", + "counterfeit", + "blight", + "garrison", + "sublime", + "dreary", + "subversive", + "sloppy", + "heady", + "assort", + "hereditary", + "kinship", + "legislate", + "detract", + "resurrect", + "improvisation", + "attire", + "cumbersome", + "respite", + "erroneous", + "culinary", + "desolate", + "delinquency", + "aversion", + "reprimand", + "choreographer", + "flamboyant", + "circumvent", + "bounty", + "complacent", + "rendezvous" + ], + "answers": [ + "探索 挖掘 搜寻", + "帽檐 充满 满溢", + "支持", + "挑衅的", + "了不起的人或事", + "普通的", + "公正的", + "无瑕疵的", + "抑制 牵制", + "辩护", + "热烈的 热情的", + "免责声明", + "时代", + "弄皱 垮台 崩溃", + "逮捕 理解 意识到", + "首字母缩略词", + "劣质的 薄的", + "责备 使感到耻辱", + "特权", + "难以控制的 吸引人的", + "明显的 吵闹的", + "反响", + "亭子 装饰性建筑", + "挂毯", + "华美的 华丽的", + "把某人/某物比作", + "空气传播的", + "驱逐", + "转向", + "奇迹般的", + "贵族", + "吹嘘", + "同步", + "植物的 花的", + "常识 精明的", + "庸俗的 粗鲁的", + "拉长", + "热衷的 热心的", + "方言的 本地化的", + "迷住 迷惑", + "吸引", + "香味", + "悲悼 反对", + "和声的 和谐的", + "中止 取消", + "容忍 忍受 小溪", + "匆忙 快速", + "讥笑 冷笑", + "贵族", + "中立", + "懊悔", + "张口结舌地瞪着 裂开 张开", + "偿付", + "兼收并蓄的", + "得体 礼仪", + "奸诈的 危险的", + "个人魅力", + "哄劝 劝诱", + "涂清漆", + "尸体 残骸", + "信条 原则", + "独特的", + "无形的", + "复兴 再现", + "不识字的 文盲的 外行的", + "强调", + "歇斯底里", + "绕道而行", + "刺激 通电", + "伪造品", + "破坏 毁坏", + "驻防部队", + "很棒的 卓越的 极好的", + "枯燥的", + "颠覆性的", + "糟蹋的", + "上头的", + "分类", + "世袭制度", + "亲属关系", + "立法", + "减损 转移 使分心", + "使复活", + "即兴表演 即兴创作", + "穿上盛装", + "笨重的 累赘的 不方便的", + "喘息", + "错误的", + "烹饪的 厨房的", + "荒凉的", + "少年违法犯罪", + "厌恶", + "惩戒", + "编舞者", + "艳丽的 凤凰木", + "包围 回避", + "慷慨 赏金", + "自满的", + "约会 见面" + ] +} \ No newline at end of file diff --git a/internalVocabPool/SAT3000Level2List07.json b/internalVocabPool/SAT3000Level2List07.json new file mode 100644 index 0000000..beeffe1 --- /dev/null +++ b/internalVocabPool/SAT3000Level2List07.json @@ -0,0 +1,204 @@ +{ + "questions": [ + "iconic", + "corroborate", + "etiquette", + "trespass", + "frivolous", + "idyllic", + "ferment", + "synergy", + "vex", + "aptitude", + "fledgling", + "backfire", + "emphatic", + "vigilant", + "bask", + "exuberant", + "dogma", + "consummate", + "bribery", + "tantalize", + "dismissive", + "embroidery", + "egalitarian", + "defuse", + "apathy", + "epitomize", + "engross", + "labyrinth", + "clandestine", + "antidote", + "palpable", + "negligent", + "intoxicate", + "grueling", + "derail", + "benevolent", + "suffrage", + "gratification", + "austere", + "expedient", + "impeccable", + "oblique", + "bloodshed", + "pious", + "calibrate", + "congest", + "estrange", + "fathom", + "recoil", + "sieve", + "archaic", + "superfluous", + "penchant", + "consign", + "monotonous", + "totalitarian", + "aloof", + "categorical", + "enthrall", + "gimmick", + "layman", + "legitimize", + "fervent", + "courteous", + "enumerate", + "contagious", + "phobia", + "forgery", + "conceit", + "topography", + "wager", + "peddle", + "crux", + "expiration", + "translucent", + "ambience", + "unscrupulous", + "flashback", + "ameliorate", + "abate", + "pompous", + "boon", + "forgo", + "barter", + "cadence", + "quirk", + "oddity", + "thrift", + "deflate", + "hallucination", + "pretentious", + "imbue", + "zigzag", + "mire", + "impasse", + "disparage", + "callous", + "intricacy", + "impromptu" + ], + "answers": [ + "偶像的", + "确证", + "礼节", + "擅自闯入 滥用 犯罪", + "轻浮的 不重要的", + "闲适恬静的", + "使发酵 挑起动乱", + "协同增效作用", + "使恼火", + "天资", + "菜鸟 新手", + "事与愿违", + "明确坚决的", + "警惕的", + "享受 晒太阳", + "热情洋溢的", + "教义 信条", + "完整的 完美无缺的", + "贿赂", + "逗弄 使干着急", + "轻蔑地", + "刺绣", + "平等主义者", + "拆除 平息", + "冷淡", + "成为\u2026的典范", + "使全神贯注", + "迷宫", + "秘密的", + "矫正方法", + "明显的", + "疏忽的 粗心大意的", + "使陶醉", + "使人筋疲力尽的", + "使\u2026脱轨", + "仁爱的", + "选举权", + "感激", + "朴素的", + "适宜的 应急的手段\u2019", + "无缺点的", + "倾斜的", + "杀戮", + "虔诚的 道貌岸然的", + "校正 调整", + "拥挤 堵塞", + "使疏远 离间", + "英寻 弄懂", + "退缩 畏缩", + "用筛子筛", + "古老的", + "多余的", + "爱好", + "把\u2026托付给", + "乏味的", + "极权主义", + "冷漠的 超然的", + "绝对的", + "吸引住", + "花招 骗人的玩意", + "平信徒", + "使合法", + "热情的", + "有礼貌的", + "枚举", + "有传染性的", + "恐惧症", + "伪造品", + "自负", + "地形", + "打赌", + "兜售 宣扬 散布", + "关键", + "呼气 吐气 终结", + "半透明的", + "气氛 格调", + "不道德的", + "倒叙", + "改善", + "某种威胁减退", + "自负的", + "福音", + "放弃", + "以物换物", + "抑扬顿挫", + "怪癖", + "古怪", + "节俭", + "放掉...的气", + "幻想", + "做作的", + "使充满", + "之字形", + "陷入泥潭", + "僵局 死路", + "贬低", + "冷酷无情的", + "错综复杂", + "即兴的" + ] +} \ No newline at end of file diff --git a/internalVocabPool/SAT3000Level2List08.json b/internalVocabPool/SAT3000Level2List08.json new file mode 100644 index 0000000..d836177 --- /dev/null +++ b/internalVocabPool/SAT3000Level2List08.json @@ -0,0 +1,204 @@ +{ + "questions": [ + "understatement", + "indignant", + "carefree", + "bequeath", + "vestige", + "chide", + "aloft", + "calamity", + "purr", + "onerous", + "sarcasm", + "demean", + "pelt", + "pseudonym", + "deride", + "unequivocal", + "comprehensible", + "inept", + "hypocritical", + "haphazard", + "feign", + "coalesce", + "hinterland", + "cryptic", + "serenity", + "juxtapose", + "surmount", + "genteel", + "elate", + "reminisce", + "tact", + "banal", + "forestall", + "quintessential", + "arcane", + "agile", + "evasive", + "figurative", + "euphemism", + "partake", + "condescend", + "consternation", + "nozzle", + "laud", + "ephemeral", + "corrosion", + "conundrum", + "tumultuous", + "prodigy", + "incongruous", + "delude", + "scrawl", + "profusion", + "supposition", + "connoisseur", + "dilapidate", + "vignette", + "amalgamate", + "laborious", + "archetypal", + "dearth", + "commotion", + "foreshadow", + "revisionist", + "caustic", + "defunct", + "palatable", + "exonerate", + "admonish", + "indiscriminate", + "stagnate", + "antipathy", + "bigotry", + "incessant", + "commendable", + "devious", + "sullen", + "antagonize", + "insatiable", + "voluminous", + "fragmentary", + "catalyze", + "pester", + "placid", + "brazen", + "commemoration", + "implausible", + "industrious", + "twine", + "deft", + "rebuttal", + "tenacity", + "interminable", + "scavenge", + "annihilate", + "tectonic", + "circumscribe", + "introvert", + "assail" + ], + "answers": [ + "低调的说法 轻描淡写", + "义愤的", + "无忧无虑的", + "遗赠", + "残留", + "呵斥", + "在高处", + "灾厄", + "发出轰鸣声", + "沉重的 繁重的", + "讽刺", + "贬低", + "攻击或投掷", + "假名", + "嘲笑", + "毫不含糊地", + "可理解的", + "无能的", + "虚伪的", + "无计划的", + "假装", + "合并", + "内陆地区", + "隐晦的", + "静谧", + "把\u2026并列", + "居于\u2026之上", + "有教养的", + "使高兴", + "缅怀往事", + "为人处世圆滑", + "平庸的", + "预先阻止", + "典型的", + "神秘的 难解的", + "敏捷的", + "含糊其辞的", + "修辞的", + "委婉语", + "参与", + "屈尊", + "惊愕", + "喷嘴 管口 鼻", + "赞美", + "短暂的", + "腐蚀", + "谜", + "喧闹的", + "奇才", + "不一致的", + "欺骗(自己)", + "写字潦草", + "大量", + "推测 假设", + "鉴赏家", + "使荒废", + "片段", + "合并", + "费力地", + "原型的", + "缺乏", + "骚动", + "预示", + "修正主义者", + "尖刻的 腐蚀性的", + "不复存在的 已废除的", + "可口的", + "免除\u2026的责任", + "告诫", + "不加区别的", + "停滞 不进步", + "强烈的厌恶", + "偏执", + "不间断的 持续不断的", + "值得称赞的", + "狡诈的 迂回的 弯曲的", + "阴沉的 郁郁寡欢的", + "产生敌意", + "贪得无厌的", + "宽大的", + "支离破碎的", + "催化", + "打扰 使烦扰", + "平和的 平静的", + "厚颜无耻的", + "纪念仪式", + "不合情理的 不可行的", + "勤奋的", + "使交织", + "灵巧的", + "反驳", + "坚韧", + "无休止的", + "食腐动物", + "歼灭", + "板块构造的", + "约束", + "内向的人", + "攻击 困扰" + ] +} \ No newline at end of file diff --git a/internalVocabPool/SAT3000Level2List09.json b/internalVocabPool/SAT3000Level2List09.json new file mode 100644 index 0000000..50810a9 --- /dev/null +++ b/internalVocabPool/SAT3000Level2List09.json @@ -0,0 +1,200 @@ +{ + "questions": [ + "gloat", + "extravagance", + "sardonic", + "perturb", + "colloquial", + "malign", + "exorbitant", + "audacious", + "wistful", + "oscillate", + "rover", + "egregious", + "observant", + "crevice", + "unanimity", + "hyperbole", + "fickle", + "unsurmountable", + "enmity", + "rejuvenate", + "illusory", + "opulent", + "succinct", + "hypnotize", + "indelible", + "convoluted", + "chastise", + "extraterrestrial", + "cajole", + "panacea", + "brevity", + "despicable", + "paucity", + "sensuous", + "belittle", + "acumen", + "posthumous", + "tinge", + "governess", + "assuage", + "capricious", + "steadfast", + "balm", + "didactic", + "demarcation", + "extrinsic", + "regal", + "abhor", + "prosaic", + "hubris", + "aberrant", + "oratory", + "digression", + "extravert", + "irrevocable", + "vandalize", + "juggernaut", + "sustenance", + "formulaic", + "diminution", + "transitory", + "flagrant", + "salutary", + "fluster", + "horoscope", + "sedative", + "harbinger", + "reverie", + "annul", + "abridge", + "immutable", + "equivocal", + "whirlpool", + "realign", + "automaton", + "vehement", + "opacity", + "transgress", + "succulent", + "connote", + "imitator", + "jubilant", + "furtive", + "irreconcilable", + "omnipresent", + "auspicious", + "deferential", + "circumspect", + "serpentine", + "ceaseless", + "infinitesimal", + "abominable", + "ungainly", + "inexhaustible", + "unfathomable", + "omniscient", + "tyrannical" + ], + "answers": [ + "得意扬扬", + "挥霍 奢侈 夸张的举动", + "讽刺的", + "打扰 使不安", + "口语的", + "恶意", + "过高的", + "大胆的", + "渴望的 留恋的", + "使动摇 使震荡", + "漫游者", + "极坏的", + "善于观察的", + "裂缝", + "同意 全体一致", + "夸张", + "易变的", + "无法克服的 无法逾越的", + "敌意", + "使年轻", + "幻想", + "奢华的", + "简明的", + "对\u2026施催眠术 使着迷", + "难以去除的", + "错综复杂的", + "责备 体罚", + "地外的", + "劝诱", + "灵丹妙药", + "简洁 短暂", + "卑鄙的", + "不足", + "感官愉悦的", + "贬低", + "精明", + "死后获得的", + "淡色 少许味道", + "女家庭教师", + "缓解", + "变化无常的 突发奇想的", + "坚定的 忠实的", + "香气 香味", + "教导的", + "界限 划分", + "外在的 外部的", + "帝王的", + "憎恶", + "枯燥的", + "傲慢自大", + "反常的", + "演讲术 雄辩的言辞", + "离题", + "性格外向的", + "不可撤回的", + "蓄意破坏", + "不可抗拒的力量", + "食物 生计 维持", + "刻板的", + "减少", + "短暂的", + "骇人听闻的 丑恶可耻的", + "有益的", + "使慌乱", + "占星术", + "镇静的", + "预告者", + "遐想", + "宣告\u2026无效 废除", + "删节", + "不可改变的", + "模棱两可的", + "漩涡", + "调整\u2026的位置 重新结盟", + "机器人", + "强烈的", + "不透明", + "违背", + "多肉的 鲜美多汁的", + "意味着", + "模仿者", + "欣喜若狂的", + "鬼鬼祟祟的", + "势不两立的", + "无处不在的", + "吉祥的", + "恭敬的", + "慎重的 细心的", + "蜿蜒的 弯弯曲曲的", + "不停的", + "极小的 无穷的", + "恶劣的", + "笨拙的", + "用之不竭的 不知疲倦的", + "深不可测的 不可理解的", + "无所不知的", + "专制的 残暴的" + ] +} \ No newline at end of file diff --git a/internalVocabPool/SAT3000Level2List10.json b/internalVocabPool/SAT3000Level2List10.json new file mode 100644 index 0000000..42a9333 --- /dev/null +++ b/internalVocabPool/SAT3000Level2List10.json @@ -0,0 +1,302 @@ +{ + "questions": [ + "illegitimacy", + "impassive", + "mollify", + "vicissitude", + "ineffable", + "spellbind", + "scrawny", + "flabbergast", + "perplexity", + "acolyte", + "empathetic", + "efficacious", + "ulterior", + "pensive", + "flippant", + "defile", + "equanimity", + "colossus", + "snobbish", + "alliteration", + "omnipotent", + "lighthearted", + "cataclysmic", + "bane", + "facetious", + "antithetical", + "mimicry", + "expunge", + "fallible", + "sulfuric", + "stealthy", + "irksome", + "indigent", + "impetuous", + "convivial", + "rancor", + "forbear", + "tenable", + "illegible", + "osmosis", + "invulnerable", + "chauvinism", + "effusive", + "credulous", + "edify", + "bombastic", + "defame", + "imprudent", + "anticlimax", + "seditious", + "decorous", + "plagiarize", + "adroit", + "blindside", + "abstruse", + "fallacious", + "discernible", + "conciliate", + "benediction", + "ingenuous", + "commodious", + "gluttony", + "execrable", + "curmudgeon", + "unswerving", + "preeminence", + "provident", + "ceremonious", + "counterargument", + "acme", + "abase", + "account for", + "aggrandize", + "ambivalent", + "amount to", + "antiquated", + "appealing", + "avant-garde", + "bizarre", + "calligraphy", + "chance on", + "cling to", + "close-knit", + "compelling", + "composed", + "combustion", + "congruous", + "contented", + "craving", + "delve into", + "detached", + "discriminate", + "disinterested", + "disproportionate", + "distinguishing", + "draw on", + "enterprising", + "enticing", + "excursion", + "exhilarating", + "fleeting", + "furnished", + "haven", + "imposing", + "ingrained", + "inhibiting", + "intriguing", + "irreversible", + "jot down", + "late boomer", + "lingering", + "long", + "maxim", + "marvel", + "outmoded", + "oval", + "overbearing", + "overrate", + "pedestrian", + "prevailing", + "precede", + "prosperity", + "refined", + "reflective", + "renowned", + "reserved", + "resolved", + "scared", + "self-aggrandizing", + "self-effacement", + "self-satisfied", + "sophisticated", + "spelunker", + "start from scratch", + "status quo", + "strained", + "stumble upon", + "stunning", + "stymie", + "subject to", + "take for granted", + "tangle up", + "tap into", + "teem with", + "trappings", + "travail", + "undertaking", + "utopia" + ], + "answers": [ + "非法性 私生", + "面无表情的 冷漠的", + "抚慰", + "变迁 推移 交替", + "不可言喻的 难以形容的", + "使入迷", + "瘦巴巴的", + "使大吃一惊", + "n. 困惑", + "追随者", + "移情作用的", + "有效的", + "隐秘的", + "沉思的", + "轻率无礼的", + "亵渎 玷污", + "镇静", + "大人物 巨人", + "势利的", + "头韵", + "全能的 无所不能的", + "轻松愉快的 随便的", + "灾难性的", + "祸根 死因", + "轻浮的 爱开玩笑的", + "对立的", + "模仿", + "清除 删除", + "会出错的", + "含硫磺的", + "偷偷摸摸的", + "令人恼火的", + "贫穷的", + "鲁莽的", + "欢乐的", + "怨恨", + "克制", + "站得住脚的 可保持的", + "无法辨认的", + "潜移默化 渗透", + "无懈可击的", + "盲目的爱国主义", + "过于热情的", + "轻信的", + "教化", + "华而不实的", + "排榜", + "轻率的", + "反高潮 令人扫兴的结尾", + "煽动性的 扰乱治安的", + "端庄稳重的", + "剽窃 抄袭", + "灵巧的 机敏的", + "攻击无防备的一侧", + "深奥的", + "谬误的", + "看得清的", + "安抚 调解", + "祝福 赐福祈祷", + "天真的", + "宽敞的", + "贪吃 暴饮暴食", + "恶劣的", + "脾气坏的人", + "直的", + "杰出 卓越", + "节俭的 有远见的", + "正式的 隆重的", + "相反论点", + "顶点", + "使出丑", + "对\u2026做出解释", + "增大 增加 吹捧", + "矛盾的 犹豫不决的", + "总计", + "陈旧的 过时的", + "有吸引力", + "前卫派(的)", + "古怪的", + "书法", + "偶然找到", + "抓紧 黏着", + "紧密联系", + "引人入胜的 令人信服的", + "镇静的", + "燃烧", + "一致的", + "满意的", + "渴望", + "探索", + "冷漠的 单独的", + "区别 歧视", + "公正的 不感兴趣的", + "不成比例的", + "区别性的", + "临近 导致", + "有事业心的", + "诱人的", + "远足", + "令人高兴的", + "快速经过的", + "配有家具的", + "避难所", + "壮观的", + "根深蒂固的", + "约束的", + "引人入胜的", + "不可逆转的", + "草草记下", + "婴儿潮后出生的人", + "拖延的", + "渴望", + "格言", + "奇迹", + "过时的", + "椭圆的", + "专横的", + "高估", + "行人 乏味的", + "盛行的 流行的", + "先于", + "繁荣", + "精炼的 优雅的", + "反射的 沉思的", + "著名的", + "矜持的 留作专用的", + "坚决的", + "惊恐的", + "自夸的 自我膨胀的", + "谦逊", + "沾沾自喜的", + "精密的", + "洞穴探险者", + "从头开始", + "现状", + "焦虑的 不自然的", + "偶然发现", + "震惊的 绝妙的", + "阻碍", + "受\u2026影响 遭受 受制于", + "认为\u2026理所当然", + "缠在一起", + "接近", + "充满", + "装饰 服饰 马饰", + "艰苦劳动", + "任务 工作 企业 承诺", + "乌托邦" + ] +} \ No newline at end of file diff --git a/internalVocabPool/SAT3000Level3List01.json b/internalVocabPool/SAT3000Level3List01.json new file mode 100644 index 0000000..87ae2ed --- /dev/null +++ b/internalVocabPool/SAT3000Level3List01.json @@ -0,0 +1,204 @@ +{ + "questions": [ + "sanction", + "flip", + "trauma", + "nominal", + "cholesterol", + "feast", + "proclaim", + "interface", + "rack", + "denote", + "query", + "screw", + "nominate", + "bump", + "invoice", + "poll", + "minority", + "stare", + "clinical", + "refugee", + "par", + "punch", + "bound", + "injection", + "auction", + "mortality", + "tumor", + "membrane", + "semantic", + "syndrome", + "molecular", + "maternal", + "equilibrium", + "antibiotic", + "ion", + "neuron", + "synthetic", + "cone", + "lever", + "numerical", + "quantum", + "slab", + "consonant", + "notation", + "dissertation", + "invert", + "theorem", + "mole", + "solvent", + "yeast", + "longitudinal", + "flux", + "infinity", + "chloride", + "splice", + "fiscal", + "commander", + "stall", + "rebel", + "raid", + "pledge", + "dip", + "lad", + "verse", + "yell", + "plaintiff", + "fleet", + "debut", + "whip", + "caption", + "subsidiary", + "gamble", + "arena", + "tray", + "curl", + "commentator", + "lounge", + "plea", + "stumble", + "supervise", + "petition", + "token", + "stride", + "shrug", + "scramble", + "revelation", + "preach", + "sew", + "slap", + "buzz", + "tease", + "strap", + "franchise", + "spectacle", + "batch", + "slump", + "militant", + "chapel", + "knot" + ], + "answers": [ + "批准", + "快速打开关闭", + "外伤", + "名义上的 少量的", + "胆固醇", + "盛宴 使\u2026尽情享受", + "宣布 表扬 赞扬", + "界面 接口", + "支架 行李架", + "预示 指代", + "疑问 询问", + "用螺钉固定 诈骗 愚弄 搞砸 糟蹋", + "提名 任命", + "碰撞 肿块", + "开发票", + "民意调查", + "少数民族", + "盯着看", + "临床的", + "难民", + "等价 标准 票面价值 ", + "猛击 戳 影响力", + "一定的 界限", + "注射", + "拍卖", + "死亡率 ", + "肿瘤", + "薄膜", + "语义的", + "综合症状 并发症", + "分子的", + "母系的", + "平衡", + "抗生素", + "离子", + "神经元", + "合成的", + "圆锥", + "拉杆", + "数字的", + "量子", + "厚板", + "辅音的 协调的", + "符号", + "学问论文", + "倒置", + "定理 原理", + "内奸 鼹鼠", + "有偿付能力的 溶剂", + "酵母菌", + "经度的 纵向的", + "波动", + "无限", + "氟化物", + "铰接点", + "财政的", + "指挥官", + "拖延 延后", + "叛乱者 反抗", + "突袭", + "保证 用\u2026抵押", + "蘸", + "男孩", + "诗", + "叫喊", + "原告", + "船队 车队", + "首次亮相", + "鞭子 鞭打", + "标题", + "子公司", + "赌博", + "竞技场", + "托盘", + "卷发", + "评论员", + "客厅 休息室", + "请求 恳求 接口 辩护", + "蹒跚 结结巴巴", + "监管", + "请愿书", + "象征的", + "跨步 进展", + "耸肩", + "争抢 炒蛋", + "启示", + "布道 宣传 告诫", + "缝", + "拍 打 一巴掌", + "嗡嗡声 打电话", + "嘲弄 欺负", + "用带子系", + "选举权", + "精彩的表演 奇观", + "一批", + "骤跌 大幅下降", + "好斗的", + "小教堂", + "节" + ] +} \ No newline at end of file diff --git a/internalVocabPool/SAT3000Level3List02.json b/internalVocabPool/SAT3000Level3List02.json new file mode 100644 index 0000000..6bb7aad --- /dev/null +++ b/internalVocabPool/SAT3000Level3List02.json @@ -0,0 +1,204 @@ +{ + "questions": [ + "doom", + "naval", + "morale", + "helmet", + "pinch", + "missionary", + "lure", + "encompass", + "scout", + "artery", + "bail", + "tenure", + "exempt", + "casino", + "theology", + "playoff", + "tan", + "flank", + "inmate", + "verge", + "lieutenant", + "tremble", + "fling", + "savage", + "subsidize", + "grate", + "inflict", + "tread", + "flare", + "inheritance", + "rhyme", + "saddle", + "vain", + "shove", + "crumble", + "revolt", + "chord", + "cemetery", + "murmur", + "commute", + "outset", + "booth", + "poise", + "preside", + "rigorous", + "giggle", + "compassion", + "envisage", + "coupon", + "dub", + "beneficiary", + "lapse", + "mutter", + "ranch", + "acoustic", + "shiver", + "retention", + "trench", + "spacious", + "jerk", + "dazzle", + "crunch", + "refrain", + "wholesale", + "groove", + "dart", + "overturn", + "tout", + "genome", + "outright", + "peg", + "insulin", + "nuisance", + "boycott", + "siege", + "glitter", + "rein", + "tractor", + "ramp", + "foil", + "smear", + "glide", + "weary", + "pathetic", + "swirl", + "analog", + "lash", + "tug", + "intersection", + "hitherto", + "ascertain", + "blunt", + "preacher", + "cram", + "pedal", + "viability", + "muse", + "drape", + "clamp" + ], + "answers": [ + "劫数", + "军舰", + "志气 ", + "头盔", + "捏 少量", + "传教士", + "诱惑", + "围绕 包围", + "侦察", + "动脉 干道", + "保释金", + "占有 任期", + "免除 豁免", + "赌场", + "神学", + "延长赛", + "硝制皮革", + "侧面", + "同狱友人", + "边缘", + "尉官", + "颤抖", + "抛扔", + "野蛮人", + "发津贴", + "磨碎", + "使遭受折磨", + "踏板 踩踏", + "闪耀 闪光", + "继承物 遗产", + "韵律", + "马鞍", + "徒劳 虚荣", + "推 猛推", + "磨碎 崩溃 破碎", + "叛乱 反抗", + "弦", + "墓地 公寓", + "嘟囔 低语", + "通勤", + "开始 开端", + "小隔间", + "姿势 冷静 镇静", + "掌管 主持", + "严格的", + "咯咯笑", + "同情", + "想象", + "配给券", + "配音", + "受惠人", + "过失 小毛病", + "咕哝", + "牧场", + "声学的", + "颤抖", + "保留", + "沟渠", + "广阔的", + "混蛋 猛拉", + "使眩晕 使目眩", + "咬碎 粉碎", + "限制", + "批发", + "沟槽", + "猛冲", + "反转 推翻", + "兜售", + "基因组", + "完全的 彻底的", + "用夹子固定", + "胰岛素", + "麻烦事 讨厌的人", + "联合抵制", + "包围", + "闪烁", + "驾驭 统治", + "拖拉机", + "斜道", + "箔 金属薄片", + "污点", + "滑动", + "疲惫的", + "可怜的 悲哀的", + "漩涡 打旋", + "类比", + "鞭打", + "拖拉", + "交叉 十字路口", + "迄今", + "查明", + "钝的", + "布道人 讲道人", + "塞入 填塞", + "踏板", + "可行性", + "沉思 冥想", + "悬挂 覆盖", + "夹紧 固定住" + ] +} \ No newline at end of file diff --git a/internalVocabPool/SAT3000Level3List03.json b/internalVocabPool/SAT3000Level3List03.json new file mode 100644 index 0000000..f295142 --- /dev/null +++ b/internalVocabPool/SAT3000Level3List03.json @@ -0,0 +1,204 @@ +{ + "questions": [ + "blush", + "masculine", + "crest", + "customary", + "fiddle", + "parlor", + "lurk", + "sprinkle", + "villain", + "torment", + "preclude", + "trek", + "stifle", + "rotten", + "avert", + "slack", + "bowel", + "Pope", + "lime", + "exacerbate", + "recess", + "grease", + "picturesque", + "repeal", + "mesh", + "intercourse", + "yearn", + "limp", + "howl", + "squat", + "shred", + "rake", + "nude", + "blot", + "slick", + "vomit", + "dictatorship", + "streamline", + "chuckle", + "mortal", + "fixture", + "grumble", + "rumble", + "forensic", + "bog", + "overhaul", + "comrade", + "jockey", + "rash", + "pervasive", + "shear", + "yen", + "rugged", + "lush", + "mar", + "hurl", + "hiss", + "anthropologist", + "trot", + "mustache", + "whine", + "continuum", + "vocational", + "wield", + "wink", + "assassinate", + "markedly", + "pneumonia", + "conjure", + "fortress", + "flex", + "hygiene", + "shudder", + "snapshot", + "arithmetic", + "conspicuous", + "sling", + "lust", + "bracelet", + "proprietor", + "corpse", + "presumption", + "muster", + "bandage", + "foe", + "disseminate", + "waive", + "frantic", + "monarch", + "nudge", + "salient", + "fret", + "oust", + "tornado", + "jargon", + "itch", + "frail", + "ramble", + "scorn" + ], + "answers": [ + "脸红 惭愧", + "男性的", + "到达顶点", + "习惯上的", + "不停摆动", + "客厅", + "潜藏", + "洒 撒", + "恶棍", + "折磨", + "排除 预防 阻止", + "缓慢旅行", + "扼杀 抑制", + "腐烂的", + "避开 移开 预防", + "松弛的 疏忽 松懈", + "脏 腹脏", + "教皇", + "酸橙", + "加剧 恶化", + "休息", + "加润滑油", + "如画的", + "废除", + "网状物", + "交往 交流", + "渴望 向往 同情", + "柔软的", + "嚎叫 哀嚎", + "蹲下", + "切成碎片", + "耙 搜索", + "裸体的", + "污点 玷污", + "光滑的 灵巧的", + "呕吐物", + "专政", + "使成流线型", + "咯咯笑", + "终有一死的 致命的", + "固定装置", + "抱怨", + "发出隆隆声", + "法庭的 法院的", + "沼泽", + "彻底检修 全面修订", + "朋友", + "欺骗", + "爆发", + "弥漫的", + "剪羊毛 剥夺", + "日元", + "崎岖的", + "茂盛的 丰富的", + "损坏 玷污", + "投掷", + "发出嘶嘶声", + "人类学家", + "小跑 快步走", + "胡须", + "哀叫 抱怨", + "连续统一体", + "行业的 业余的", + "使用 掌握", + "眨眼", + "暗杀", + "明显的", + "肺炎", + "用魔术变出 想起", + "堡垒", + "弯曲 ", + "卫生", + "颤抖 战栗", + "拍快照", + "算数的", + "明显的", + "投掷", + "性欲", + "项链", + "所有者 经营者", + "尸体", + "假设 假定", + "集合 聚集", + "绷带", + "敌人", + "传播", + "免除", + "狂乱的 发狂的", + "君主", + "轻推 接近", + "突出的 显著的", + "烦扰 恼怒", + "驱逐", + "龙卷风", + "行话", + "痒", + "虚弱的", + "闲逛 闲谈", + "轻视 不屑" + ] +} \ No newline at end of file diff --git a/internalVocabPool/SAT3000Level3List04.json b/internalVocabPool/SAT3000Level3List04.json new file mode 100644 index 0000000..8457778 --- /dev/null +++ b/internalVocabPool/SAT3000Level3List04.json @@ -0,0 +1,198 @@ +{ + "questions": [ + "wail", + "municipality", + "relinquish", + "clad", + "ail", + "creek", + "vengeance", + "cardinal", + "shriek", + "surrogate", + "slant", + "sabotage", + "wrath", + "interrogate", + "pitfall", + "stoop", + "puncture", + "resilient", + "splinter", + "tickle", + "redress", + "tenet", + "hone", + "scour", + "stale", + "relegate", + "undue", + "rebuke", + "elude", + "detergent", + "fray", + "avail", + "flutter", + "riddle", + "strangle", + "bluff", + "notch", + "mumble", + "banish", + "wade", + "fanatic", + "burglar", + "swoop", + "patriot", + "entrench", + "erotic", + "metabolic", + "sleek", + "flurry", + "scribble", + "automotive", + "aura", + "anthem", + "taunt", + "neutron", + "scarlet", + "incense", + "roundabout", + "rampant", + "rapture", + "inverse", + "gorge", + "barb", + "solitude", + "humility", + "microscopic", + "incubate", + "saga", + "secretion", + "devoid", + "mule", + "haze", + "pulp", + "whirl", + "illicit", + "hideous", + "antenna", + "palette", + "imperialism", + "whack", + "downright", + "eerie", + "hustle", + "concur", + "flea", + "rusty", + "taper", + "dispel", + "covet", + "infiltrate", + "stout", + "methane", + "synonymous", + "stamina", + "obscene", + "enclave" + ], + "answers": [ + "恸哭 悲叹", + "当局 自治市", + "放弃", + "覆盖的 穿衣的", + "使苦恼 使生病", + "小河 小溪", + "复仇", + "红衣主教 主要的", + "尖叫", + "替代 代替", + "倾斜的", + "蓄意破坏", + "盛怒", + "质询", + "陷阱", + "屈尊", + "穿刺", + "有弹性的", + "碎片", + "痒", + "补偿 纠正", + "信条", + "磨刀", + "彻底冲洗 冲刷", + "陈腐的", + "降低 移交", + "过度的 未到期的", + "指责", + "躲避", + "洗涤剂", + "磨损", + "用处 效用", + "振翅而飞", + "谜", + "把\u2026勒死", + "虚张声势", + "档次 等级", + "嘟囔", + "驱逐", + "涉水而行", + "狂热的", + "入室盗窃", + "俯冲", + "爱国者", + "驻防 驻守", + "色情的", + "新陈代谢的", + "油滑的", + "疾风", + "潦草", + "汽车的 自动的", + "气氛", + "国歌", + "奚落 逗弄", + "中子", + "猩红色", + "焚香 使发怒", + "迂回的", + "猖獗的", + "断裂", + "逆的", + "峡谷", + "倒钩", + "孤独", + "谦逊 ", + "微观的", + "孵卵", + "长篇故事 传奇故事", + "分泌", + "缺乏的", + "骡子", + "阴霾 雾霾", + "浆", + "回旋", + "违法的", + "极丑的", + "触角 天线", + "调色板", + "帝国主义", + "重击", + "完全的 彻底的", + "古怪的", + "快速的", + "一致同意", + "跳蚤", + "锈的", + "逐渐减少", + "驱逐", + "觊觎", + "渗透 过滤", + "矮胖的", + "甲烷", + "同义的", + "坚毅的", + "使发怒,焚香", + "飞地" + ] +} \ No newline at end of file diff --git a/internalVocabPool/SAT3000Level3List05.json b/internalVocabPool/SAT3000Level3List05.json new file mode 100644 index 0000000..0135d37 --- /dev/null +++ b/internalVocabPool/SAT3000Level3List05.json @@ -0,0 +1,190 @@ +{ + "questions": [ + "fraternity", + "obligate", + "precarious", + "throng", + "quaint", + "bombard", + "fable", + "feud", + "protract", + "dissipate", + "mischief", + "ledger", + "monstrous", + "clench", + "relapse", + "fresco", + "lunatic", + "anesthetic", + "queer", + "grotesque", + "prick", + "flair", + "knuckle", + "caterpillar", + "sluggish", + "stiffen", + "hearth", + "espionage", + "punitive", + "confiscate", + "fixation", + "scold", + "ebb", + "bonfire", + "counteract", + "superstition", + "disconcert", + "pedigree", + "tint", + "pathogen", + "hump", + "crackle", + "horde", + "paternal", + "throb", + "corollary", + "conservatory", + "errand", + "rapport", + "trample", + "tamper", + "guild", + "prelude", + "unwind", + "ruffle", + "scorch", + "clot", + "revamp", + "disband", + "saliva", + "tremor", + "forfeit", + "gulp", + "trifle", + "perjury", + "bogus", + "ransom", + "suffocate", + "majestic", + "hive", + "ghastly", + "tantrum", + "ferocious", + "strew", + "endemic", + "infuse", + "seclude", + "ooze", + "pry", + "promulgate", + "deadlock", + "exasperate", + "treason", + "gild", + "instantaneous", + "amiable", + "retaliate", + "curfew", + "uncanny", + "plunder", + "gush", + "strife" + ], + "answers": [ + "友善 友爱", + "迫使", + "不稳定的 ", + "一大群 人群", + "古色古香的", + "炮击 轰击", + "寓言 传说", + "长期不和 争执", + "延长 伸展", + "分发 发散 驱散 消失", + "恶作剧", + "账单", + "巨大的", + "紧握", + "复发", + "壁画", + "狂热的", + "麻醉剂", + "奇怪的", + "奇异古怪的", + "刺 戳", + "天资", + "关节", + "毛虫", + "萧条的 迟缓的", + "变硬", + "灶台", + "间谍活动", + "惩罚性的", + "没收", + "痴迷", + "责骂", + "减退", + "篝火", + "取消", + "迷信", + "使不安 使为难", + "家谱 血统", + "淡色 色彩", + "病原体", + "突起的物体", + "发出噼啪声", + "一大群", + "父亲的", + "抽动 颤动", + "必然的结论 推论", + "温室", + "差事", + "融洽 密切关系 ", + "践踏 蔑视 伤害", + "纂改 损害 削弱", + "协会", + "序曲 开端", + "解开 解放", + "弄皱", + "烧焦的", + "凝块", + "改进", + "解散", + "唾液", + "小地震 震颤", + "罚金,没收物,丧失的东西", + "吞咽", + "琐事 少量", + "伪证 伪善", + "假的 伪造的", + "赎回", + "使窒息", + "威严的", + "蜂巢", + "可怕的", + "发脾气 发怒", + "凶猛的 残忍的", + "散播 洒满", + "本地的", + "注入 传输", + "使隔开", + "渗出", + "撬", + "宣告 颁布 公布", + "僵局", + "激怒 触怒", + "背叛 叛国", + "镀金", + "瞬间的 即刻的", + "和蔼可亲的 有爱的", + "报复 反击", + "宵禁令", + "离奇的 可怕的", + "抢夺 抢夺品", + "涌出", + "冲突" + ] +} \ No newline at end of file diff --git a/internalVocabPool/SAT3000Level3List06.json b/internalVocabPool/SAT3000Level3List06.json new file mode 100644 index 0000000..cd2d871 --- /dev/null +++ b/internalVocabPool/SAT3000Level3List06.json @@ -0,0 +1,188 @@ +{ + "questions": [ + "crutch", + "goggle", + "pane", + "neon", + "remuneration", + "retribution", + "sanity", + "wry", + "animosity", + "resound", + "gust", + "tavern", + "dosage", + "cyclical", + "vista", + "overture", + "ripe", + "superimpose", + "mime", + "eschew", + "rendition", + "squander", + "glimmer", + "margarine", + "retract", + "condone", + "tingle", + "genesis", + "replenish", + "uproar", + "buoy", + "sanitation", + "elucidate", + "scoff", + "hoot", + "rehabilitate", + "righteous", + "daze", + "babble", + "appease", + "besiege", + "sear", + "liquidation", + "kinetic", + "scuttle", + "spire", + "catapult", + "serpent", + "conveyance", + "inconceivable", + "debacle", + "vertex", + "meditate", + "detest", + "bosom", + "instigate", + "pamper", + "distraught", + "magnification", + "quell", + "custodian", + "doze", + "fiasco", + "cringe", + "tarnish", + "panorama", + "supplant", + "vulture", + "flinch", + "meddle", + "halo", + "malice", + "trudge", + "congregate", + "italic", + "vile", + "outstrip", + "exalt", + "euphoria", + "apex", + "rummage", + "ingest", + "benefactor", + "inexplicable", + "nocturnal", + "porous", + "raucous", + "dabble", + "swerve", + "inert", + "grimace" + ], + "answers": [ + "支持", + "瞪视 护目镜", + "窗格玻璃", + "霓虹", + "酬金", + "应得的惩罚 赔偿", + "精神正常", + "挖苦 讽刺", + "敌意", + "回响 回声", + "一阵狂风", + "小酒馆 客栈", + "剂量", + "循环的", + "景色", + "开端 序曲", + "成熟的", + "重叠 安装", + "哑剧", + "闪避", + "演绎", + "挥霍", + "闪光", + "人造黄油", + "退回 ", + "宽恕 赦免", + "刺痛", + "起源 根源", + "再装满", + "喧闹", + "鼓励 使上升", + "公共设施", + "阐明", + "嘲笑 愚弄 笑柄", + "汽车喇叭声 叫骂声", + "恢复", + "正义的", + "使茫然 头晕目眩", + "喋喋不休", + "使平息", + "包围 围住", + "使\u2026烧焦", + "清算 液化", + "动力学", + "小步疾走", + "尖顶", + "弹弓", + "巨蛇", + "运输工具 运输", + "不能想象的 不可思议的", + "崩溃 灾难", + "顶点", + "冥想 考虑 计划", + "憎恨 厌恶", + "乳房 亲密的", + "煽动", + "纵容", + "心烦意乱的", + "放大", + "消除 镇压", + "管理人员", + "打瞌睡", + "惨败", + "收缩", + "玷污", + "全景", + "提供者", + "秃鹫 贪婪的人", + "退缩 畏惧", + "干涉", + "光环", + "恶意", + "跋涉", + "使集合 聚集", + "斜体的", + "恶毒的 卑鄙的 低廉的", + "超过 胜过", + "赞扬 提升 拔升", + "狂喜", + "使达到顶点", + "翻找 翻寻", + "摄入", + "捐助者", + "无法说明的 费解的", + "夜间的", + "有孔的", + "粗声的 沙哑的", + "浅尝", + "转弯 转向", + "惰性的", + "扮鬼脸" + ] +} \ No newline at end of file diff --git a/internalVocabPool/SAT3000Level3List07.json b/internalVocabPool/SAT3000Level3List07.json new file mode 100644 index 0000000..4c1f31d --- /dev/null +++ b/internalVocabPool/SAT3000Level3List07.json @@ -0,0 +1,200 @@ +{ + "questions": [ + "garnish", + "meltdown", + "droop", + "fictitious", + "wand", + "fussy", + "solace", + "troupe", + "hobble", + "dew", + "esoteric", + "gully", + "unruly", + "rescind", + "anomalous", + "forsake", + "swipe", + "sterilize", + "bicker", + "annotate", + "alkaline", + "truss", + "impenetrable", + "boulevard", + "predate", + "hash", + "bemuse", + "petrify", + "attune", + "innocuous", + "notoriety", + "resonant", + "cavern", + "hoax", + "coffer", + "quail", + "prodigious", + "hoe", + "courtier", + "rebuff", + "manicure", + "reverberate", + "sedentary", + "resolute", + "allegory", + "invigorate", + "cursory", + "decry", + "unparalleled", + "gobble", + "vanguard", + "befall", + "impotent", + "gallant", + "incriminate", + "finesse", + "autocratic", + "haggle", + "repent", + "strident", + "append", + "discord", + "recline", + "truncate", + "regress", + "compatriot", + "lenient", + "extol", + "sulk", + "embroil", + "stammer", + "interject", + "glee", + "stow", + "gratuitous", + "stutter", + "contiguous", + "sonar", + "sidestep", + "speckle", + "impel", + "crafty", + "collate", + "fanfare", + "hulk", + "altruism", + "froth", + "usurp", + "judicious", + "consecrate", + "obedient", + "melodramatic", + "fungal", + "prank", + "boisterous", + "methodical", + "intrepid" + ], + "answers": [ + "装饰", + "崩溃", + "垂头丧气", + "假的", + "魔杖", + "挑剔的 过分装饰的", + "慰藉", + "演出团", + "跛行 阻碍", + "露水", + "深奥难懂的", + "水沟", + "难控制的", + "撤销", + "异常的", + "放弃", + "挥击", + "给\u2026消毒", + "争吵", + "给\u2026做注释", + "碱", + "扎紧", + "无法穿透的", + "林荫大道", + "早于", + "切碎的食物 搞糟", + "使迷惑 使茫然", + "石化", + "使适应 使协调", + "无害的", + "臭名昭著", + "洪亮的 引起回响的", + "大洞穴", + "哄骗", + "保险柜 金库", + "畏缩", + "巨大的", + "锄头", + "朝臣 奉承者", + "拒绝", + "修指甲", + "回响", + "静止的 久坐的", + "坚决的", + "寓言", + "使充满活力", + "匆忙的", + "公开谴责", + "空前的", + "狼吞虎咽", + "先锋", + "降临", + "无效的 无能的", + "勇敢的 狭义的", + "控告", + "技巧 策略", + "独裁的", + "讨价还价", + "忏悔", + "刺耳的 强硬的", + "附加", + "不一致 争吵", + "使后倾", + "缩短", + "倒退", + "同胞 同国人", + "仁慈的", + "赞美 赞扬", + "生气 愠怒", + "使卷入", + "结巴 口吃", + "插话", + "高兴", + "塞进 装填", + "多余的 免费的", + "结巴 口吃", + "毗邻的", + "声纳", + "避开", + "斑点", + "迫使", + "狡猾的", + "整理 校对", + "响声 炫耀", + "庞然大物", + "利他主义", + "起泡沫", + "篡夺", + "明智的", + "圣化", + "顺从的", + "夸张的", + "真菌的", + "恶作剧", + "喧闹的", + "有条理的", + "无畏的" + ] +} \ No newline at end of file diff --git a/internalVocabPool/SAT3000Level3List08.json b/internalVocabPool/SAT3000Level3List08.json new file mode 100644 index 0000000..54c4728 --- /dev/null +++ b/internalVocabPool/SAT3000Level3List08.json @@ -0,0 +1,192 @@ +{ + "questions": [ + "foreclose", + "reticent", + "hermit", + "zest", + "incipient", + "gouge", + "stampede", + "ventilate", + "sanguine", + "terse", + "mascot", + "docile", + "unassuming", + "precipitous", + "fetish", + "antithesis", + "obviate", + "outpouring", + "frenetic", + "dexterity", + "pacify", + "inexorable", + "supple", + "defraud", + "unrelenting", + "hoarse", + "breakout", + "zealous", + "fluoride", + "purveyor", + "fawn", + "suffuse", + "propulsion", + "excruciate", + "nectar", + "progenitor", + "chubby", + "rapture", + "debunk", + "insoluble", + "quench", + "indulgent", + "dainty", + "irradiate", + "decapitate", + "ransack", + "suction", + "summation", + "perspiration", + "dishearten", + "disingenuous", + "transfix", + "gregarious", + "canny", + "heinous", + "derange", + "drowsy", + "wharf", + "parch", + "bewitch", + "fortitude", + "sneaky", + "cipher", + "loath", + "grinder", + "vanquish", + "insinuate", + "introspective", + "recluse", + "gullible", + "frugal", + "repugnant", + "tussle", + "lubricant", + "impregnate", + "inhalation", + "tassel", + "kindle", + "emancipate", + "amicable", + "preconceive", + "innuendo", + "castigate", + "indiscretion", + "confederate", + "indistinct", + "tendril", + "perfunctory", + "debase", + "tribulation", + "orb", + "overbear", + "valiant" + ], + "answers": [ + "取消抵押品赎回权", + "缄默的", + "隐士", + "热情 兴奋", + "刚开始的", + "凿", + "人群 蜂拥", + "通风 发表 表达", + "乐观的", + "简洁的", + "吉祥物", + "温顺的", + "谦逊的", + "陡峭的 突然的 鲁莽的", + "喜爱", + "对立面", + "避免 消除", + "流露", + "发狂的", + "灵巧 敏捷", + "安抚", + "不可阻挡的 无情", + "柔软的 顺从的", + "欺骗", + "不间断的", + "嘶哑的", + "爆发", + "热心的 热情的", + "氟化物", + "供应者", + "奉承", + "使充满", + "推进", + "折磨 极大痛苦", + "花蜜", + "祖先", + "丰满的", + "狂喜", + "揭穿 拆穿", + "不可溶的", + "熄灭 ", + "放纵的", + "精巧的 精致的", + "照亮 使发光", + "砍掉\u2026的头", + "洗劫", + "吸", + "总结", + "汗水", + "使沮丧", + "不诚实的 不真诚的", + "使惊呆", + "爱交际的", + "精明的", + "道德败坏的 极坏的", + "打乱 使精神错乱", + "昏昏欲睡的", + "码头 停泊处", + "烤 焦干", + "使着迷 使迷惑", + "坚忍不拔", + "鬼鬼祟祟的", + "密码 暗号", + "不情愿", + "磨粉机", + "攻克 克服 抑制", + "暗示 旁敲侧击", + "反省的 内省的", + "隐居者", + "易受骗的", + "节俭的 朴素的", + "令人厌恶的 矛盾的", + "扭打 打斗", + "润滑的", + "渗透 使怀孕", + "吸入", + "流苏", + "点燃 激起", + "解放 释放", + "有爱的", + "预想 预见", + "影射 暗讽 讽刺", + "严厉批评 谴责", + "轻率 言行失检", + "同党 共犯", + "不清楚的 模糊的", + "一束 一缕", + "敷衍的", + "贬低", + "磨难", + "球状物", + "克服 镇压", + "勇敢的" + ] +} \ No newline at end of file diff --git a/internalVocabPool/SAT3000Level3List09.json b/internalVocabPool/SAT3000Level3List09.json new file mode 100644 index 0000000..f66e243 --- /dev/null +++ b/internalVocabPool/SAT3000Level3List09.json @@ -0,0 +1,204 @@ +{ + "questions": [ + "schism", + "bisect", + "unfurl", + "combative", + "fortuitous", + "oblong", + "spatter", + "wily", + "swelter", + "somersault", + "repulse", + "inscrutable", + "chlorophyll", + "hieroglyphic", + "paleontologist", + "trite", + "merciful", + "honk", + "decoy", + "concord", + "receptacle", + "resuscitate", + "molt", + "venerate", + "voracious", + "premeditate", + "fastidious", + "kickback", + "extort", + "pedantic", + "loll", + "cobblestone", + "offbeat", + "ratchet", + "unbridle", + "dimple", + "propound", + "behemoth", + "doodle", + "begrudge", + "scoundrel", + "reprehensible", + "variegate", + "hexagonal", + "cosmonaut", + "indefatigable", + "incise", + "disavow", + "javelin", + "despondent", + "ebullient", + "encumber", + "morose", + "decibel", + "studious", + "jovial", + "stoic", + "swindle", + "drudgery", + "tinkle", + "recant", + "unwitting", + "voluptuous", + "lullaby", + "unremitting", + "misconstrue", + "demure", + "naivete", + "detonation", + "geyser", + "humdrum", + "centennial", + "figment", + "listless", + "frolic", + "infernal", + "missive", + "inimical", + "refract", + "garble", + "merriment", + "entreat", + "pliable", + "carnivorous", + "askew", + "fuzz", + "freewheel", + "undulation", + "droll", + "demagogue", + "torrid", + "insipid", + "vacuous", + "quixotic", + "embezzle", + "palatial", + "rectitude", + "orangutan", + "elixir" + ], + "answers": [ + "分裂 分歧", + "等分", + "展开", + "战斗的", + "偶然的", + "长方形", + "溅射", + "诡计多端的", + "酷热难当的", + "翻滚 翻筋斗", + "击退", + "不可预测的 谜一样的", + "叶绿素", + "象形文字", + "古生物学家", + "陈腐的 平庸的", + "仁慈的", + "鹅叫声", + "诱饵", + "一致 和谐", + "容器", + "恢复", + "换羽脱毛", + "尊敬", + "贪吃的 狼吞虎咽的", + "预谋", + "一丝不苟的 过分严谨的", + "佣金 回馈", + "敲诈 侵占", + "学究式的", + "懒洋洋地靠着", + "圆石", + "不寻常的 非传统的", + "锯齿条 小幅提升", + "去掉辔头 不受控制的", + "激起涟漪", + "提出\u2026供考虑", + "巨大的 巨兽", + "涂鸦", + "嫉妒 怨恨", + "无赖", + "应受谴责的", + "使多样化 使斑驳", + "六角形的", + "俄宇航员", + "不知疲倦的", + "切割 切", + "否认 否定", + "标枪", + "沮丧的", + "热情洋溢的", + "阻塞 妨碍", + "抑郁的 闷闷不乐的", + "分贝", + "用功的 热心的", + "欢乐的", + "坚忍的", + "诈骗", + "苦工 苦差事", + "叮当响", + "宣布放弃", + "不知情的", + "性感的 丰满的", + "摇篮曲", + "不懈的 不间断的", + "误解", + "端庄的 严肃的", + "天真", + "引爆", + "间歇喷泉", + "单调的 无聊的", + "百年周年纪念日", + "臆想的事物", + "无精打采的", + "起泡沫", + "地狱的", + "信件 公函", + "不友好的", + "折射", + "纂改", + "欢乐", + "恳求 ", + "可弯曲的", + "食肉的", + "偏斜", + "绒毛", + "滑行 凭惯性前进", + "波动", + "滑稽", + "煽动者", + "热情的", + "枯燥的 单调的", + "空虚的", + "唐吉坷德式的", + "盗用 贪污", + "堂皇的 宏伟的 壮丽的", + "公正 诚实", + "猩猩", + "圣水" + ] +} \ No newline at end of file diff --git a/internalVocabPool/SAT3000Level3List10.json b/internalVocabPool/SAT3000Level3List10.json new file mode 100644 index 0000000..1f997b9 --- /dev/null +++ b/internalVocabPool/SAT3000Level3List10.json @@ -0,0 +1,298 @@ +{ + "questions": [ + "misshapen", + "otherness", + "vacillate", + "fatalistic", + "repetitious", + "telepathy", + "keystone", + "impostor", + "filial", + "outsmart", + "periodicity", + "deject", + "magnetize", + "aurora", + "exultant", + "efface", + "reprove", + "egotism", + "halcyon", + "garrulous", + "dilettante", + "dissolute", + "insolence", + "bashful", + "effervescent", + "limber", + "satiric", + "parabola", + "inchoate", + "actuate", + "insuperable", + "fecund", + "recapitulation", + "countermand", + "lionize", + "enunciation", + "indolence", + "herbivorous", + "entrain", + "satiate", + "recommence", + "propellant", + "stratus", + "quitter", + "loquacious", + "beguile", + "camphor", + "pileup", + "largess", + "misanthrope", + "raconteur", + "equilateral", + "verbose", + "avocation", + "flume", + "abash", + "malevolence", + "unwonted", + "irresolute", + "counterclockwise", + "enervate", + "torpid", + "precession", + "sagacious", + "timorous", + "demoralization", + "onomatopoeia", + "irretrievable", + "importunity", + "munificent", + "immure", + "relict", + "mockingbird", + "faddish", + "abdicate", + "blow over", + "breeding", + "caress", + "clipping", + "comedown", + "correctitude", + "creeping", + "criteria", + "crooked", + "cupidity", + "cut back", + "debark", + "denunciate", + "dispirit", + "dissolve", + "distillate", + "don", + "embank", + "ennui", + "extemporize", + "façade", + "forbid", + "fungi", + "glowing", + "hat trick", + "Hispanic", + "impending", + "indissoluble", + "inefficacious", + "infection", + "intemperance", + "keep track of", + "long to", + "luminousness", + "magnanimity", + "migrator", + "monologue", + "mortgage", + "nagging", + "overexertion", + "palpable", + "palliate", + "premeditate", + "plough", + "quivering", + "ragged", + "reacquaint", + "reduce to", + "refashion", + "resigned", + "revival", + "rousing", + "self-absorption", + "self-deluding", + "self-propelled", + "self-righteous", + "set forth", + "soak into", + "smother", + "Spartan", + "spring up", + "subtract", + "take credit for", + "taper", + "tiptoe", + "top-notch", + "unbundle", + "untangle", + "wind up", + "zombify", + "supernovae" + ], + "answers": [ + "畸形的 歪曲", + "相异 不同", + "犹豫", + "宿命论的", + "重复的", + "心灵感应", + "主旨", + "骗子", + "子女的", + "在智力上超过", + "周期性", + "拒绝", + "磁化", + "极光 曙光", + "狂喜的", + "擦除", + "责骂 谴责", + "个人主义", + "太平的 安详的", + "喋喋不休的 多嘴的", + "业余", + "放荡的 淫乱的", + "傲慢", + "害羞的 腼腆的", + "冒泡的 兴奋的", + "柔软的 敏捷的", + "讽刺的", + "抛物线", + "早期的 刚开始的", + "开动 促使", + "不可克服的", + "多产的 丰饶的", + "摘要", + "取消", + "吹捧 奉为名人", + "表明 宣言 发表", + "懒惰", + "食草的", + "乘火车", + "充分满足", + "重新开始", + "推进物", + "层云", + "虎头蛇尾的人", + "健谈的", + "使迷惑", + "樟脑", + "累计", + "恩惠物品", + "反人类者", + "健谈者", + "等边的", + "啰嗦的", + "业余爱好", + "使用水槽饮水", + "使困窘 害羞", + "恶意", + "异常的", + "优柔寡断的", + "逆时针的", + "使无力", + "麻木的", + "运动 旋进", + "明智的", + "羞怯的", + "道德败坏", + "拟声法", + "不可挽回的", + "强求", + "慷慨的", + "禁闭 监禁", + "遗迹", + "知更鸟", + "流行的", + "退出 退位", + "消散 平息", + "饲养 繁殖", + "爱抚 拥抱", + "剪报", + "衰落 没落", + "得体 端正", + "爬行的", + "准则 标准", + "歪曲的", + "贪婪 贪心", + "减少 削减", + "卸载 下船", + "谴责 抨击", + "使沮丧 使气馁", + "溶解", + "蒸馏液", + "先生 阁下", + "筑堤防护", + "厌倦 无聊", + "即兴表演", + "房屋正面 假象", + "禁止", + "真菌", + "炽热的 发光", + "帽子戏法", + "西班牙人的", + "即将到来的", + "不能分解的", + "无用的", + "感染", + "放纵", + "记录", + "渴望", + "明亮", + "慷慨 宽宏大量", + "候鸟 移居者", + "独白", + "抵押", + "挑剔的 唠叨的", + "用力过猛", + "明显的", + "减轻 减缓", + "预谋", + "犁地", + "颤抖的", + "衣衫褴褛的", + "重新认识", + "减少到", + "重做 重新设计", + "温顺的 顺从的", + "复活 再生", + "鼓舞人心的", + "聚精会神", + "自欺欺人的", + "自立推进的", + "伪善的 自以为是的", + "提出 陈述", + "渗入", + "窒息", + "斯巴达式的", + "涌现", + "-", + "归功于", + "逐渐减少", + "踮着脚走", + "出众的", + "分类交易", + "解开 解决", + "收尾 ", + "使僵化", + "超新星" + ] +} \ No newline at end of file diff --git a/layout/Layout.png b/layout/Layout.png new file mode 100644 index 0000000..b310c4a Binary files /dev/null and b/layout/Layout.png differ diff --git a/layout/info.psd b/layout/info.psd new file mode 100644 index 0000000..43a44cb Binary files /dev/null and b/layout/info.psd differ diff --git a/pom.xml b/pom.xml new file mode 100644 index 0000000..7cd80a5 --- /dev/null +++ b/pom.xml @@ -0,0 +1,73 @@ + + + 4.0.0 + + xyz.socttc + VocabularyDecoder + 1.0.0 + + + org.json + json + 20200518 + + + + + 1.8 + 1.8 + + + + ${project.artifactId} + + + + + + org.apache.maven.plugins + maven-compiler-plugin + 3.8.0 + + 1.8 + 1.8 + UTF-8 + + + + + + org.apache.maven.plugins + maven-assembly-plugin + 3.1.1 + + false + + jar-with-dependencies + + + + + + xyz.scottc.Main + + + + + + make-assembly + package + + single + + + + + + + + + + \ No newline at end of file diff --git a/src/main/java/xyz/scottc/Main.java b/src/main/java/xyz/scottc/Main.java new file mode 100644 index 0000000..b401324 --- /dev/null +++ b/src/main/java/xyz/scottc/Main.java @@ -0,0 +1,27 @@ +package xyz.scottc; + +import xyz.scottc.frames.mainFrame.MainFrame; + +import javax.swing.*; +import java.awt.*; + +public class Main { + + public static void main(String[] args) { + //Initiate the Frame + Main.initFrame(); + } + + private static void initFrame() { +/* try { + UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName()); + } catch (ClassNotFoundException | InstantiationException | UnsupportedLookAndFeelException | + IllegalAccessException e) { + e.printStackTrace(); + }*/ + MainFrame frame = new MainFrame("Vocabulary Decoder"); + frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); + frame.setSize(new Dimension(1000, 1000)); + frame.setVisible(true); + } +} diff --git a/src/main/java/xyz/scottc/frames/commonModeFrame/CommonModeFrame.java b/src/main/java/xyz/scottc/frames/commonModeFrame/CommonModeFrame.java new file mode 100644 index 0000000..438d11d --- /dev/null +++ b/src/main/java/xyz/scottc/frames/commonModeFrame/CommonModeFrame.java @@ -0,0 +1,95 @@ +package xyz.scottc.frames.commonModeFrame; + +import xyz.scottc.frames.commonModeFrame.component.FunctionPanel; +import xyz.scottc.frames.commonModeFrame.component.LeftPanel; +import xyz.scottc.frames.commonModeFrame.component.TopPanel; +import xyz.scottc.utils.LineSeparator; +import xyz.scottc.utils.UtilJPanel; +import xyz.scottc.utils.VDMenu; + +import javax.swing.*; +import java.awt.*; + +public class CommonModeFrame extends JFrame { + + private final UtilJPanel rootPanel = new UtilJPanel(new CommonModeLayout()); + private final TopPanel topPanel = new TopPanel(this); + //private final FunctionPanel functionPanel = new FunctionPanel(this, this.topPanel); + private final FunctionPanel functionPanel = new FunctionPanel(this, this.topPanel); + private final LeftPanel leftPanel = new LeftPanel(this, this.functionPanel, this.topPanel); + public final LineSeparator separator01 = new LineSeparator(LineSeparator.HORIZONTAL, Integer.MAX_VALUE); + public final LineSeparator separator02 = new LineSeparator(LineSeparator.VERTICAL, 10000); + public final LineSeparator separator03 = new LineSeparator(LineSeparator.HORIZONTAL, Integer.MAX_VALUE); + + private final JMenuBar menuBar = new JMenuBar(); + private final VDMenu fileMenu = new VDMenu("File"); + + public CommonModeFrame(String title) throws HeadlessException { + super(title); + this.setContentPane(this.rootPanel); + this.setJMenuBar(this.menuBar); + + //Adds Menu + this.menuBarHandler(); + + this.rootPanelHandler(); + } + + private void rootPanelHandler() { + this.rootPanel.add(this.leftPanel); + this.rootPanel.add(this.separator01); + this.rootPanel.add(this.separator02); + this.rootPanel.add(this.separator03); + this.rootPanel.add(this.functionPanel); + this.rootPanel.add(this.topPanel); + } + + private void menuBarHandler() { + this.menuBar.add(this.fileMenu); + } + + private class CommonModeLayout implements LayoutManager { + + @Override + public void layoutContainer(Container parent) { + int width = parent.getWidth(); + int height = parent.getHeight(); + int marginX = width / 100; + int marginY = height / 100; + + separator01.setBounds(0, 37 + marginY * 2, width, 1); + separator02.setBounds(width / (1000 / 251) - 40, 0, 1, height); + double ratio03 = 1000D / 829D; + separator03.setBounds(0, (int) (height / ratio03) + 70, width, 1); + + topPanel.setBounds(separator02.getX() + marginX, marginY, + width - separator02.getX() - marginX, height - separator01.getY() - marginY); + + leftPanel.setBounds(marginX, marginY, width / (1000 / 251) - 40, height - marginY); + + functionPanel.setBounds(separator02.getX() + 1 + marginX, separator01.getY() + 1 + marginY, + width - (separator02.getX() + 1), (height - separator01.getY() + 1)); + } + + @Override + public void addLayoutComponent(String name, Component comp) { + + } + + @Override + public void removeLayoutComponent(Component comp) { + + } + + @Override + public Dimension preferredLayoutSize(Container parent) { + return null; + } + + @Override + public Dimension minimumLayoutSize(Container parent) { + return null; + } + + } +} diff --git a/src/main/java/xyz/scottc/frames/commonModeFrame/component/FunctionPanel.java b/src/main/java/xyz/scottc/frames/commonModeFrame/component/FunctionPanel.java new file mode 100644 index 0000000..f360400 --- /dev/null +++ b/src/main/java/xyz/scottc/frames/commonModeFrame/component/FunctionPanel.java @@ -0,0 +1,553 @@ +package xyz.scottc.frames.commonModeFrame.component; + +import xyz.scottc.frames.commonModeFrame.CommonModeFrame; +import xyz.scottc.frames.commonModeFrame.dialog.review.Review; +import xyz.scottc.frames.commonModeFrame.dialog.review.ReviewData; +import xyz.scottc.utils.*; + +import javax.swing.*; +import java.awt.*; +import java.awt.event.KeyEvent; +import java.awt.event.KeyListener; +import java.util.ArrayList; +import java.util.List; + +public class FunctionPanel extends UtilJPanel { + + private final CommonModeFrame parentFrame; + private final TopPanel topPanel; + private final Review review; + + private final UtilJLabel previousQLabel = new UtilJLabel("Previous Question", VDConstantsUtils.MICROSOFT_YAHEI_BOLD_30); + private final VDTextArea previousQ = new VDTextArea(1, 11, VDConstantsUtils.MICROSOFT_YAHEI_BOLD_30, false, true); + private final JScrollPane previousQScrollPane = new JScrollPane(this.previousQ); + + private final UtilJLabel previousALabel = new UtilJLabel("Your Previous Answer", VDConstantsUtils.MICROSOFT_YAHEI_BOLD_30); + private final VDTextArea previousA = new VDTextArea(1, 11, VDConstantsUtils.MICROSOFT_YAHEI_BOLD_30, false, true); + private final JScrollPane previousAScrollPane = new JScrollPane(this.previousA); + + private final UtilJLabel QLabel = new UtilJLabel("Question", VDConstantsUtils.MICROSOFT_YAHEI_BOLD_60); + private final VDTextArea Q = new VDTextArea(1, 8, VDConstantsUtils.MICROSOFT_YAHEI_BOLD_80, false, true); + private final JScrollPane QScrollPane = new JScrollPane(this.Q); + + private final UtilJLabel ALabel = new UtilJLabel("Your Answer", VDConstantsUtils.MICROSOFT_YAHEI_BOLD_60); + private final VDTextArea A = new VDTextArea(1, 8, VDConstantsUtils.MICROSOFT_YAHEI_BOLD_80, false, true); + private final JScrollPane AScrollPane = new JScrollPane(this.A); + + private final UtilJLabel standardALabel = new UtilJLabel("Standard Answer", VDConstantsUtils.MICROSOFT_YAHEI_BOLD_40); + private final VDTextArea standardA = new VDTextArea(1, 11, VDConstantsUtils.MICROSOFT_YAHEI_BOLD_60, false, true); + private final JScrollPane standardAScrollPane = new JScrollPane(this.standardA); + + private final UtilJButton previousButton = new UtilJButton("Previous", 35); + private final UtilJButton nextButton = new UtilJButton("Next", 35); + private final UtilJButton answerButton = new UtilJButton("Answer", 35); + private final UtilJButton reviewButton = new UtilJButton("Review", 35); + + public boolean isListLoaded = false; + public boolean init = false; + private boolean suspend = false; + private boolean isAnswerShown = false; + + private int index = 0; + + public List questionList; + public List answerList; + public List inputList = new ArrayList<>(); + + private final Object[] selectionValues = {"Vocabulary - Meaning", "Meaning - Vocabulary"}; + private Object selectionValue; + + public FunctionPanel(CommonModeFrame parent, TopPanel topPanel) { + this.parentFrame = parent; + this.topPanel = topPanel; + this.review = new Review(this.parentFrame); + this.setLayout(new FunctionPanelLayout()); + this.rootPanelHandler(); + this.scrollBarPolicyHandler(); + this.topPanelHandler(); + } + + private void rootPanelHandler() { + this.add(this.previousQLabel); + this.add(this.previousQScrollPane); + + this.add(this.previousALabel); + this.add(this.previousAScrollPane); + + this.add(this.QLabel); + this.add(this.QScrollPane); + + this.add(this.ALabel); + this.add(this.AScrollPane); + this.A.addKeyListener(new TextAreaKeyListener()); + + this.add(this.standardALabel); + this.add(this.standardAScrollPane); + + this.add(this.previousButton); + this.previousButton.addActionListener(e -> this.previous()); + + this.add(this.nextButton); + this.nextButton.addActionListener(e -> this.next()); + + this.add(this.answerButton); + this.answerButton.addActionListener(e -> this.answer()); + + this.add(this.reviewButton); + this.reviewButton.addActionListener(e -> this.review()); + } + + private void topPanelHandler() { + this.topPanel.startButton.addActionListener(e -> this.start()); + this.topPanel.stopButton.addActionListener(e -> this.stop()); + this.topPanel.suspendButton.addActionListener(e -> this.suspend()); + this.topPanel.continueButton.addActionListener(e -> this.continu()); + } + + private void start() { + if (this.isListLoaded) { + //if not init, start the process + if (!this.init) { + //let user choose whether VM or MV + Object input = JOptionPane.showInputDialog(this.parentFrame, + "V-M = You need to answer the meaning of a vocabulary\n" + + "M-V = You need to answer the vocabulary of corresponding meaning", "V-M or M-V?", + JOptionPane.QUESTION_MESSAGE, null, selectionValues, selectionValues[0]); + switch (input.toString()) { + case "Vocabulary - Meaning": + this.selectionValue = this.selectionValues[0]; + break; + case "Meaning - Vocabulary": + //默认单词列表是questionList,所以如果选这个模式就将questionList和answerList互换 + VDConstantsUtils.interconvertList(this.questionList, this.answerList); + this.selectionValue = this.selectionValues[1]; + break; + } + + //init the index + this.index = 0; + + //init the inputList + this.initInputList(); + + //init the Q + this.Q.setText(this.questionList.get(this.index).toString()); + + //init the A + this.A.setEnabled(true); + this.A.setText(this.inputList.get(this.index)); + this.A.grabFocus(); + + //init the timer + this.topPanel.timer.startFromZero(); + + //init the amount display + this.topPanel.amountDisplay.setCurrentAmount(this.index + 1); + + //init the review data + this.initReviewData(); + + //update the sign + this.init = true; + } else { + VDConstantsUtils.showWarningMessage(this.parentFrame, "The process was already started!"); + } + } else { + VDConstantsUtils.showWarningMessage(this.parentFrame, + "Please first double click the vocabulary list you want to memorize to load it!"); + } + } + + private void initInputList() { + this.inputList.clear(); + for (int i = 0; i < this.questionList.size(); i++) { + this.inputList.add(VDConstantsUtils.EMPTY); + } + } + + private void stop() { + if (this.init) { + int result = VDConstantsUtils.showQuestionMessgae(this.parentFrame, "Do you really want to stop?"); + if (result == JOptionPane.OK_OPTION) { + //update the index + this.index = 0; + + //clear all the display area + this.previousQ.setText(VDConstantsUtils.EMPTY); + this.previousA.setText(VDConstantsUtils.EMPTY); + this.Q.setText(VDConstantsUtils.EMPTY); + this.A.setText(VDConstantsUtils.EMPTY); + this.standardA.setText(VDConstantsUtils.EMPTY); + + //diable the input area + this.A.setEnabled(false); + + //clear all the lists + this.questionList.clear(); + this.answerList.clear(); + this.initInputList(); + + //stop the timer + this.topPanel.timer.stop(); + + //stop the amount displayer + this.topPanel.amountDisplay.stop(); + + //clear the review + this.review.dataPanel.clear(); + + //update the sign + this.suspend = false; + this.init = false; + this.isListLoaded = false; + } + } else { + VDConstantsUtils.showWarningMessage(this.parentFrame, "You had not stated it yet!"); + } + } + + private void suspend() { + if (this.init && !this.suspend) { + //suspend the functional components + this.A.setEnabled(false); + this.review.setEnabled(false); + this.previousButton.setEnabled(false); + this.answerButton.setEnabled(false); + this.nextButton.setEnabled(false); + + //pause the timer + this.topPanel.timer.suspend(); + + //update the sign + this.suspend = true; + } + } + + private void continu() { + if (this.init && this.suspend) { + //enable the functional components + this.A.setEnabled(true); + this.review.setEnabled(true); + this.previousButton.setEnabled(true); + this.answerButton.setEnabled(true); + this.nextButton.setEnabled(true); + + //continue the timer + this.topPanel.timer.continu(); + + //update the sign + this.suspend = false; + } + } + + private void save() { + this.inputList.set(this.index, this.A.getText()); + } + + private void next() { + if (this.init) { + //index have not increase yet -> current question + //save current input answer + this.save(); + + //update the previousA&Q + this.previousQ.setText(this.questionList.get(this.index).toString()); + this.previousA.setText(this.inputList.get(this.index)); + + //set the review data + review.dataPanel.setData(review.dataPanel.allDataModel, generateReviewData(), index); + + //increase the index by 1 -> next vocabulary + index++; + + //set Q and A + this.Q.setText(this.questionList.get(this.index).toString()); + this.A.setText(this.inputList.get(this.index)); + + //handle the answer + if (this.isAnswerShown) { + if (this.inputList.get(this.index).equals(VDConstantsUtils.EMPTY)) { + //if the answer had shown, and the next vocab is unknown to user, then make the answer disappear + this.disableAnswer(); + } else { + //if the answer had shown, and the user knows next vocab + //replace the current answer with the answer of next vocab + this.updateAnswer(); + } + } + + //do some common stuff + this.doTransition(); + } + } + + private void previous() { + if (this.init && this.index > 0) { + //save the current input + this.save(); + + //set the review data + review.dataPanel.setData(review.dataPanel.allDataModel, generateReviewData(), index); + + //back to the previous index + index--; + + //set the Q&A + this.Q.setText(this.questionList.get(this.index).toString()); + this.A.setText(this.inputList.get(this.index)); + + //index = 0 means that there is no previous one anymore + //index = 1 means that the previous one of index = 1 that is index = 0 have no previous one + if (index >= 1) { + //set the previous Q&A + this.previousQ.setText(this.questionList.get(this.index - 1).toString()); + this.previousA.setText(this.inputList.get(this.index - 1)); + } else { + this.previousQ.setText(VDConstantsUtils.EMPTY); + this.previousA.setText(VDConstantsUtils.EMPTY); + } + + //handle the answer + if (this.isAnswerShown) { + //if the answer is shown, just update it if the previous button is hit + this.updateAnswer(); + } + + //do common stuff + this.doTransition(); + } + } + + private void answer() { + if (this.init) { + if (!this.isAnswerShown) { + //if the answer did not shown yet, then make it appear + this.updateAnswer(); + + this.A.grabFocus(); + } else { + //if the answer is shown, just make it disappear + this.disableAnswer(); + + this.A.grabFocus(); + } + } + } + + private void updateAnswer() { + this.standardA.setText(this.answerList.get(this.index).toString()); + + //update the border of A to signify whether the input is correct + this.updateBorder(); + + //update the sign + this.isAnswerShown = true; + } + + private void disableAnswer() { + this.standardA.setText(VDConstantsUtils.EMPTY); + + //make the border of A back to default state + this.AScrollPane.setBorder(BorderFactory.createEmptyBorder()); + + //update the sign + this.isAnswerShown = false; + } + + private boolean judgeEnglish() { + return this.answerList.get(this.index).toString().equals(this.inputList.get(this.index)); + } + + private boolean judgeChinese() { + return this.answerList.get(this.index).toString().equals(this.inputList.get(this.index)); + } + + private void updateBorder() { + if (this.selectionValues[0].equals(this.selectionValue)) { + //judge the meaning + //WIP + System.out.println("WIP"); + } else { + //judge the vocabulary + if (!this.judgeEnglish()) { + this.AScrollPane.setBorder(BorderFactory.createLineBorder(new Color(0xFE4365), 5, false)); + } else { + this.AScrollPane.setBorder(BorderFactory.createLineBorder(new Color(0x00A74A), 5, false)); + } + } + } + + private void review() { + if (this.init) { + + } + + this.review.setSize(1000, 700); + this.review.setLocation(this.parentFrame.getLocation()); + this.review.setVisible(true); + } + + private void initReviewData() { + for (int i = 0; i < this.questionList.size(); i++) { + this.review.dataPanel.addData(new ReviewData(i + 1, + this.questionList.get(i).toString(), this.answerList.get(i).toString(), + this.inputList.get(i), false)); + } + } + + private ReviewData generateReviewData() { + switch (this.selectionValue.toString()) { + case "Vocabulary - Meaning": + return new ReviewData(this.index + 1, this.questionList.get(this.index).toString(), + this.answerList.get(this.index).toString(), this.inputList.get(index), this.judgeChinese()); + case "Meaning - Vocabulary": + return new ReviewData(this.index + 1, this.questionList.get(this.index).toString(), + this.answerList.get(this.index).toString(), this.inputList.get(index), this.judgeEnglish()); + } + return null; + } + + private void doTransition() { + this.topPanel.amountDisplay.setCurrentAmount(this.index + 1); + this.A.grabFocus(); + } + + private class TextAreaKeyListener implements KeyListener { + + @Override + public void keyTyped(KeyEvent e) { + + } + + @Override + public void keyPressed(KeyEvent e) { + } + + @Override + public void keyReleased(KeyEvent e) { + if (init && !suspend) { + //单键判断: enter = 10 下箭头 = 40 上箭头 38 + switch (e.getKeyCode()) { + case 10: + case 40: + next(); + break; + case 38: + previous(); + break; + } + + //save the input every time user input a char + save(); + + //if the answer is shown, update the border of A everytime the user modify it + if (isAnswerShown) { + updateAnswer(); + } + + //set the review data + review.dataPanel.setData(review.dataPanel.allDataModel, generateReviewData(), index); + } + } + } + + private void scrollBarPolicyHandler() { + this.previousQScrollPane.setVerticalScrollBarPolicy(JScrollPane.VERTICAL_SCROLLBAR_NEVER); + this.previousAScrollPane.setVerticalScrollBarPolicy(JScrollPane.VERTICAL_SCROLLBAR_NEVER); + this.QScrollPane.setVerticalScrollBarPolicy(JScrollPane.VERTICAL_SCROLLBAR_NEVER); + this.AScrollPane.setVerticalScrollBarPolicy(JScrollPane.VERTICAL_SCROLLBAR_NEVER); + this.standardAScrollPane.setVerticalScrollBarPolicy(JScrollPane.VERTICAL_SCROLLBAR_NEVER); + } + + private class FunctionPanelLayout implements LayoutManager { + + @Override + public void layoutContainer(Container parent) { + int width = parent.getWidth(); + int height = parent.getHeight(); + int marginX = width / 100; + int marginY = height / 100; + + //previousQLabel + Dimension previousQLabelSize = previousQLabel.getPreferredSize(); + previousQLabel.setBounds(0, 0, previousQLabelSize.width, previousQLabelSize.height); + //previousQ + Dimension previousQSize = previousQScrollPane.getPreferredSize(); + previousQScrollPane.setBounds(0, previousQLabel.getY() + previousQSize.height + marginY, + previousQSize.width, previousQSize.height + 10); + + Dimension previousASize = previousAScrollPane.getPreferredSize(); + Dimension previousALabelSize = previousALabel.getPreferredSize(); + //previousA + previousAScrollPane.setBounds(previousQScrollPane.getX() + previousQSize.width + marginX, previousQScrollPane.getY(), + previousASize.width, previousQSize.height + 10); + //previousALabel + previousALabel.setBounds(previousAScrollPane.getX(), 0, + previousALabelSize.width, previousALabelSize.height); + + //QLabel + Dimension QLabelSize = QLabel.getPreferredSize(); + QLabel.setBounds(0, previousQScrollPane.getY() + previousQSize.height + marginY, + QLabelSize.width, QLabelSize.height); + //Q + Dimension QSize = QScrollPane.getPreferredSize(); + QScrollPane.setBounds(0, QLabel.getY() + QLabelSize.height + marginY, + QSize.width, QSize.height); + + //ALabel + Dimension ALabelSize = ALabel.getPreferredSize(); + ALabel.setBounds(0, QScrollPane.getY() + QSize.height + marginY, + ALabelSize.width, ALabelSize.height); + //A + Dimension ASize = AScrollPane.getPreferredSize(); + AScrollPane.setBounds(0, ALabel.getY() + ALabelSize.height + marginY, + ASize.width, ASize.height); + + //standardA + Dimension standardASize = standardAScrollPane.getPreferredSize(); + standardAScrollPane.setBounds(0, parentFrame.separator03.getY() - standardASize.height - marginY - 70, + standardASize.width, standardASize.height); + //standardALabel + Dimension standardALabelSize = standardALabel.getPreferredSize(); + standardALabel.setBounds(0, standardAScrollPane.getY() - standardALabelSize.height - marginY, + standardALabelSize.width, standardALabelSize.height); + + //nextButton + Dimension nextButtonSize = nextButton.getPreferredSize(); + nextButton.setBounds(width - nextButtonSize.width - marginX * 4, + height - nextButtonSize.height - marginY * 3, + nextButtonSize.width, nextButtonSize.height); + //previousButton + Dimension previousButtonSize = previousButton.getPreferredSize(); + previousButton.setBounds(width - (width - nextButton.getX()) - previousButtonSize.width - marginX, nextButton.getY(), + previousButtonSize.width, previousButtonSize.height); + //answerButton + Dimension answerButtonSize = answerButton.getPreferredSize(); + answerButton.setBounds(width - (width - previousButton.getX()) - answerButtonSize.width - marginX, nextButton.getY(), + answerButtonSize.width, answerButtonSize.height); + //reviewButton + Dimension reviewButtonSize = reviewButton.getPreferredSize(); + reviewButton.setBounds(0, nextButton.getY(), reviewButtonSize.width, reviewButtonSize.height); + } + + @Override + public void addLayoutComponent(String name, Component comp) { + + } + + @Override + public void removeLayoutComponent(Component comp) { + + } + + @Override + public Dimension preferredLayoutSize(Container parent) { + return null; + } + + @Override + public Dimension minimumLayoutSize(Container parent) { + return null; + } + } +} \ No newline at end of file diff --git a/src/main/java/xyz/scottc/frames/commonModeFrame/component/LeftPanel.java b/src/main/java/xyz/scottc/frames/commonModeFrame/component/LeftPanel.java new file mode 100644 index 0000000..f46a99b --- /dev/null +++ b/src/main/java/xyz/scottc/frames/commonModeFrame/component/LeftPanel.java @@ -0,0 +1,242 @@ +package xyz.scottc.frames.commonModeFrame.component; + +import xyz.scottc.frames.commonModeFrame.CommonModeFrame; +import org.json.JSONObject; +import xyz.scottc.frames.mainFrame.MainFrame; +import xyz.scottc.utils.*; + +import javax.swing.*; +import javax.swing.filechooser.FileNameExtensionFilter; +import java.awt.*; +import java.awt.event.MouseAdapter; +import java.awt.event.MouseEvent; +import java.io.File; +import java.io.InputStream; +import java.io.UnsupportedEncodingException; +import java.net.URLDecoder; +import java.util.ArrayList; +import java.util.List; +import java.util.jar.JarFile; + +public class LeftPanel extends UtilJPanel { + + private final CommonModeFrame parentFrame; + private final FunctionPanel functionPanel; + private final TopPanel topPanel; + + private final UtilJButton importButton = new UtilJButton("Import", 20); + private final UtilJButton exportButton = new UtilJButton("Export", 20); + private final UtilJLabel internalFileListLabel = new UtilJLabel("Internal Vocab List", + new Font("微软雅黑", Font.BOLD, 24)); + private final DefaultListModel internalFileListModel = new DefaultListModel<>(); + private final JList internalFileList = new JList<>(this.internalFileListModel); + private final JScrollPane internalFileListScrollPane = new JScrollPane(this.internalFileList); + private final UtilJLabel externalFileListLabel = new UtilJLabel("External Vocab List", + new Font("微软雅黑", Font.BOLD, 24)); + private final DefaultListModel externalFileListModel = new DefaultListModel<>(); + private final JList externalFileList = new JList<>(this.externalFileListModel); + private final JScrollPane externalFileListScrollPane = new JScrollPane(this.externalFileList); + private final UtilJButton backButton = new UtilJButton("Go Back", 45); + + private File internalLibrary; + + private final List internalVocabularyPool = new ArrayList<>(); + private final List externalVocabularyPool = new ArrayList<>(); + + public LeftPanel(CommonModeFrame parent, FunctionPanel functionPanel, TopPanel topPanel) { + this.parentFrame = parent; + this.functionPanel = functionPanel; + this.topPanel = topPanel; + this.setLayout(new CommonModeTopPanelLayout()); + + this.add(this.importButton); + this.importButton.addActionListener(e -> this.importFile()); + this.add(this.exportButton); + + this.add(this.internalFileListLabel); + this.add(this.internalFileListScrollPane); + this.internalFileList.setFont(VDConstantsUtils.MICROSOFT_YAHEI_PLAIN_20); + this.internalFileList.setSelectionMode(ListSelectionModel.SINGLE_SELECTION); + this.internalFileList.addMouseListener(new MouseAdapter() { + @Override + public void mouseClicked(MouseEvent e) { + loadSelectedList(e, internalFileList, (ArrayList) internalVocabularyPool); + } + }); + this.addInternalVocabularyPool(); + + this.add(this.externalFileListLabel); + this.add(this.externalFileListScrollPane); + this.externalFileList.setFont(VDConstantsUtils.MICROSOFT_YAHEI_PLAIN_20); + this.externalFileList.setSelectionMode(ListSelectionModel.SINGLE_SELECTION); + this.externalFileList.addMouseListener(new MouseAdapter() { + @Override + public void mouseClicked(MouseEvent e) { + loadSelectedList(e, externalFileList, (ArrayList) externalVocabularyPool); + } + }); + this.addExternalVocabularyPool(); + + //backButton + this.add(this.backButton); + this.backButton.addActionListener(e -> this.goBackToMainFrame()); + } + + private void loadSelectedList(MouseEvent event, JList jList, ArrayList fileList) { + if (!this.functionPanel.init) { + if (event.getClickCount() == 2) { + if (event.getSource() instanceof JList) { + int index = jList.locationToIndex(event.getPoint()); + File file = fileList.get(index); + try { + JSONObject jsonObject = (JSONObject) JSONUtils.fromFile(file, "UTF-8"); + this.functionPanel.questionList = jsonObject.getJSONArray("questions").toList(); + this.functionPanel.answerList = jsonObject.getJSONArray("answers").toList(); + this.topPanel.amountDisplay.setTotalAmount(this.functionPanel.questionList.size()); + this.functionPanel.isListLoaded = true; + JOptionPane.showConfirmDialog(parentFrame, "Successfully load the list! Please click \"start\" to start studying!", + "Congratulation", JOptionPane.DEFAULT_OPTION, JOptionPane.INFORMATION_MESSAGE); + } catch (Exception e) { + e.printStackTrace(); + } + } + } + } else { + VDConstantsUtils.showWarningMessage(this.parentFrame, "Please stop the current list and then start a new one!"); + } + } + + private void importFile() { + JFileChooser fileChooser = new JFileChooser(); + fileChooser.setFileSelectionMode(JFileChooser.FILES_ONLY); + fileChooser.setFileFilter(new FileNameExtensionFilter("JSON File", "json")); + int result = fileChooser.showOpenDialog(this); + if (result == JFileChooser.APPROVE_OPTION) { + File file = fileChooser.getSelectedFile(); + FileUtils.copyFile(file, MainFrame.externalLibrary); + this.addExternalVocabularyPool(); + } + } + + private void addExternalVocabularyPool() { + this.externalVocabularyPool.clear(); + this.externalFileListModel.clear(); + File[] files = MainFrame.externalLibrary.listFiles(); + if (files != null && files.length != 0) { + for (File file : files) { + this.externalVocabularyPool.add(file); + this.externalFileListModel.addElement(file.getName()); + } + } + } + + private void addInternalVocabularyPool() { +/* File directory = FileUtils.getDirectoryFile(this); + File[] files = directory.listFiles(); + this.internalLibrary = new File(directory.getAbsolutePath() + "/InternalLibrary"); + boolean isInternalLibraryExist = false; + for (File file : files) { + if (file.isDirectory() && "InternalLibrary".equals(file.getName())) { + isInternalLibraryExist = true; + } + } + if (!isInternalLibraryExist) { + boolean success = internalLibrary.mkdir(); + }*/ + try { + this.internalVocabularyPool.clear(); + this.internalFileListModel.clear(); + String path = this.getClass().getResource("/xyz/scottc/internalVocabPool").getPath(); + System.out.println(path); + //this.getClass().getResourceAsStream("/xyz/scottc/internalVocabPool"); + path = URLDecoder.decode(path, "UTF-8"); + File directory = new File(path); + File[] files = directory.listFiles(); + if (files != null && files.length != 0) { + for (File file : files) { + this.internalVocabularyPool.add(file); + this.internalFileListModel.addElement(file.getName()); + } + } + } catch (UnsupportedEncodingException e) { + e.printStackTrace(); + } + } + + private void goBackToMainFrame() { + this.parentFrame.dispose(); + MainFrame frame = new MainFrame("Vocabulary Decoder"); + frame.setLocation(this.parentFrame.getLocation()); + frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); + frame.setSize(new Dimension(1000, 1000)); + frame.setVisible(true); + } + + private class CommonModeTopPanelLayout implements LayoutManager { + + @Override + public void layoutContainer(Container parent) { + int width = parent.getWidth(); + int height = parent.getHeight(); + int marginX = width / 100; + int marginY = height / 100; + + Dimension exportButtonSize = exportButton.getPreferredSize(); + Dimension importButtonSize = importButton.getPreferredSize(); + int widthSum01 = exportButtonSize.width + importButtonSize.width + marginX; + //importButton + importButton.setBounds((parentFrame.separator02.getX() - widthSum01 ) / 2 - 10, 0, importButtonSize.width, importButtonSize.height); + //exportButton + exportButton.setBounds(importButton.getX() + importButtonSize.width + marginX, 0, + exportButtonSize.width, exportButtonSize.height); + + //choseFileLabel + Dimension choseFileLabelSize = internalFileListLabel.getPreferredSize(); + internalFileListLabel.setBounds((parentFrame.separator02.getX() - choseFileLabelSize.width) / 2 - 10, exportButton.getY() + exportButtonSize.height + marginY * 2 + 1, + choseFileLabelSize.width, choseFileLabelSize.height); + //internalFileListScrollPane + Dimension internalFileListScrollPaneSize = new Dimension(parentFrame.separator02.getX() - marginX * 2 - 20, + (parentFrame.separator03.getY() - parentFrame.separator01.getY()) / 2 - marginY * 2 - choseFileLabelSize.height - 5); + internalFileListScrollPane.setBounds((parentFrame.separator02.getX() - internalFileListScrollPaneSize.width) / 2 - 10, + internalFileListLabel.getY() + choseFileLabelSize.height + marginY, + internalFileListScrollPaneSize.width, internalFileListScrollPaneSize.height); + + //externalFileListLabel + Dimension externalFileListLabelSize = externalFileListLabel.getPreferredSize(); + externalFileListLabel.setBounds((parentFrame.separator02.getX() - externalFileListLabelSize.width) / 2 - 10, + (parentFrame.separator03.getY() - parentFrame.separator01.getY()) / 2 + marginY + 40, + externalFileListLabelSize.width, externalFileListLabelSize.height); + //externalFileListScrollPane + Dimension externalFileListScrollPaneSize = new Dimension(parentFrame.separator02.getX() - marginX * 2 - 20, + (parentFrame.separator03.getY() - parentFrame.separator01.getY()) / 2 - marginY - choseFileLabelSize.height - 10); + externalFileListScrollPane.setBounds((parentFrame.separator02.getX() - externalFileListScrollPaneSize.width) / 2 - 10, + externalFileListLabel.getY() + externalFileListLabelSize.height + marginY, + externalFileListScrollPaneSize.width, externalFileListScrollPaneSize.height); + + //backButton + Dimension backButtonSize = backButton.getPreferredSize(); + backButton.setBounds((parentFrame.separator02.getX() - backButtonSize.width) / 2 - 10, height - backButtonSize.height - marginY, + backButtonSize.width, backButtonSize.height); + } + + @Override + public void addLayoutComponent(String name, Component comp) { + + } + + @Override + public void removeLayoutComponent(Component comp) { + + } + + @Override + public Dimension preferredLayoutSize(Container parent) { + return null; + } + + @Override + public Dimension minimumLayoutSize(Container parent) { + return null; + } + } +} diff --git a/src/main/java/xyz/scottc/frames/commonModeFrame/component/TopPanel.java b/src/main/java/xyz/scottc/frames/commonModeFrame/component/TopPanel.java new file mode 100644 index 0000000..36dabe7 --- /dev/null +++ b/src/main/java/xyz/scottc/frames/commonModeFrame/component/TopPanel.java @@ -0,0 +1,91 @@ +package xyz.scottc.frames.commonModeFrame.component; + +import xyz.scottc.frames.commonModeFrame.CommonModeFrame; +import xyz.scottc.utils.*; + +import java.awt.*; + +public class TopPanel extends UtilJPanel { + + private final CommonModeFrame parentFrame; + + public final UtilJButton startButton = new UtilJButton("Start", 25); + public final UtilJButton stopButton = new UtilJButton("Stop", 25); + public final UtilJButton suspendButton = new UtilJButton("Suspend", 25); + public final UtilJButton continueButton = new UtilJButton("Continue", 25); + + public final VDAmountDisplay amountDisplay = new VDAmountDisplay(new Font("微软雅黑", Font.PLAIN, 23)); + public final VDTimer timer = new VDTimer(); + + public TopPanel(CommonModeFrame parent) { + this.parentFrame = parent; + this.setLayout(new TopPanelLayout()); + + this.add(this.startButton); + this.add(this.stopButton); + this.add(this.suspendButton); + this.add(this.continueButton); + this.add(this.amountDisplay); + this.add(this.timer); + } + + private class TopPanelLayout implements LayoutManager { + + @Override + public void layoutContainer(Container parent) { + int width = parent.getWidth(); + int marginX = width / 100; + + //startButton + Dimension startButtonSize = startButton.getPreferredSize(); + startButton.setBounds(0, 0, startButtonSize.width, startButtonSize.height); + + //stopButton + Dimension stopButtonSize = stopButton.getPreferredSize(); + stopButton.setBounds(startButton.getX() + startButtonSize.width + marginX, 0, + stopButtonSize.width, stopButtonSize.height); + + //suspendButton + Dimension suspendButtonSize = suspendButton.getPreferredSize(); + suspendButton.setBounds(stopButton.getX() + stopButtonSize.width + marginX, 0, + suspendButtonSize.width, suspendButtonSize.height); + + //continueButton + Dimension continueButtonSize = continueButton.getPreferredSize(); + continueButton.setBounds(suspendButton.getX() + suspendButtonSize.width + marginX, 0, + continueButtonSize.width, continueButtonSize.height); + + //timer + int panelHeight = parentFrame.separator01.getY(); + Dimension timerSize = timer.getPreferredSize(); + timer.setBounds(width - marginX * 4 - timerSize.width, (panelHeight - timerSize.height) / 2, + timerSize.width, timerSize.height); + + //amountDisplay + Dimension amountDisplaySize = amountDisplay.getPreferredSize(); + amountDisplay.setBounds(continueButton.getX() + continueButtonSize.width + (timer.getX() - continueButton.getX() - continueButtonSize.width - amountDisplaySize.width) / 2, + timer.getY(), + amountDisplaySize.width, amountDisplaySize.height); + } + + @Override + public void addLayoutComponent(String name, Component comp) { + + } + + @Override + public void removeLayoutComponent(Component comp) { + + } + + @Override + public Dimension preferredLayoutSize(Container parent) { + return null; + } + + @Override + public Dimension minimumLayoutSize(Container parent) { + return null; + } + } +} diff --git a/src/main/java/xyz/scottc/frames/commonModeFrame/dialog/review/DataPanel.java b/src/main/java/xyz/scottc/frames/commonModeFrame/dialog/review/DataPanel.java new file mode 100644 index 0000000..1d10337 --- /dev/null +++ b/src/main/java/xyz/scottc/frames/commonModeFrame/dialog/review/DataPanel.java @@ -0,0 +1,122 @@ +package xyz.scottc.frames.commonModeFrame.dialog.review; + +import xyz.scottc.frames.commonModeFrame.dialog.review.cellRenderers.CorrectCellRenderer; +import xyz.scottc.frames.commonModeFrame.dialog.review.cellRenderers.NumCellRenderer; +import xyz.scottc.frames.commonModeFrame.dialog.review.cellRenderers.UniversalCellRenderer; +import xyz.scottc.utils.AfColumnLayout; +import xyz.scottc.utils.UtilJPanel; +import xyz.scottc.utils.VDConstantsUtils; + +import javax.swing.*; +import javax.swing.table.DefaultTableModel; +import java.util.ArrayList; +import java.util.Vector; + +public class DataPanel extends UtilJPanel { + public final DefaultTableModel allDataModel = new DefaultTableModel(); + public final DefaultTableModel incorrectDataModel = new DefaultTableModel(); + public final JTable reviewTable = new JTable(this.allDataModel) { + @Override + public boolean isCellEditable(int row, int column) { + return false; + } + }; + public final JScrollPane reviewScrollPane = new JScrollPane(this.reviewTable); + + public ArrayList allDataList = new ArrayList<>(); + + public DataPanel() { + this.setLayout(new AfColumnLayout()); + this.add(this.reviewScrollPane, "1w"); + + this.reviewTable.setFillsViewportHeight(true); + this.reviewTable.setRowSelectionAllowed(true); + this.reviewTable.setColumnSelectionAllowed(false); + this.reviewTable.setDragEnabled(false); + this.reviewTable.setRowHeight(40); + + //set the property of table header + this.reviewTable.getTableHeader().setFont(VDConstantsUtils.MICROSOFT_YAHEI_PLAIN_20); + + //All data model initialization + this.allDataModel.addColumn("#"); + this.allDataModel.addColumn("Questions"); + this.allDataModel.addColumn("Standard Answers"); + this.allDataModel.addColumn("Your Answers"); + this.allDataModel.addColumn("Correct?"); + + //Incorrect data model initialization + this.incorrectDataModel.addColumn("#"); + this.incorrectDataModel.addColumn("Questions"); + this.incorrectDataModel.addColumn("Standard Answers"); + this.incorrectDataModel.addColumn("Your Answers"); + this.incorrectDataModel.addColumn("Correct?"); + + this.addRenderers(); + } + + public void addData(ReviewData... data) { + for (ReviewData datum : data) { + Vector dataList = new Vector<>(); + dataList.add(datum.getSerialNumber()); + dataList.add(datum.getQuestion()); + dataList.add(datum.getAnswer()); + dataList.add(datum.getInput()); + dataList.add(datum.isCorrect()); + this.allDataModel.addRow(dataList); + allDataList.add(datum); + } + } + + private void addIncorrectData(ReviewData... incorrectData) { + for (ReviewData datum : incorrectData) { + Vector dataList = new Vector<>(); + dataList.add(datum.getSerialNumber()); + dataList.add(datum.getQuestion()); + dataList.add(datum.getAnswer()); + dataList.add(datum.getInput()); + dataList.add(datum.isCorrect()); + this.incorrectDataModel.addRow(dataList); + } + } + + public void setData(DefaultTableModel dataModel, ReviewData data, int row) { + dataModel.setValueAt(data.getSerialNumber(), row, 0); + dataModel.setValueAt(data.getQuestion(), row, 1); + dataModel.setValueAt(data.getAnswer(), row, 2); + dataModel.setValueAt(data.getInput(), row, 3); + dataModel.setValueAt(data.isCorrect(), row, 4); + allDataList.set(row, data); + } + + public void incorrectDataHandler() { + this.clearIncorrectDataModel(); + for (ReviewData datum : this.allDataList) { + if (!datum.isCorrect()) { + this.addIncorrectData(datum); + } + } + } + + public void addRenderers() { + this.reviewTable.getColumnModel().getColumn(0).setCellRenderer(new NumCellRenderer()); + this.reviewTable.getColumnModel().getColumn(1).setCellRenderer(new UniversalCellRenderer()); + this.reviewTable.getColumnModel().getColumn(2).setCellRenderer(new UniversalCellRenderer()); + this.reviewTable.getColumnModel().getColumn(3).setCellRenderer(new UniversalCellRenderer()); + this.reviewTable.getColumnModel().getColumn(4).setCellRenderer(new CorrectCellRenderer()); + } + + private void clearIncorrectDataModel() { + for (int i = this.incorrectDataModel.getRowCount(); i > 0; i--) { + this.incorrectDataModel.removeRow(i - 1); + } + } + + public void clear() { + this.allDataList.clear(); + for (int i = this.allDataModel.getRowCount(); i > 0; i--) { + this.allDataModel.removeRow(i - 1); + } + this.clearIncorrectDataModel(); + } +} diff --git a/src/main/java/xyz/scottc/frames/commonModeFrame/dialog/review/Review.java b/src/main/java/xyz/scottc/frames/commonModeFrame/dialog/review/Review.java new file mode 100644 index 0000000..34a08be --- /dev/null +++ b/src/main/java/xyz/scottc/frames/commonModeFrame/dialog/review/Review.java @@ -0,0 +1,45 @@ +package xyz.scottc.frames.commonModeFrame.dialog.review; + + +import xyz.scottc.utils.AfColumnLayout; +import xyz.scottc.utils.UtilJPanel; +import xyz.scottc.utils.VDConstantsUtils; + +import javax.swing.*; +import java.awt.*; + +public class Review extends JDialog { + + private final UtilJPanel rootPanel = new UtilJPanel(new CardLayout()); + public final DataPanel dataPanel = new DataPanel(); + + private final JComboBox comboBox = new JComboBox<>(); + + public Review(Frame owner) { + super(owner, "Review", false); + this.setLayout(new AfColumnLayout()); + + this.add(this.comboBox, "50px"); + this.comboBox.setFont(VDConstantsUtils.MICROSOFT_YAHEI_BOLD_30); + this.comboBox.addItem("All Vocabulary List"); + this.comboBox.addItem("Incorrect Vocabulary List"); + this.comboBox.addActionListener(e -> this.choosePanel()); + + this.add(this.rootPanel, "1w"); + this.rootPanel.add(this.dataPanel, "dataPanel"); + } + + private void choosePanel() { + CardLayout cardLayout = (CardLayout) rootPanel.getLayout(); + switch (this.comboBox.getSelectedItem().toString()) { + case "All Vocabulary List": + this.dataPanel.reviewTable.setModel(this.dataPanel.allDataModel); + this.dataPanel.addRenderers(); + cardLayout.show(rootPanel, "dataPanel"); + break; + case "Incorrect Vocabulary List": + this.dataPanel.reviewTable.setModel(this.dataPanel.incorrectDataModel); + this.dataPanel.addRenderers(); + } + } +} diff --git a/src/main/java/xyz/scottc/frames/commonModeFrame/dialog/review/ReviewData.java b/src/main/java/xyz/scottc/frames/commonModeFrame/dialog/review/ReviewData.java new file mode 100644 index 0000000..0b6d9a0 --- /dev/null +++ b/src/main/java/xyz/scottc/frames/commonModeFrame/dialog/review/ReviewData.java @@ -0,0 +1,61 @@ +package xyz.scottc.frames.commonModeFrame.dialog.review; + +public class ReviewData { + + private int serialNumber; + private String question; + private String answer; + private String input; + private boolean correct; + + public ReviewData() { + } + + public ReviewData(int serialNumber, String question, String answer, String input, boolean correct) { + this.serialNumber = serialNumber; + this.question = question; + this.answer = answer; + this.input = input; + this.correct = correct; + } + + public int getSerialNumber() { + return serialNumber; + } + + public void setSerialNumber(int serialNumber) { + this.serialNumber = serialNumber; + } + + public String getQuestion() { + return question; + } + + public void setQuestion(String question) { + this.question = question; + } + + public String getAnswer() { + return answer; + } + + public void setAnswer(String answer) { + this.answer = answer; + } + + public String getInput() { + return input; + } + + public void setInput(String input) { + this.input = input; + } + + public boolean isCorrect() { + return correct; + } + + public void setCorrect(boolean correct) { + this.correct = correct; + } +} diff --git a/src/main/java/xyz/scottc/frames/commonModeFrame/dialog/review/cellRenderers/CorrectCellRenderer.java b/src/main/java/xyz/scottc/frames/commonModeFrame/dialog/review/cellRenderers/CorrectCellRenderer.java new file mode 100644 index 0000000..f1bbd4c --- /dev/null +++ b/src/main/java/xyz/scottc/frames/commonModeFrame/dialog/review/cellRenderers/CorrectCellRenderer.java @@ -0,0 +1,35 @@ +package xyz.scottc.frames.commonModeFrame.dialog.review.cellRenderers; + +import javax.swing.*; +import java.awt.*; + +public class CorrectCellRenderer extends UniversalCellRenderer{ + + @Override + public Component getTableCellRendererComponent(JTable table, Object value, boolean isSelected, boolean hasFocus, int row, int column) { + super.getTableCellRendererComponent(table, value, isSelected, hasFocus, row, column); + boolean correct = (boolean) value; + if (hasFocus) { + if (correct) { + this.label.setText("Correct"); + this.setBorder(BorderFactory.createCompoundBorder(BorderFactory.createLoweredBevelBorder(), + BorderFactory.createMatteBorder(2, 0, 2, 2, new Color(0x00A74A)))); + } else { + this.label.setText("Incorrect"); + this.setBorder(BorderFactory.createCompoundBorder(BorderFactory.createLoweredBevelBorder(), + BorderFactory.createMatteBorder(2, 0, 2, 2, new Color(0xFE4365)))); + } + } else { + if (correct) { + this.label.setText("Correct"); + this.setBorder(BorderFactory.createCompoundBorder(BorderFactory.createRaisedBevelBorder(), + BorderFactory.createMatteBorder(2, 0, 2, 2, new Color(0x00A74A)))); + } else { + this.label.setText("Incorrect"); + this.setBorder(BorderFactory.createCompoundBorder(BorderFactory.createRaisedBevelBorder(), + BorderFactory.createMatteBorder(2, 0, 2, 2, new Color(0xFE4365)))); + } + } + return this; + } +} diff --git a/src/main/java/xyz/scottc/frames/commonModeFrame/dialog/review/cellRenderers/NumCellRenderer.java b/src/main/java/xyz/scottc/frames/commonModeFrame/dialog/review/cellRenderers/NumCellRenderer.java new file mode 100644 index 0000000..c9ad029 --- /dev/null +++ b/src/main/java/xyz/scottc/frames/commonModeFrame/dialog/review/cellRenderers/NumCellRenderer.java @@ -0,0 +1,33 @@ +package xyz.scottc.frames.commonModeFrame.dialog.review.cellRenderers; + +import javax.swing.*; +import java.awt.*; + +public class NumCellRenderer extends UniversalCellRenderer{ + + @Override + public Component getTableCellRendererComponent(JTable table, Object value, boolean isSelected, + boolean hasFocus, int row, int column) { + super.getTableCellRendererComponent(table, value, isSelected, hasFocus, row, column); + + boolean correct = (boolean) table.getValueAt(row, 4); + if (hasFocus) { + if (correct) { + this.setBorder(BorderFactory.createCompoundBorder(BorderFactory.createLoweredBevelBorder(), + BorderFactory.createMatteBorder(2, 2, 2, 0, new Color(0x00A74A)))); + } else { + this.setBorder(BorderFactory.createCompoundBorder(BorderFactory.createLoweredBevelBorder(), + BorderFactory.createMatteBorder(2, 2, 2, 0, new Color(0xFE4365)))); + } + } else { + if (correct) { + this.setBorder(BorderFactory.createCompoundBorder(BorderFactory.createRaisedBevelBorder(), + BorderFactory.createMatteBorder(2, 2, 2, 0, new Color(0x00A74A)))); + } else { + this.setBorder(BorderFactory.createCompoundBorder(BorderFactory.createRaisedBevelBorder(), + BorderFactory.createMatteBorder(2, 2, 2, 0, new Color(0xFE4365)))); + } + } + return this; + } +} diff --git a/src/main/java/xyz/scottc/frames/commonModeFrame/dialog/review/cellRenderers/UniversalCellRenderer.java b/src/main/java/xyz/scottc/frames/commonModeFrame/dialog/review/cellRenderers/UniversalCellRenderer.java new file mode 100644 index 0000000..adf6299 --- /dev/null +++ b/src/main/java/xyz/scottc/frames/commonModeFrame/dialog/review/cellRenderers/UniversalCellRenderer.java @@ -0,0 +1,56 @@ +package xyz.scottc.frames.commonModeFrame.dialog.review.cellRenderers; + +import xyz.scottc.utils.UtilJLabel; +import xyz.scottc.utils.UtilJPanel; +import xyz.scottc.utils.VDConstantsUtils; + +import javax.swing.*; +import javax.swing.table.TableCellRenderer; +import java.awt.*; + +public class UniversalCellRenderer extends UtilJPanel implements TableCellRenderer { + + public UtilJLabel label = new UtilJLabel(VDConstantsUtils.MICROSOFT_YAHEI_PLAIN_20); + + public UniversalCellRenderer() { + this.add(label, BorderLayout.CENTER); + this.label.setHorizontalAlignment(UtilJLabel.CENTER); + this.label.setVerticalAlignment(UtilJLabel.CENTER); + } + + @Override + public Component getTableCellRendererComponent(JTable table, Object value, boolean isSelected, + boolean hasFocus, int row, int column) { + + this.label.setText(value.toString()); + + this.setOpaque(true); + if (isSelected) { + this.setBackground(table.getSelectionBackground()); + this.setForeground(table.getSelectionForeground()); + } else { + this.setBackground(table.getBackground()); + this.setForeground(table.getForeground()); + } + + boolean correct = (boolean) table.getValueAt(row, 4); + if (hasFocus) { + if (correct) { + this.setBorder(BorderFactory.createCompoundBorder(BorderFactory.createLoweredBevelBorder(), + BorderFactory.createMatteBorder(2, 0, 2, 0, new Color(0x00A74A)))); + } else { + this.setBorder(BorderFactory.createCompoundBorder(BorderFactory.createLoweredBevelBorder(), + BorderFactory.createMatteBorder(2, 0, 2, 0, new Color(0xFE4365)))); + } + } else { + if (correct) { + this.setBorder(BorderFactory.createCompoundBorder(BorderFactory.createRaisedBevelBorder(), + BorderFactory.createMatteBorder(2, 0, 2, 0, new Color(0x00A74A)))); + } else { + this.setBorder(BorderFactory.createCompoundBorder(BorderFactory.createRaisedBevelBorder(), + BorderFactory.createMatteBorder(2, 0, 2, 0, new Color(0xFE4365)))); + } + } + return this; + } +} diff --git a/src/main/java/xyz/scottc/frames/mainFrame/MainFrame.java b/src/main/java/xyz/scottc/frames/mainFrame/MainFrame.java new file mode 100644 index 0000000..d6bd148 --- /dev/null +++ b/src/main/java/xyz/scottc/frames/mainFrame/MainFrame.java @@ -0,0 +1,159 @@ +package xyz.scottc.frames.mainFrame; + +import xyz.scottc.frames.mainFrame.component.ModeSelectionPanel; +import xyz.scottc.frames.mainFrame.dialog.CreateVDFileByInputDialog; +import xyz.scottc.frames.mainFrame.dialog.CreateVDFileByTXTDialog; +import xyz.scottc.utils.*; + +import javax.swing.*; +import java.awt.*; +import java.awt.event.ActionListener; +import java.io.File; + +public class MainFrame extends JFrame { + + private final UtilJPanel rootPanel = new UtilJPanel(new MainFrameLayout()); + + private final JMenuBar menuBar = new JMenuBar(); + private final VDMenu toolMenu = new VDMenu("Tools"); + private final VDMenuItem txtToJson = new VDMenuItem("Create VD File by txt"); + private final VDMenuItem inputToJson = new VDMenuItem("Create VD File by Input"); + + private final UtilJLabel nameLabel = new UtilJLabel("Vocabulary Decoder", VDConstantsUtils.MICROSOFT_YAHEI_BOLD_40); + private final UtilJLabel infoLabel = new UtilJLabel("A tool means for helping people memorize vocabularies more effectively.", + VDConstantsUtils.MICROSOFT_YAHEI_PLAIN_20); + private final LineSeparator separator01 = new LineSeparator(LineSeparator.HORIZONTAL, Integer.MAX_VALUE); + private final LineSeparator separator02 = new LineSeparator(LineSeparator.VERTICAL, 10000); + private final VDTextArea aboutLabel = new VDTextArea("Author: ScottC\nEmail: ScottCTD@outlook.com", 0, 0, VDConstantsUtils.MICROSOFT_YAHEI_PLAIN_20, false, false); + private final ModeSelectionPanel modeSelectionPanel = new ModeSelectionPanel(this); + public final CreateVDFileByTXTDialog createVDFileByTXTDialog = new CreateVDFileByTXTDialog(this, + "Create valid vocabulary list file", false); + private final CreateVDFileByInputDialog createVDFileByInputDialog = new CreateVDFileByInputDialog(this); + + public boolean isExternalLibraryExist = false; + public static File externalLibrary; + + public MainFrame(String title) throws HeadlessException { + super(title); + this.initialize(); + this.setContentPane(this.rootPanel); + this.setJMenuBar(this.menuBar); + this.menuBarHandler(); + this.rootPanelHandler(); + } + + private void rootPanelHandler() { + //NameLabel + this.rootPanel.add(this.nameLabel); + + //infoLabel + this.rootPanel.add(this.infoLabel); + + //Separator01 + this.rootPanel.add(separator01); + + //aboutLabel + this.rootPanel.add(this.aboutLabel); + this.aboutLabel.setBackground(this.rootPanel.getBackground()); + this.aboutLabel.setEnabled(false); + + //Separator02 + this.rootPanel.add(separator02); + + //modeSelectionPanel + this.rootPanel.add(this.modeSelectionPanel); + } + + private void menuBarHandler() { + this.menuBar.add(this.toolMenu); + + this.toolMenu.add(this.txtToJson); + this.txtToJson.addActionListener(this.txtToJsonListener); + this.toolMenu.add(this.inputToJson); + this.inputToJson.addActionListener(this.inputToJsonListener); + } + + private void initialize() { + File directory = FileUtils.getDirectoryFile(this); + File[] files = directory.listFiles(); + externalLibrary = new File(directory.getAbsolutePath() + "/ExternalLibrary"); + for (File file : files) { + if (file.isDirectory() && "ExternalLibrary".equals(file.getName())) { + this.isExternalLibraryExist = true; + } + } + if (!this.isExternalLibraryExist) { + boolean success = externalLibrary.mkdir(); + } + } + + private final ActionListener txtToJsonListener = e -> { + Point pos = this.getLocation(); + this.createVDFileByTXTDialog.setSize(690, 350); + this.createVDFileByTXTDialog.setLocation(pos.x + (this.getWidth() - createVDFileByTXTDialog.getWidth()) / 2, + pos.y + (this.getHeight() - createVDFileByTXTDialog.getHeight()) / 2); + this.createVDFileByTXTDialog.setVisible(true); + }; + + private final ActionListener inputToJsonListener = e -> { + Point pos = this.getLocation(); + this.createVDFileByInputDialog.setSize(1000, 1000); + this.createVDFileByInputDialog.setLocation(pos); + this.createVDFileByInputDialog.setVisible(true); + }; + + private class MainFrameLayout implements LayoutManager{ + + @Override + public void layoutContainer(Container parent) { + int width = parent.getWidth(); + int height = parent.getHeight(); + int marginX = width / 100; + int marginY = height / 100; + + //nameLabel + Dimension nameLabelSize = nameLabel.getPreferredSize(); + nameLabel.setBounds((width - nameLabelSize.width) / 2, marginY, + nameLabelSize.width, nameLabelSize.height); + //infoLabel + Dimension infoLabelSize = infoLabel.getPreferredSize(); + infoLabel.setBounds((width - infoLabelSize.width) / 2, nameLabel.getY() + nameLabelSize.height + marginY, + infoLabelSize.width, infoLabelSize.height); + //separator01 + separator01.setBounds(0, infoLabel.getY() + infoLabelSize.height + marginY, + width, 1); + //aboutLabel + Dimension aboutLabelSize = aboutLabel.getPreferredSize(); + aboutLabel.setBounds(width - aboutLabelSize.width - marginX, separator01.getY() + marginY, + aboutLabelSize.width, aboutLabelSize.height); + //separator02 + separator02.setBounds(aboutLabel.getX() - marginX, separator01.getY(), + 1, height); + //modeSelectionPanel + Dimension modeSelectionPanelSize = new Dimension(width - marginX * 4 - aboutLabelSize.width - 1, + height - marginY * 5 - nameLabelSize.height - infoLabelSize.height - 1); + modeSelectionPanel.setBounds(marginX, separator01.getY() + marginY, + modeSelectionPanelSize.width, modeSelectionPanelSize.height); + } + + @Override + public void addLayoutComponent(String name, Component comp) { + + } + + @Override + public void removeLayoutComponent(Component comp) { + + } + + @Override + public Dimension preferredLayoutSize(Container parent) { + return null; + } + + @Override + public Dimension minimumLayoutSize(Container parent) { + return null; + } + } +} diff --git a/src/main/java/xyz/scottc/frames/mainFrame/component/ModeSelectionPanel.java b/src/main/java/xyz/scottc/frames/mainFrame/component/ModeSelectionPanel.java new file mode 100644 index 0000000..6012c5f --- /dev/null +++ b/src/main/java/xyz/scottc/frames/mainFrame/component/ModeSelectionPanel.java @@ -0,0 +1,115 @@ +package xyz.scottc.frames.mainFrame.component; + +import xyz.scottc.frames.commonModeFrame.CommonModeFrame; +import xyz.scottc.frames.mainFrame.MainFrame; +import xyz.scottc.utils.*; + +import javax.swing.*; +import java.awt.*; + +public class ModeSelectionPanel extends UtilJPanel { + + private final MainFrame parent; + + private final UtilJLabel modeSelectionLabel = new UtilJLabel("Mode Selection", VDConstantsUtils.MICROSOFT_YAHEI_BOLD_40); + private final DefaultListModel modeListModel = new DefaultListModel<>(); + private final JList modeList = new JList<>(); + private final JScrollPane modeListScrollPane = new JScrollPane(modeList); + private final UtilJButton confirmButton = new UtilJButton("Confirm", 40); + private final VDTextArea help = new VDTextArea(VDConstantsUtils.HELP, 0, 0, VDConstantsUtils.MICROSOFT_YAHEI_PLAIN_20, false, false); + + public ModeSelectionPanel(MainFrame parent) { + this.setLayout(new ModeSelectionPanelLayout()); + this.parent = parent; + + //modeSelectionLabel + this.add(this.modeSelectionLabel); + + //init modeListModel + this.modeListModel.addElement("1. Common Mode "); + + //modeList + this.modeList.setModel(this.modeListModel); + this.add(this.modeListScrollPane); + modeList.setFont(new Font("微软雅黑", Font.PLAIN, 30)); + this.modeList.grabFocus(); + + //confirmButton + this.add(this.confirmButton); + this.confirmButton.setToolTipText("Click Confirm to join in selected mode!"); + this.confirmButton.addActionListener(e -> this.selectMode(this.parent)); + + //help + this.add(this.help); + this.help.setBackground(this.getBackground()); + } + + private void selectMode(JFrame parent) { + String mode = this.modeList.getSelectedValue(); + if (mode != null) { + Point pos = parent.getLocation(); + switch (mode) { + case "1. Common Mode ": + CommonModeFrame frame = new CommonModeFrame("Common Mode"); + frame.setLocation(pos); + frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); + frame.setSize(new Dimension(1000, 1000)); + frame.setVisible(true); + break; + } + parent.dispose(); + } + } + + private class ModeSelectionPanelLayout implements LayoutManager{ + + @Override + public void layoutContainer(Container parent) { + int width = parent.getWidth(); + int height = parent.getHeight(); + int marginX = width / 100; + int marginY = height / 100; + + //modeSelectionLabel + Dimension modeSelectionLabelSize = modeSelectionLabel.getPreferredSize(); + modeSelectionLabel.setBounds((width - modeSelectionLabelSize.width) / 2, 0, + modeSelectionLabelSize.width, modeSelectionLabelSize.height); + + //modeList + Dimension modeListSize = modeListScrollPane.getPreferredSize(); + modeListScrollPane.setBounds(0, modeSelectionLabel.getY() + modeSelectionLabel.getHeight() + marginY, + modeListSize.width, modeListSize.height); + + //help + Dimension helpSize = help.getPreferredSize(); + help.setBounds(modeListScrollPane.getX() + modeListSize.width + marginX, modeSelectionLabel.getY() + modeSelectionLabel.getHeight() + marginY, + helpSize.width, helpSize.height); + + //confirmButton + Dimension confirmButtonSize = confirmButton.getPreferredSize(); + confirmButton.setBounds((modeListSize.width - confirmButtonSize.width) / 2, modeListScrollPane.getY() + modeListSize.height + marginY, + confirmButtonSize.width, confirmButtonSize.height); + } + + @Override + public void addLayoutComponent(String name, Component comp) { + + } + + @Override + public void removeLayoutComponent(Component comp) { + + } + + @Override + public Dimension preferredLayoutSize(Container parent) { + return null; + } + + @Override + public Dimension minimumLayoutSize(Container parent) { + return null; + } + + } +} diff --git a/src/main/java/xyz/scottc/frames/mainFrame/dialog/CreateVDFileByInputDialog.java b/src/main/java/xyz/scottc/frames/mainFrame/dialog/CreateVDFileByInputDialog.java new file mode 100644 index 0000000..b0ff1e5 --- /dev/null +++ b/src/main/java/xyz/scottc/frames/mainFrame/dialog/CreateVDFileByInputDialog.java @@ -0,0 +1,76 @@ +package xyz.scottc.frames.mainFrame.dialog; + +import org.json.JSONObject; +import xyz.scottc.utils.*; + +import javax.swing.*; +import java.awt.*; +import java.io.File; +import java.util.ArrayList; + +public class CreateVDFileByInputDialog extends JDialog { + + private final UtilJPanel rootPanel = new UtilJPanel(new AfRowLayout()); + + private final VDTextArea QInputArea = new VDTextArea(10, 10, VDConstantsUtils.MICROSOFT_YAHEI_PLAIN_15, true, false); + private final JScrollPane QInputAreaScrollPane = new JScrollPane(this.QInputArea); + + private final VDTextArea AInputArea = new VDTextArea(10, 10, VDConstantsUtils.MICROSOFT_YAHEI_PLAIN_15, true, false); + private final JScrollPane AInputAreaScrollPane = new JScrollPane(this.AInputArea); + + private final UtilJButton confirmButton = new UtilJButton("Confirm", 30); + + public CreateVDFileByInputDialog(Frame owner) { + super(owner); + this.setTitle("Create Vocabulary List by Input"); + this.setModal(false); + this.rootPanelHandler(); + } + + private void rootPanelHandler() { + this.setContentPane(this.rootPanel); + + this.rootPanel.add(this.QInputAreaScrollPane, "2w"); + this.rootPanel.add(this.AInputAreaScrollPane, "2w"); + + this.rootPanel.add(this.confirmButton); + this.confirmButton.addActionListener(e -> this.generateFile()); + } + + private void generateFile() { + String Q = this.QInputArea.getText(); + String A = this.AInputArea.getText(); + ArrayList QList = new ArrayList<>(); + ArrayList AList = new ArrayList<>(); + int startValue = 0; + for (int i = 0; i < Q.length(); i++) { + if ('\n' == Q.charAt(i)) { + QList.add(Q.substring(startValue, i).replaceAll("\r", VDConstantsUtils.EMPTY) + .replaceAll("\n", VDConstantsUtils.EMPTY)); + startValue = i; + } + } + startValue = 0; + for (int i = 0; i < A.length(); i++) { + if ('\n' == A.charAt(i)) { + AList.add(A.substring(startValue, i).replaceAll("\r", VDConstantsUtils.EMPTY) + .replaceAll("\n", VDConstantsUtils.EMPTY)); + startValue = i; + } + } + JFileChooser fileChooser = new JFileChooser(); + int result = fileChooser.showSaveDialog(this); + fileChooser.setCurrentDirectory(new File("D:\\Desktop")); + if (result == JFileChooser.APPROVE_OPTION) { + File output = new File(fileChooser.getSelectedFile().getAbsolutePath().endsWith(".json") ? + fileChooser.getSelectedFile().getAbsolutePath() : fileChooser.getSelectedFile().getAbsolutePath() + ".json"); + JSONObject jsonObject = new JSONObject(); + jsonObject.put("questions", QList); + jsonObject.put("answers", AList); + JSONUtils.toFile(jsonObject, output, "UTF-8"); + this.AInputArea.setText(VDConstantsUtils.EMPTY); + this.QInputArea.setText(VDConstantsUtils.EMPTY); + } + } + +} diff --git a/src/main/java/xyz/scottc/frames/mainFrame/dialog/CreateVDFileByTXTDialog.java b/src/main/java/xyz/scottc/frames/mainFrame/dialog/CreateVDFileByTXTDialog.java new file mode 100644 index 0000000..5fe8c0a --- /dev/null +++ b/src/main/java/xyz/scottc/frames/mainFrame/dialog/CreateVDFileByTXTDialog.java @@ -0,0 +1,203 @@ +package xyz.scottc.frames.mainFrame.dialog; + +import org.json.JSONObject; +import xyz.scottc.utils.*; + +import javax.swing.*; +import javax.swing.filechooser.FileNameExtensionFilter; +import java.awt.*; +import java.io.*; +import java.util.ArrayList; +import java.util.List; + +public class CreateVDFileByTXTDialog extends JDialog { + + private final UtilJPanel rootPanel = new UtilJPanel(new CreateVDFileLayout()); + + private static final String HELP_TEXT = "This is a small tool for creating vocabularies list " + + "file which can be used in all the modes. You should first choose a file only contains " + + "the vocabularies, and then choose a file only contains the answers. Finally, hitting the " + + "\"generate\" button will help you to generate the valid file."; + + private final VDTextArea helpText = new VDTextArea(HELP_TEXT, 5, 33, VDConstantsUtils.MICROSOFT_YAHEI_PLAIN_20); + private final UtilJLabel vocabLabel = new UtilJLabel("Vocabulary File", VDConstantsUtils.MICROSOFT_YAHEI_PLAIN_20); + private final UtilJButton chooseVocabFile = new UtilJButton("Choose", 20); + private final JTextField vocabFilePath = new JTextField(19); + private final JScrollPane vocabFilePathScrollPane = new JScrollPane(this.vocabFilePath); + private final UtilJLabel answerLabel = new UtilJLabel("Answer File", VDConstantsUtils.MICROSOFT_YAHEI_PLAIN_20); + private final UtilJButton chooseAnswerFile = new UtilJButton("Choose", 20); + private final JTextField answerFilePath = new JTextField(19); + private final JScrollPane answerFilePathScrollPane = new JScrollPane(this.answerFilePath); + private final UtilJButton generate = new UtilJButton("Generate", 30); + + private final List vocabList = new ArrayList<>(100); + private final List answerList = new ArrayList<>(100); + + public CreateVDFileByTXTDialog(Frame owner, String title, boolean modal) { + super(owner, title, modal); + this.rootPanelHandler(); + } + + private void rootPanelHandler() { + this.setContentPane(this.rootPanel); + + this.rootPanel.add(this.helpText); + this.helpText.setEnabled(false); + this.helpText.setBackground(this.getBackground()); + this.helpText.setLineWrap(true); + this.helpText.setWrapStyleWord(true); + + this.rootPanel.add(this.vocabLabel); + this.rootPanel.add(this.chooseVocabFile); + this.chooseVocabFile.addActionListener(e -> this.chooseVocabFile(this.vocabList, this.vocabFilePath)); + this.rootPanel.add(this.vocabFilePathScrollPane); + this.vocabFilePath.setFont(VDConstantsUtils.MICROSOFT_YAHEI_PLAIN_20); + this.vocabFilePath.setEnabled(false); + + this.rootPanel.add(this.answerLabel); + this.rootPanel.add(this.chooseAnswerFile); + this.chooseAnswerFile.addActionListener(e -> this.chooseAnswerFile()); + this.rootPanel.add(this.answerFilePathScrollPane); + this.answerFilePath.setFont(VDConstantsUtils.MICROSOFT_YAHEI_PLAIN_20); + this.answerFilePath.setEnabled(false); + + this.rootPanel.add(this.generate); + this.generate.addActionListener(e -> this.generateFile()); + } + + private void chooseVocabFile(List list, JTextField pathField) { + JFileChooser fileChooser = new JFileChooser(); + fileChooser.setFileSelectionMode(JFileChooser.FILES_ONLY); + fileChooser.setFileFilter(new FileNameExtensionFilter("Text File", "txt")); + int result = fileChooser.showOpenDialog(this); + if (result == JFileChooser.APPROVE_OPTION) { + File file = fileChooser.getSelectedFile(); + InputStream inputStream = null; + try { + StringBuilder stringBuilder = new StringBuilder(); + inputStream = new FileInputStream(file); + byte[] buffer = new byte[1024]; + int length; + while ((length = inputStream.read(buffer)) != -1) { + stringBuilder.append(new String(buffer, 0, length)); + } + String input = stringBuilder.toString(); + input = input.replaceAll("\n", VDConstantsUtils.EMPTY); + + int startValue = 0; + for (int i = 0; i < input.length(); i++) { + if ('\r' == input.charAt(i)) { + list.add(input.substring(startValue, i).replaceAll("\r", VDConstantsUtils.EMPTY)); + startValue = i; + } + } + } catch (IOException e) { + e.printStackTrace(); + } finally { + if (inputStream != null) { + try { + inputStream.close(); + } catch (IOException e) { + e.printStackTrace(); + } + } + } + pathField.setText(file.getAbsolutePath()); + } + } + + private void chooseAnswerFile() { + this.chooseVocabFile(this.answerList, this.answerFilePath); + } + + private void generateFile() { + if (this.vocabFilePath.getText() == null && this.answerFilePath == null) { + JOptionPane.showConfirmDialog(this, + "You should firstly import both vocabulary file and answer file!", "Warning", + JOptionPane.DEFAULT_OPTION, JOptionPane.WARNING_MESSAGE); + } else { + JFileChooser fileChooser = new JFileChooser(); + fileChooser.setFileFilter(new FileNameExtensionFilter("JSON File", "json")); + int result = fileChooser.showSaveDialog(this); + if (result == JFileChooser.APPROVE_OPTION) { + File output = fileChooser.getSelectedFile(); + String path = output.getAbsolutePath(); + if (!path.endsWith(".json")) { + output = new File(path + ".json"); + } + JSONObject jsonObject = new JSONObject(); + jsonObject.put("questions", this.vocabList); + jsonObject.put("answers", this.answerList); + JSONUtils.toFile(jsonObject, output, "UTF-8"); + } + } + } + + private class CreateVDFileLayout implements LayoutManager{ + + @Override + public void layoutContainer(Container parent) { + int width = parent.getWidth(); + int height = parent.getHeight(); + int marginX = width / 50; + int marginY = height / 50; + + //helpText + Dimension helpTextSize = helpText.getPreferredSize(); + helpText.setBounds(marginX, marginY, helpTextSize.width, helpTextSize.height); + + //vocabLabel + Dimension vocabLabelSize = vocabLabel.getPreferredSize(); + vocabLabel.setBounds(marginX, helpText.getY() + helpTextSize.height + marginY, + vocabLabelSize.width, vocabLabelSize.height); + //chooseVocabFile + Dimension chooseVocabFileSize = chooseVocabFile.getPreferredSize(); + chooseVocabFile.setBounds(vocabLabel.getX() + vocabLabelSize.width + marginX, helpTextSize.height + marginY, + chooseVocabFileSize.width, chooseVocabFileSize.height); + //vocabFilePathScrollPane + Dimension vocabFilePathScrollPaneSize = vocabFilePathScrollPane.getPreferredSize(); + vocabFilePathScrollPane.setBounds(chooseVocabFile.getX() + chooseVocabFileSize.width + marginX, + helpTextSize.height + marginY, vocabFilePathScrollPaneSize.width, vocabFilePathScrollPaneSize.height); + + //answerLabel + Dimension answerLabelSize = answerLabel.getPreferredSize(); + answerLabel.setBounds(marginX, vocabLabel.getY() + vocabLabelSize.height + marginY, + answerLabelSize.width, answerLabelSize.height); + //chooseAnswerFile + Dimension chooseAnswerFileSize = chooseAnswerFile.getPreferredSize(); + chooseAnswerFile.setBounds(vocabLabel.getX() + vocabLabelSize.width + marginX, vocabLabel.getY() + vocabLabelSize.height + marginY, + chooseAnswerFileSize.width, chooseAnswerFileSize.height); + //answerFilePathScrollPane + Dimension answerFilePathScrollPaneSize = answerFilePathScrollPane.getPreferredSize(); + answerFilePathScrollPane.setBounds(chooseAnswerFile.getX() + chooseVocabFileSize.width + marginX, vocabLabel.getY() + vocabLabelSize.height + marginY, + answerFilePathScrollPaneSize.width, answerFilePathScrollPaneSize.height); + + //generate + Dimension generateSize = new Dimension(width - marginX * 2, generate.getPreferredSize().height); + generate.setBounds(marginX, answerFilePathScrollPane.getY() + answerFilePathScrollPaneSize.height + marginY * 2, + generateSize.width, generateSize.height); + } + + @Override + public void addLayoutComponent(String name, Component comp) { + + } + + @Override + public void removeLayoutComponent(Component comp) { + + } + + @Override + public Dimension preferredLayoutSize(Container parent) { + return null; + } + + @Override + public Dimension minimumLayoutSize(Container parent) { + return null; + } + + } + +} diff --git a/src/main/java/xyz/scottc/internalVocabPool/SAT3000Level2List01.json b/src/main/java/xyz/scottc/internalVocabPool/SAT3000Level2List01.json new file mode 100644 index 0000000..b66f1d2 --- /dev/null +++ b/src/main/java/xyz/scottc/internalVocabPool/SAT3000Level2List01.json @@ -0,0 +1,204 @@ +{ + "questions": [ + "protest", + "liberal", + "premise", + "virtually", + "justify", + "sweep", + "transition", + "keen", + "tendency", + "dedicate", + "tackle", + "boost", + "allege", + "jury", + "liability", + "veteran", + "tender", + "ultimate", + "dominant", + "consent", + "bonus", + "grasp", + "comply", + "correspondence", + "allocate", + "rational", + "probe", + "hedge", + "swell", + "defect", + "array", + "conservation", + "intervene", + "profound", + "prejudice", + "ideology", + "obscure", + "alien", + "articulate", + "ethical", + "chronic", + "stereotype", + "threshold", + "complement", + "competent", + "complication", + "marginal", + "monopoly", + "valve", + "unintelligible", + "epidemic", + "chromosome", + "enzyme", + "variant", + "pragmatic", + "composite", + "mentor", + "peripheral", + "gauge", + "optimal", + "singular", + "simulate", + "affirm", + "susceptible", + "paradox", + "contour", + "substitution", + "converge", + "discrete", + "hawk", + "facet", + "precipitate", + "transcribe", + "confound", + "novice", + "censor", + "elastic", + "watershed", + "parenthesis", + "descendant", + "senator", + "grip", + "recession", + "prescribe", + "equity", + "circuit", + "scandal", + "rumor", + "distress", + "premium", + "testimony", + "tragedy", + "coalition", + "merit", + "condemn", + "elegant", + "cruise", + "suspicion", + "cater" + ], + "answers": [ + "抗议", + "自由的", + "前提 房屋土地 预述", + "实际上 虚拟的", + "证明", + "打扫 迅速移动 卷走", + "转变", + "热切地", + "倾向", + "奉献 致力于", + "应对 处理", + "推进 提升", + "断言", + "陪审团", + "责任 累赘", + "老兵", + "温顺的 幼小的 敏感的", + "最终的", + "占主导地位的", + "同意", + "津贴", + "抓住 控制", + "遵守", + "相似 通信", + "分发 指派", + "有理的", + "探针", + "树篱 防备防范 回避", + "膨胀 浪潮", + "缺陷", + "阵列 排列", + "保守", + "干预", + "巨大的 深刻的", + "偏见 损害", + "意识形态", + "遮掩 隐藏 模糊的", + "外乡人 外星人", + "口齿清晰的", + "道德的", + "慢性的 积习难改的", + "旧框框", + "门槛", + "补足物", + "有竞争力的", + "难题 并发症", + "边际的 边缘的", + "垄断", + "阀门", + "不可理解的", + "流行的", + "染色体", + "酶", + "变体", + "务实的", + "混合物", + "导师", + "外围的 次要的", + "测量", + "最佳的", + "非凡的 单数的", + "假装", + "确认", + "善感的 易受影响的", + "悖论", + "轮廓", + "替代", + "汇聚", + "离散的 不连续的", + "鹰 兜售 叫卖", + "一面", + "使沉淀 使发生", + "做笔录", + "使困惑 证明\u2026是错的 混淆", + "新手", + "审查员", + "弹性的", + "分水岭", + "圆括号 插入语", + "后裔 子孙", + "参议员", + "抓牢紧握 吸引", + "衰退 经济萧条", + "规定 医嘱 开药方", + "公正 股本", + "电路板", + "丑闻", + "谣言", + "痛苦", + "优质的", + "证词", + "悲剧", + "联盟", + "价值 优点", + "谴责 判处 使陷入", + "优美的", + "巡航 巡游 缓慢行进 轻取", + "怀疑 预感 少许", + "为\u2026提供饮食" + ] +} \ No newline at end of file diff --git a/src/main/java/xyz/scottc/internalVocabPool/SAT3000Level2List02.json b/src/main/java/xyz/scottc/internalVocabPool/SAT3000Level2List02.json new file mode 100644 index 0000000..a2a35f9 --- /dev/null +++ b/src/main/java/xyz/scottc/internalVocabPool/SAT3000Level2List02.json @@ -0,0 +1,204 @@ +{ + "questions": [ + "confess", + "warrant", + "legacy", + "tenant", + "caution", + "vendor", + "thrust", + "clash", + "breach", + "mandate", + "landlord", + "superb", + "opt", + "insult", + "casualty", + "affection", + "patrol", + "prohibit", + "heritage", + "demographic", + "haunt", + "amend", + "concede", + "grief", + "exile", + "archive", + "despair", + "deploy", + "contemplate", + "flourish", + "hazard", + "disclosure", + "roar", + "bureau", + "anonymous", + "jurisdiction", + "doctrine", + "pharmaceutical", + "startle", + "warranty", + "miserable", + "vocal", + "splendid", + "utter", + "outrage", + "betray", + "affilate", + "batter", + "irritate", + "oversee", + "mock", + "crawl", + "illuminate", + "placement", + "persistent", + "cult", + "albeit", + "disguise", + "stagger", + "faction", + "spit", + "weep", + "partisan", + "divine", + "animate", + "enact", + "dread", + "assertion", + "fluctuate", + "compliment", + "temptation", + "generic", + "contingent", + "commence", + "grim", + "graze", + "dim", + "subscription", + "reconcile", + "archive", + "bruise", + "benchmark", + "escort", + "brutal", + "precedent", + "memoir", + "comtempt", + "mighty", + "glorious", + "heir", + "premature", + "slaughter", + "accountable", + "bob", + "vicious", + "bypass", + "intimidate", + "impair", + "verge" + ], + "answers": [ + "坦白", + "证明\u2026正当 为\u2026做担保", + "遗产 遗留问题", + "租户", + "小心 谨慎", + "小贩 卖主", + "推力 动力 猛推", + "冲突", + "违反 破裂 突破 打破", + "授权", + "地主", + "极好的 华丽的", + "v. 选择", + "辱骂", + "伤亡人员 死伤者", + "喜爱", + "巡逻", + "禁止", + "遗传", + "人口学的", + "经常出没于 鬼魂", + "补偿 修订 改善", + "承认", + "悲伤 伤心事", + "流放", + "档案", + "绝望", + "部署", + "凝视 沉思", + "繁荣 茂盛", + "陷入危险", + "揭露 披露", + "吼叫", + "局", + "匿名的", + "司法权 管辖权", + "信条", + "药物的", + "震惊", + "保证 保修期", + "痛苦的", + "声音的", + "壮丽的 极好的", + "发出声音 完全的", + "激怒愤慨 暴行", + "背叛", + "使附属", + "殴打 连续猛击", + "使恼怒 刺激", + "监督", + "嘲笑 仿制的", + "匍匐", + "点明 点亮", + "放置 实习", + "坚持不懈的", + "教派 狂热", + "尽管", + "掩盖", + "蹒跚 使震惊", + "派系", + "喷出 吐口水", + "哭泣 流脓", + "有倾向性的 拥护者", + "神性", + "使有生气", + "将\u2026制定成法律", + "恐惧", + "断言 主张", + "波动", + "难题", + "诱惑 引诱", + "普通的 无注册商标的", + "视情况而定的 一组", + "开始 着手", + "严肃的 令人沮丧的", + "放牧", + "昏暗的 使减小", + "订购 订阅", + "和解", + "档案", + "青肿", + "基准", + "护送 护卫", + "野蛮的", + "前例", + "回忆录", + "蔑视", + "强大的", + "宏伟的", + "继承人", + "过早的 早产的 未经深思熟虑的", + "屠杀", + "有责任的", + "上下快速移动 点头", + "邪恶的", + "越过 旁路", + "威吓", + "感官削弱", + "边缘 界限 接近" + ] +} \ No newline at end of file diff --git a/src/main/java/xyz/scottc/internalVocabPool/SAT3000Level2List03.json b/src/main/java/xyz/scottc/internalVocabPool/SAT3000Level2List03.json new file mode 100644 index 0000000..0412e8d --- /dev/null +++ b/src/main/java/xyz/scottc/internalVocabPool/SAT3000Level2List03.json @@ -0,0 +1,204 @@ +{ + "questions": [ + "resent", + "redeem", + "mourn", + "immunity", + "miniature", + "appliance", + "ambiguous", + "curb", + "confidential", + "sober", + "cynical", + "prestigious", + "proximity", + "hover", + "confer", + "congress", + "soothe", + "aspire", + "dissent", + "altar", + "decree", + "wedge", + "deter", + "temperament", + "rim", + "wicked", + "sprawl", + "idle", + "redundant", + "imminent", + "gratitude", + "flatter", + "turmoil", + "alley", + "moan", + "manifestation", + "menace", + "wary", + "shuffle", + "hypothetical", + "bait", + "tier", + "demolish", + "baseline", + "souvenir", + "dismay", + "gleam", + "therapeutic", + "cumulative", + "recollection", + "vault", + "ponder", + "stationary", + "catastrophe", + "tangible", + "skepitical", + "excavation", + "literal", + "supplementary", + "asylum", + "acclaim", + "discrepancy", + "chariatable", + "caravan", + "ascend", + "despise", + "intercept", + "console", + "linkage", + "demise", + "badge", + "paralyze", + "abide", + "sensor", + "upbringing", + "speculative", + "liaison", + "gloomy", + "segregate", + "insane", + "eccentric", + "daunt", + "relish", + "sob", + "intuition", + "glamorous", + "larva", + "dire", + "mortar", + "nuance", + "bald", + "canopy", + "reiterate", + "exclaim", + "preoccupy", + "petty", + "convene", + "remnant", + "rehearse" + ], + "answers": [ + "憎恶", + "挽回 兑现", + "哀悼 表遗憾 戴孝", + "免疫力 豁免权", + "微型的 小规模的", + "器具", + "含糊不清的", + "控制", + "机密的", + "冷静的 清醒的", + "愤世嫉俗的", + "有威望的", + "接近", + "盘旋", + "授予 给予 协商", + "国会", + "抚慰 缓和", + "渴望", + "持异议", + "祭坛", + "裁定", + "楔子", + "威慑 阻止", + "性情", + "外缘 边框", + "恶毒的", + "蔓延 伸展", + "无工作的 懒惰的", + "多余的 过剩的", + "临近的", + "感激之情", + "恭维", + "混乱", + "小巷", + "呻吟 抱怨", + "表现形式", + "威胁", + "谨慎的", + "拖着脚走 挪动", + "假设的 假定的", + "诱饵 鱼饵", + "一排 级别", + "摧毁", + "底线", + "纪念品", + "使惊愕", + "微光 闪光", + "有益健康的 治疗的", + "累积的", + "回忆", + "金库 穹顶 跳跃", + "仔细考虑 沉思", + "静止的", + "灾难性的", + "有形的", + "怀疑的", + "发掘", + "字面上的 完全的", + "补充的 额外的", + "避难所", + "称赞", + "差异", + "慈善的 宽容的", + "大篷车", + "上升", + "鄙视 轻视", + "拦截 窃听", + "安慰", + "联系", + "死亡", + "授予徽章", + "麻痹", + "忍受 容忍 遵守", + "传感器", + "养育", + "推测的 投机性的", + "联络人员", + "阴暗的", + "分离", + "精神失常", + "古怪异常的", + "使畏惧", + "喜爱 享受", + "啜泣", + "直觉", + "有魅力的", + "幼虫", + "致命的 严峻的", + "迫击炮 砂浆", + "细微差别", + "秃", + "树冠", + "重申", + "呼喊", + "使全神贯注", + "琐碎的 次要的", + "召开 开会", + "剩余部分", + "排练 预演" + ] +} \ No newline at end of file diff --git a/src/main/java/xyz/scottc/internalVocabPool/SAT3000Level2List04.json b/src/main/java/xyz/scottc/internalVocabPool/SAT3000Level2List04.json new file mode 100644 index 0000000..fd224e2 --- /dev/null +++ b/src/main/java/xyz/scottc/internalVocabPool/SAT3000Level2List04.json @@ -0,0 +1,204 @@ +{ + "questions": [ + "apt", + "plight", + "anguish", + "sentimental", + "provocative", + "ethnicity", + "parachute", + "lament", + "prominence", + "anecdote", + "usher", + "subdue", + "lavish", + "bolster", + "bewilder", + "disgrace", + "pertain", + "solicit", + "prophet", + "stipulate", + "navigation", + "affinity", + "mend", + "exquisite", + "reckless", + "allegiance", + "zoom", + "deduct", + "scrutinize", + "transcend", + "churn", + "hype", + "underscore", + "climax", + "syndicate", + "monumental", + "augment", + "thump", + "acquaint", + "mingle", + "benign", + "weld", + "tentative", + "relic", + "nostalgia", + "alleviate", + "glossy", + "obstruction", + "purport", + "huddle", + "baffle", + "tedious", + "aggravate", + "amenity", + "precursor", + "cerebral", + "lexicon", + "provisional", + "emulate", + "hymn", + "rhetorical", + "prudent", + "herald", + "afflict", + "succumb", + "pilgrim", + "thwart", + "assimilate", + "hilarious", + "protagonist", + "harass", + "confide", + "retrospect", + "unleash", + "relentless", + "determinant", + "jeopardize", + "filthy", + "topple", + "peril", + "ordeal", + "construe", + "renovation", + "mundane", + "versatile", + "contentious", + "brink", + "cliché", + "astound", + "myriad", + "seduce", + "salvage", + "incompatible", + "dangle", + "symmetry", + "conglomerate", + "melancholy", + "insulate", + "breathtaking" + ], + "answers": [ + "倾向于的 合适的", + "困境", + "极度痛苦", + "情感的 多愁善感的", + "撩人的", + "种族特点", + "降落伞", + "表达悲痛 痛惜 悲歌", + "显赫 显眼", + "轶事", + "迎接 引座 领座员", + "抑制", + "奢华的 丰富的", + "垫枕 支持", + "使迷惑", + "羞耻 丢脸的事 使\u2026蒙受耻辱", + "有关 从属", + "恳求 征集", + "先知", + "规定", + "导航", + "类同 喜爱 密切关系", + "缝补 改进", + "精致的 较好的", + "鲁莽的", + "忠诚", + "急行 急速上升 变焦摄影", + "扣除", + "仔细检查", + "超越", + "搅拌 搅动 翻腾", + "不实宣传", + "突出", + "达到高潮", + "企业联合", + "极大的 意义深远的", + "加强", + "重击", + "使熟悉", + "使混合", + "良性的", + "焊接 ", + "暂定的 犹豫不决的", + "遗迹 废墟", + "怀旧 怀旧之情", + "减轻", + "有光泽的 光滑的", + "妨碍 阻碍", + "意图 打算", + "挤成一团 暗中碰头", + "使迷惑", + "单调乏味的", + "加强 激怒", + "便利设施", + "先驱 先导", + "理智的 大脑的", + "全部词汇", + "暂时性的", + "效仿 模仿", + "圣歌", + "修辞的", + "精明的 深谋远虑的", + "预示", + "使痛苦", + "屈服", + "朝圣", + "挫败 使受挫", + "吸收 使同化", + "极有趣的 滑稽的", + "主角", + "不断骚扰", + "吐露", + "回顾 回忆", + "解开 释放", + "不间断的", + "决定性因素", + "危害 危及", + "肮脏的", + "倒下 跌倒 颠覆", + "危险 危害", + "磨难", + "理解 认为", + "翻新 整修", + "普通的 平凡的", + "多用途的 通用的", + "有争议的", + "边缘", + "陈词滥调", + "使震惊", + "无数的 大量的", + "引诱 诱惑", + "抢救 挽回", + "不兼容的 有冲突的", + "悬荡", + "对称性", + "企业集团 混合物", + "忧伤 悲伤的", + "使绝缘", + "惊人的" + ] +} \ No newline at end of file diff --git a/src/main/java/xyz/scottc/internalVocabPool/SAT3000Level2List05.json b/src/main/java/xyz/scottc/internalVocabPool/SAT3000Level2List05.json new file mode 100644 index 0000000..9d36668 --- /dev/null +++ b/src/main/java/xyz/scottc/internalVocabPool/SAT3000Level2List05.json @@ -0,0 +1,204 @@ +{ + "questions": [ + "indict", + "paranoid", + "perpetual", + "behold", + "agitate", + "patronize", + "stigma", + "acquit", + "clutter", + "clumsy", + "detrimental", + "disposable", + "dismal", + "plump", + "enchant", + "guru", + "censure", + "pertinent", + "impede", + "mural", + "traverse", + "parody", + "bestow", + "bluff", + "refurbish", + "solemn", + "kernel", + "taint", + "fumble", + "bristle", + "impart", + "latent", + "hunch", + "wither", + "involuntary", + "infuriate", + "disparate", + "curtail", + "inscribe", + "prairie", + "shrewd", + "conjecture", + "warp", + "savor", + "triumphant", + "thrash", + "contrive", + "outburst", + "conceivable", + "ludicrous", + "somber", + "womb", + "dissect", + "agonize", + "rectify", + "orchestrate", + "futile", + "fraudulent", + "forage", + "conspire", + "vanity", + "havoc", + "penalize", + "cunning", + "upheaval", + "deflect", + "blunder", + "diagonal", + "overdue", + "suspense", + "eminent", + "ignite", + "eloquent", + "renounce", + "hindsight", + "mediation", + "revere", + "disdain", + "caricature", + "extinguish", + "budgetary", + "ominous", + "concise", + "lofty", + "disillusion", + "mutant", + "predicament", + "hue", + "oblivious", + "pastime", + "poignant", + "confinement", + "grudge", + "ecstasy", + "tacit", + "burgeon", + "adamant", + "hoist", + "whim" + ], + "answers": [ + "控告", + "多疑的", + "无休止的", + "看见", + "使激动", + "经常光顾", + "耻辱 柱头", + "宣判\u2026无罪 表现", + "杂乱的东西", + "笨拙的", + "有害的", + "一次性的", + "阴沉的", + "胖乎乎的 使蓬松", + "使陶醉", + "导师 权威", + "谴责", + "有关的", + "阻碍", + "壁画", + "穿过", + "拙劣的模仿", + "授予", + "虚张声势", + "整修", + "庄严的", + "果核", + "污染", + "摸索", + "发怒 鬃毛 充满", + "传授 给与(特定品质)", + "潜在的", + "直觉 预感", + "凋零", + "无意识的 非自愿的", + "使大怒", + "迥然不同的", + "缩减", + "题写", + "大草原", + "精明的", + "猜测", + "扭曲", + "品尝 享受", + "成功的", + "抽打 快节奏金属乐", + "设法促成 出乎意料的做到", + "爆发", + "想象得到的", + "荒唐可笑的", + "昏暗的 阴郁的", + "子宫", + "解剖", + "使痛苦", + "校正", + "将\u2026谱成管弦乐曲", + "无益的", + "欺诈性的", + "搜寻粮草 饲料", + "密谋", + "虚荣 徒劳无用", + "严重破坏 浩劫", + "处罚 处于不利地位", + "狡猾的 灵巧", + "动乱 剧变", + "使\u2026偏斜 劝阻", + "犯大错", + "对角线的", + "到期未付的 迟来的", + "中止", + "名声显赫的", + "点燃 引发", + "雄辩的", + "宣布放弃", + "后见之明", + "调解 仲裁", + "敬畏 ", + "鄙视", + "漫画 拙劣地模仿", + "扑灭", + "预算的", + "不祥的", + "简洁的", + "高耸的", + "使幻想破灭", + "变种的 突变的", + "窘境", + "色调 色彩", + "未察觉的", + "娱乐 消遣", + "酸楚的", + "监禁 限制", + "积怨 勉强给", + "摇头丸 狂喜", + "心照不宣的", + "发芽", + "坚决的 固执的", + "提升 升起", + "突发奇想" + ] +} \ No newline at end of file diff --git a/src/main/java/xyz/scottc/internalVocabPool/SAT3000Level2List06.json b/src/main/java/xyz/scottc/internalVocabPool/SAT3000Level2List06.json new file mode 100644 index 0000000..98cdb72 --- /dev/null +++ b/src/main/java/xyz/scottc/internalVocabPool/SAT3000Level2List06.json @@ -0,0 +1,204 @@ +{ + "questions": [ + "delve", + "brim", + "espouse", + "defiant", + "blockbuster", + "mediocre", + "impartial", + "immaculate", + "containment", + "vindicate", + "ardent", + "disclaimer", + "epoch", + "crumple", + "apprehend", + "acronym", + "flimsy", + "reproach", + "prerogative", + "compulsive", + "blatant", + "repercussion", + "pavilion", + "tapestry", + "ornate", + "liken", + "airborne", + "deport", + "veer", + "miraculous", + "nobility", + "brag", + "synchronize", + "floral", + "savvy", + "vulgar", + "elongate", + "avid", + "vernacular", + "captivate", + "allure", + "fragrance", + "deplore", + "harmonic", + "abort", + "brook", + "haste", + "sneer", + "aristocracy", + "neutrality", + "remorse", + "gape", + "reimburse", + "eclectic", + "decency", + "treacherous", + "charisma", + "coax", + "varnish", + "carcass", + "creed", + "idiosyncratic", + "intangible", + "resurgence", + "illiterate", + "accentuate", + "hysteria", + "detour", + "galvanize", + "counterfeit", + "blight", + "garrison", + "sublime", + "dreary", + "subversive", + "sloppy", + "heady", + "assort", + "hereditary", + "kinship", + "legislate", + "detract", + "resurrect", + "improvisation", + "attire", + "cumbersome", + "respite", + "erroneous", + "culinary", + "desolate", + "delinquency", + "aversion", + "reprimand", + "choreographer", + "flamboyant", + "circumvent", + "bounty", + "complacent", + "rendezvous" + ], + "answers": [ + "探索 挖掘 搜寻", + "帽檐 充满 满溢", + "支持", + "挑衅的", + "了不起的人或事", + "普通的", + "公正的", + "无瑕疵的", + "抑制 牵制", + "辩护", + "热烈的 热情的", + "免责声明", + "时代", + "弄皱 垮台 崩溃", + "逮捕 理解 意识到", + "首字母缩略词", + "劣质的 薄的", + "责备 使感到耻辱", + "特权", + "难以控制的 吸引人的", + "明显的 吵闹的", + "反响", + "亭子 装饰性建筑", + "挂毯", + "华美的 华丽的", + "把某人/某物比作", + "空气传播的", + "驱逐", + "转向", + "奇迹般的", + "贵族", + "吹嘘", + "同步", + "植物的 花的", + "常识 精明的", + "庸俗的 粗鲁的", + "拉长", + "热衷的 热心的", + "方言的 本地化的", + "迷住 迷惑", + "吸引", + "香味", + "悲悼 反对", + "和声的 和谐的", + "中止 取消", + "容忍 忍受 小溪", + "匆忙 快速", + "讥笑 冷笑", + "贵族", + "中立", + "懊悔", + "张口结舌地瞪着 裂开 张开", + "偿付", + "兼收并蓄的", + "得体 礼仪", + "奸诈的 危险的", + "个人魅力", + "哄劝 劝诱", + "涂清漆", + "尸体 残骸", + "信条 原则", + "独特的", + "无形的", + "复兴 再现", + "不识字的 文盲的 外行的", + "强调", + "歇斯底里", + "绕道而行", + "刺激 通电", + "伪造品", + "破坏 毁坏", + "驻防部队", + "很棒的 卓越的 极好的", + "枯燥的", + "颠覆性的", + "糟蹋的", + "上头的", + "分类", + "世袭制度", + "亲属关系", + "立法", + "减损 转移 使分心", + "使复活", + "即兴表演 即兴创作", + "穿上盛装", + "笨重的 累赘的 不方便的", + "喘息", + "错误的", + "烹饪的 厨房的", + "荒凉的", + "少年违法犯罪", + "厌恶", + "惩戒", + "编舞者", + "艳丽的 凤凰木", + "包围 回避", + "慷慨 赏金", + "自满的", + "约会 见面" + ] +} \ No newline at end of file diff --git a/src/main/java/xyz/scottc/internalVocabPool/SAT3000Level2List07.json b/src/main/java/xyz/scottc/internalVocabPool/SAT3000Level2List07.json new file mode 100644 index 0000000..beeffe1 --- /dev/null +++ b/src/main/java/xyz/scottc/internalVocabPool/SAT3000Level2List07.json @@ -0,0 +1,204 @@ +{ + "questions": [ + "iconic", + "corroborate", + "etiquette", + "trespass", + "frivolous", + "idyllic", + "ferment", + "synergy", + "vex", + "aptitude", + "fledgling", + "backfire", + "emphatic", + "vigilant", + "bask", + "exuberant", + "dogma", + "consummate", + "bribery", + "tantalize", + "dismissive", + "embroidery", + "egalitarian", + "defuse", + "apathy", + "epitomize", + "engross", + "labyrinth", + "clandestine", + "antidote", + "palpable", + "negligent", + "intoxicate", + "grueling", + "derail", + "benevolent", + "suffrage", + "gratification", + "austere", + "expedient", + "impeccable", + "oblique", + "bloodshed", + "pious", + "calibrate", + "congest", + "estrange", + "fathom", + "recoil", + "sieve", + "archaic", + "superfluous", + "penchant", + "consign", + "monotonous", + "totalitarian", + "aloof", + "categorical", + "enthrall", + "gimmick", + "layman", + "legitimize", + "fervent", + "courteous", + "enumerate", + "contagious", + "phobia", + "forgery", + "conceit", + "topography", + "wager", + "peddle", + "crux", + "expiration", + "translucent", + "ambience", + "unscrupulous", + "flashback", + "ameliorate", + "abate", + "pompous", + "boon", + "forgo", + "barter", + "cadence", + "quirk", + "oddity", + "thrift", + "deflate", + "hallucination", + "pretentious", + "imbue", + "zigzag", + "mire", + "impasse", + "disparage", + "callous", + "intricacy", + "impromptu" + ], + "answers": [ + "偶像的", + "确证", + "礼节", + "擅自闯入 滥用 犯罪", + "轻浮的 不重要的", + "闲适恬静的", + "使发酵 挑起动乱", + "协同增效作用", + "使恼火", + "天资", + "菜鸟 新手", + "事与愿违", + "明确坚决的", + "警惕的", + "享受 晒太阳", + "热情洋溢的", + "教义 信条", + "完整的 完美无缺的", + "贿赂", + "逗弄 使干着急", + "轻蔑地", + "刺绣", + "平等主义者", + "拆除 平息", + "冷淡", + "成为\u2026的典范", + "使全神贯注", + "迷宫", + "秘密的", + "矫正方法", + "明显的", + "疏忽的 粗心大意的", + "使陶醉", + "使人筋疲力尽的", + "使\u2026脱轨", + "仁爱的", + "选举权", + "感激", + "朴素的", + "适宜的 应急的手段\u2019", + "无缺点的", + "倾斜的", + "杀戮", + "虔诚的 道貌岸然的", + "校正 调整", + "拥挤 堵塞", + "使疏远 离间", + "英寻 弄懂", + "退缩 畏缩", + "用筛子筛", + "古老的", + "多余的", + "爱好", + "把\u2026托付给", + "乏味的", + "极权主义", + "冷漠的 超然的", + "绝对的", + "吸引住", + "花招 骗人的玩意", + "平信徒", + "使合法", + "热情的", + "有礼貌的", + "枚举", + "有传染性的", + "恐惧症", + "伪造品", + "自负", + "地形", + "打赌", + "兜售 宣扬 散布", + "关键", + "呼气 吐气 终结", + "半透明的", + "气氛 格调", + "不道德的", + "倒叙", + "改善", + "某种威胁减退", + "自负的", + "福音", + "放弃", + "以物换物", + "抑扬顿挫", + "怪癖", + "古怪", + "节俭", + "放掉...的气", + "幻想", + "做作的", + "使充满", + "之字形", + "陷入泥潭", + "僵局 死路", + "贬低", + "冷酷无情的", + "错综复杂", + "即兴的" + ] +} \ No newline at end of file diff --git a/src/main/java/xyz/scottc/internalVocabPool/SAT3000Level2List08.json b/src/main/java/xyz/scottc/internalVocabPool/SAT3000Level2List08.json new file mode 100644 index 0000000..d836177 --- /dev/null +++ b/src/main/java/xyz/scottc/internalVocabPool/SAT3000Level2List08.json @@ -0,0 +1,204 @@ +{ + "questions": [ + "understatement", + "indignant", + "carefree", + "bequeath", + "vestige", + "chide", + "aloft", + "calamity", + "purr", + "onerous", + "sarcasm", + "demean", + "pelt", + "pseudonym", + "deride", + "unequivocal", + "comprehensible", + "inept", + "hypocritical", + "haphazard", + "feign", + "coalesce", + "hinterland", + "cryptic", + "serenity", + "juxtapose", + "surmount", + "genteel", + "elate", + "reminisce", + "tact", + "banal", + "forestall", + "quintessential", + "arcane", + "agile", + "evasive", + "figurative", + "euphemism", + "partake", + "condescend", + "consternation", + "nozzle", + "laud", + "ephemeral", + "corrosion", + "conundrum", + "tumultuous", + "prodigy", + "incongruous", + "delude", + "scrawl", + "profusion", + "supposition", + "connoisseur", + "dilapidate", + "vignette", + "amalgamate", + "laborious", + "archetypal", + "dearth", + "commotion", + "foreshadow", + "revisionist", + "caustic", + "defunct", + "palatable", + "exonerate", + "admonish", + "indiscriminate", + "stagnate", + "antipathy", + "bigotry", + "incessant", + "commendable", + "devious", + "sullen", + "antagonize", + "insatiable", + "voluminous", + "fragmentary", + "catalyze", + "pester", + "placid", + "brazen", + "commemoration", + "implausible", + "industrious", + "twine", + "deft", + "rebuttal", + "tenacity", + "interminable", + "scavenge", + "annihilate", + "tectonic", + "circumscribe", + "introvert", + "assail" + ], + "answers": [ + "低调的说法 轻描淡写", + "义愤的", + "无忧无虑的", + "遗赠", + "残留", + "呵斥", + "在高处", + "灾厄", + "发出轰鸣声", + "沉重的 繁重的", + "讽刺", + "贬低", + "攻击或投掷", + "假名", + "嘲笑", + "毫不含糊地", + "可理解的", + "无能的", + "虚伪的", + "无计划的", + "假装", + "合并", + "内陆地区", + "隐晦的", + "静谧", + "把\u2026并列", + "居于\u2026之上", + "有教养的", + "使高兴", + "缅怀往事", + "为人处世圆滑", + "平庸的", + "预先阻止", + "典型的", + "神秘的 难解的", + "敏捷的", + "含糊其辞的", + "修辞的", + "委婉语", + "参与", + "屈尊", + "惊愕", + "喷嘴 管口 鼻", + "赞美", + "短暂的", + "腐蚀", + "谜", + "喧闹的", + "奇才", + "不一致的", + "欺骗(自己)", + "写字潦草", + "大量", + "推测 假设", + "鉴赏家", + "使荒废", + "片段", + "合并", + "费力地", + "原型的", + "缺乏", + "骚动", + "预示", + "修正主义者", + "尖刻的 腐蚀性的", + "不复存在的 已废除的", + "可口的", + "免除\u2026的责任", + "告诫", + "不加区别的", + "停滞 不进步", + "强烈的厌恶", + "偏执", + "不间断的 持续不断的", + "值得称赞的", + "狡诈的 迂回的 弯曲的", + "阴沉的 郁郁寡欢的", + "产生敌意", + "贪得无厌的", + "宽大的", + "支离破碎的", + "催化", + "打扰 使烦扰", + "平和的 平静的", + "厚颜无耻的", + "纪念仪式", + "不合情理的 不可行的", + "勤奋的", + "使交织", + "灵巧的", + "反驳", + "坚韧", + "无休止的", + "食腐动物", + "歼灭", + "板块构造的", + "约束", + "内向的人", + "攻击 困扰" + ] +} \ No newline at end of file diff --git a/src/main/java/xyz/scottc/internalVocabPool/SAT3000Level2List09.json b/src/main/java/xyz/scottc/internalVocabPool/SAT3000Level2List09.json new file mode 100644 index 0000000..50810a9 --- /dev/null +++ b/src/main/java/xyz/scottc/internalVocabPool/SAT3000Level2List09.json @@ -0,0 +1,200 @@ +{ + "questions": [ + "gloat", + "extravagance", + "sardonic", + "perturb", + "colloquial", + "malign", + "exorbitant", + "audacious", + "wistful", + "oscillate", + "rover", + "egregious", + "observant", + "crevice", + "unanimity", + "hyperbole", + "fickle", + "unsurmountable", + "enmity", + "rejuvenate", + "illusory", + "opulent", + "succinct", + "hypnotize", + "indelible", + "convoluted", + "chastise", + "extraterrestrial", + "cajole", + "panacea", + "brevity", + "despicable", + "paucity", + "sensuous", + "belittle", + "acumen", + "posthumous", + "tinge", + "governess", + "assuage", + "capricious", + "steadfast", + "balm", + "didactic", + "demarcation", + "extrinsic", + "regal", + "abhor", + "prosaic", + "hubris", + "aberrant", + "oratory", + "digression", + "extravert", + "irrevocable", + "vandalize", + "juggernaut", + "sustenance", + "formulaic", + "diminution", + "transitory", + "flagrant", + "salutary", + "fluster", + "horoscope", + "sedative", + "harbinger", + "reverie", + "annul", + "abridge", + "immutable", + "equivocal", + "whirlpool", + "realign", + "automaton", + "vehement", + "opacity", + "transgress", + "succulent", + "connote", + "imitator", + "jubilant", + "furtive", + "irreconcilable", + "omnipresent", + "auspicious", + "deferential", + "circumspect", + "serpentine", + "ceaseless", + "infinitesimal", + "abominable", + "ungainly", + "inexhaustible", + "unfathomable", + "omniscient", + "tyrannical" + ], + "answers": [ + "得意扬扬", + "挥霍 奢侈 夸张的举动", + "讽刺的", + "打扰 使不安", + "口语的", + "恶意", + "过高的", + "大胆的", + "渴望的 留恋的", + "使动摇 使震荡", + "漫游者", + "极坏的", + "善于观察的", + "裂缝", + "同意 全体一致", + "夸张", + "易变的", + "无法克服的 无法逾越的", + "敌意", + "使年轻", + "幻想", + "奢华的", + "简明的", + "对\u2026施催眠术 使着迷", + "难以去除的", + "错综复杂的", + "责备 体罚", + "地外的", + "劝诱", + "灵丹妙药", + "简洁 短暂", + "卑鄙的", + "不足", + "感官愉悦的", + "贬低", + "精明", + "死后获得的", + "淡色 少许味道", + "女家庭教师", + "缓解", + "变化无常的 突发奇想的", + "坚定的 忠实的", + "香气 香味", + "教导的", + "界限 划分", + "外在的 外部的", + "帝王的", + "憎恶", + "枯燥的", + "傲慢自大", + "反常的", + "演讲术 雄辩的言辞", + "离题", + "性格外向的", + "不可撤回的", + "蓄意破坏", + "不可抗拒的力量", + "食物 生计 维持", + "刻板的", + "减少", + "短暂的", + "骇人听闻的 丑恶可耻的", + "有益的", + "使慌乱", + "占星术", + "镇静的", + "预告者", + "遐想", + "宣告\u2026无效 废除", + "删节", + "不可改变的", + "模棱两可的", + "漩涡", + "调整\u2026的位置 重新结盟", + "机器人", + "强烈的", + "不透明", + "违背", + "多肉的 鲜美多汁的", + "意味着", + "模仿者", + "欣喜若狂的", + "鬼鬼祟祟的", + "势不两立的", + "无处不在的", + "吉祥的", + "恭敬的", + "慎重的 细心的", + "蜿蜒的 弯弯曲曲的", + "不停的", + "极小的 无穷的", + "恶劣的", + "笨拙的", + "用之不竭的 不知疲倦的", + "深不可测的 不可理解的", + "无所不知的", + "专制的 残暴的" + ] +} \ No newline at end of file diff --git a/src/main/java/xyz/scottc/internalVocabPool/SAT3000Level2List10.json b/src/main/java/xyz/scottc/internalVocabPool/SAT3000Level2List10.json new file mode 100644 index 0000000..42a9333 --- /dev/null +++ b/src/main/java/xyz/scottc/internalVocabPool/SAT3000Level2List10.json @@ -0,0 +1,302 @@ +{ + "questions": [ + "illegitimacy", + "impassive", + "mollify", + "vicissitude", + "ineffable", + "spellbind", + "scrawny", + "flabbergast", + "perplexity", + "acolyte", + "empathetic", + "efficacious", + "ulterior", + "pensive", + "flippant", + "defile", + "equanimity", + "colossus", + "snobbish", + "alliteration", + "omnipotent", + "lighthearted", + "cataclysmic", + "bane", + "facetious", + "antithetical", + "mimicry", + "expunge", + "fallible", + "sulfuric", + "stealthy", + "irksome", + "indigent", + "impetuous", + "convivial", + "rancor", + "forbear", + "tenable", + "illegible", + "osmosis", + "invulnerable", + "chauvinism", + "effusive", + "credulous", + "edify", + "bombastic", + "defame", + "imprudent", + "anticlimax", + "seditious", + "decorous", + "plagiarize", + "adroit", + "blindside", + "abstruse", + "fallacious", + "discernible", + "conciliate", + "benediction", + "ingenuous", + "commodious", + "gluttony", + "execrable", + "curmudgeon", + "unswerving", + "preeminence", + "provident", + "ceremonious", + "counterargument", + "acme", + "abase", + "account for", + "aggrandize", + "ambivalent", + "amount to", + "antiquated", + "appealing", + "avant-garde", + "bizarre", + "calligraphy", + "chance on", + "cling to", + "close-knit", + "compelling", + "composed", + "combustion", + "congruous", + "contented", + "craving", + "delve into", + "detached", + "discriminate", + "disinterested", + "disproportionate", + "distinguishing", + "draw on", + "enterprising", + "enticing", + "excursion", + "exhilarating", + "fleeting", + "furnished", + "haven", + "imposing", + "ingrained", + "inhibiting", + "intriguing", + "irreversible", + "jot down", + "late boomer", + "lingering", + "long", + "maxim", + "marvel", + "outmoded", + "oval", + "overbearing", + "overrate", + "pedestrian", + "prevailing", + "precede", + "prosperity", + "refined", + "reflective", + "renowned", + "reserved", + "resolved", + "scared", + "self-aggrandizing", + "self-effacement", + "self-satisfied", + "sophisticated", + "spelunker", + "start from scratch", + "status quo", + "strained", + "stumble upon", + "stunning", + "stymie", + "subject to", + "take for granted", + "tangle up", + "tap into", + "teem with", + "trappings", + "travail", + "undertaking", + "utopia" + ], + "answers": [ + "非法性 私生", + "面无表情的 冷漠的", + "抚慰", + "变迁 推移 交替", + "不可言喻的 难以形容的", + "使入迷", + "瘦巴巴的", + "使大吃一惊", + "n. 困惑", + "追随者", + "移情作用的", + "有效的", + "隐秘的", + "沉思的", + "轻率无礼的", + "亵渎 玷污", + "镇静", + "大人物 巨人", + "势利的", + "头韵", + "全能的 无所不能的", + "轻松愉快的 随便的", + "灾难性的", + "祸根 死因", + "轻浮的 爱开玩笑的", + "对立的", + "模仿", + "清除 删除", + "会出错的", + "含硫磺的", + "偷偷摸摸的", + "令人恼火的", + "贫穷的", + "鲁莽的", + "欢乐的", + "怨恨", + "克制", + "站得住脚的 可保持的", + "无法辨认的", + "潜移默化 渗透", + "无懈可击的", + "盲目的爱国主义", + "过于热情的", + "轻信的", + "教化", + "华而不实的", + "排榜", + "轻率的", + "反高潮 令人扫兴的结尾", + "煽动性的 扰乱治安的", + "端庄稳重的", + "剽窃 抄袭", + "灵巧的 机敏的", + "攻击无防备的一侧", + "深奥的", + "谬误的", + "看得清的", + "安抚 调解", + "祝福 赐福祈祷", + "天真的", + "宽敞的", + "贪吃 暴饮暴食", + "恶劣的", + "脾气坏的人", + "直的", + "杰出 卓越", + "节俭的 有远见的", + "正式的 隆重的", + "相反论点", + "顶点", + "使出丑", + "对\u2026做出解释", + "增大 增加 吹捧", + "矛盾的 犹豫不决的", + "总计", + "陈旧的 过时的", + "有吸引力", + "前卫派(的)", + "古怪的", + "书法", + "偶然找到", + "抓紧 黏着", + "紧密联系", + "引人入胜的 令人信服的", + "镇静的", + "燃烧", + "一致的", + "满意的", + "渴望", + "探索", + "冷漠的 单独的", + "区别 歧视", + "公正的 不感兴趣的", + "不成比例的", + "区别性的", + "临近 导致", + "有事业心的", + "诱人的", + "远足", + "令人高兴的", + "快速经过的", + "配有家具的", + "避难所", + "壮观的", + "根深蒂固的", + "约束的", + "引人入胜的", + "不可逆转的", + "草草记下", + "婴儿潮后出生的人", + "拖延的", + "渴望", + "格言", + "奇迹", + "过时的", + "椭圆的", + "专横的", + "高估", + "行人 乏味的", + "盛行的 流行的", + "先于", + "繁荣", + "精炼的 优雅的", + "反射的 沉思的", + "著名的", + "矜持的 留作专用的", + "坚决的", + "惊恐的", + "自夸的 自我膨胀的", + "谦逊", + "沾沾自喜的", + "精密的", + "洞穴探险者", + "从头开始", + "现状", + "焦虑的 不自然的", + "偶然发现", + "震惊的 绝妙的", + "阻碍", + "受\u2026影响 遭受 受制于", + "认为\u2026理所当然", + "缠在一起", + "接近", + "充满", + "装饰 服饰 马饰", + "艰苦劳动", + "任务 工作 企业 承诺", + "乌托邦" + ] +} \ No newline at end of file diff --git a/src/main/java/xyz/scottc/internalVocabPool/SAT3000Level3List01.json b/src/main/java/xyz/scottc/internalVocabPool/SAT3000Level3List01.json new file mode 100644 index 0000000..87ae2ed --- /dev/null +++ b/src/main/java/xyz/scottc/internalVocabPool/SAT3000Level3List01.json @@ -0,0 +1,204 @@ +{ + "questions": [ + "sanction", + "flip", + "trauma", + "nominal", + "cholesterol", + "feast", + "proclaim", + "interface", + "rack", + "denote", + "query", + "screw", + "nominate", + "bump", + "invoice", + "poll", + "minority", + "stare", + "clinical", + "refugee", + "par", + "punch", + "bound", + "injection", + "auction", + "mortality", + "tumor", + "membrane", + "semantic", + "syndrome", + "molecular", + "maternal", + "equilibrium", + "antibiotic", + "ion", + "neuron", + "synthetic", + "cone", + "lever", + "numerical", + "quantum", + "slab", + "consonant", + "notation", + "dissertation", + "invert", + "theorem", + "mole", + "solvent", + "yeast", + "longitudinal", + "flux", + "infinity", + "chloride", + "splice", + "fiscal", + "commander", + "stall", + "rebel", + "raid", + "pledge", + "dip", + "lad", + "verse", + "yell", + "plaintiff", + "fleet", + "debut", + "whip", + "caption", + "subsidiary", + "gamble", + "arena", + "tray", + "curl", + "commentator", + "lounge", + "plea", + "stumble", + "supervise", + "petition", + "token", + "stride", + "shrug", + "scramble", + "revelation", + "preach", + "sew", + "slap", + "buzz", + "tease", + "strap", + "franchise", + "spectacle", + "batch", + "slump", + "militant", + "chapel", + "knot" + ], + "answers": [ + "批准", + "快速打开关闭", + "外伤", + "名义上的 少量的", + "胆固醇", + "盛宴 使\u2026尽情享受", + "宣布 表扬 赞扬", + "界面 接口", + "支架 行李架", + "预示 指代", + "疑问 询问", + "用螺钉固定 诈骗 愚弄 搞砸 糟蹋", + "提名 任命", + "碰撞 肿块", + "开发票", + "民意调查", + "少数民族", + "盯着看", + "临床的", + "难民", + "等价 标准 票面价值 ", + "猛击 戳 影响力", + "一定的 界限", + "注射", + "拍卖", + "死亡率 ", + "肿瘤", + "薄膜", + "语义的", + "综合症状 并发症", + "分子的", + "母系的", + "平衡", + "抗生素", + "离子", + "神经元", + "合成的", + "圆锥", + "拉杆", + "数字的", + "量子", + "厚板", + "辅音的 协调的", + "符号", + "学问论文", + "倒置", + "定理 原理", + "内奸 鼹鼠", + "有偿付能力的 溶剂", + "酵母菌", + "经度的 纵向的", + "波动", + "无限", + "氟化物", + "铰接点", + "财政的", + "指挥官", + "拖延 延后", + "叛乱者 反抗", + "突袭", + "保证 用\u2026抵押", + "蘸", + "男孩", + "诗", + "叫喊", + "原告", + "船队 车队", + "首次亮相", + "鞭子 鞭打", + "标题", + "子公司", + "赌博", + "竞技场", + "托盘", + "卷发", + "评论员", + "客厅 休息室", + "请求 恳求 接口 辩护", + "蹒跚 结结巴巴", + "监管", + "请愿书", + "象征的", + "跨步 进展", + "耸肩", + "争抢 炒蛋", + "启示", + "布道 宣传 告诫", + "缝", + "拍 打 一巴掌", + "嗡嗡声 打电话", + "嘲弄 欺负", + "用带子系", + "选举权", + "精彩的表演 奇观", + "一批", + "骤跌 大幅下降", + "好斗的", + "小教堂", + "节" + ] +} \ No newline at end of file diff --git a/src/main/java/xyz/scottc/internalVocabPool/SAT3000Level3List02.json b/src/main/java/xyz/scottc/internalVocabPool/SAT3000Level3List02.json new file mode 100644 index 0000000..6bb7aad --- /dev/null +++ b/src/main/java/xyz/scottc/internalVocabPool/SAT3000Level3List02.json @@ -0,0 +1,204 @@ +{ + "questions": [ + "doom", + "naval", + "morale", + "helmet", + "pinch", + "missionary", + "lure", + "encompass", + "scout", + "artery", + "bail", + "tenure", + "exempt", + "casino", + "theology", + "playoff", + "tan", + "flank", + "inmate", + "verge", + "lieutenant", + "tremble", + "fling", + "savage", + "subsidize", + "grate", + "inflict", + "tread", + "flare", + "inheritance", + "rhyme", + "saddle", + "vain", + "shove", + "crumble", + "revolt", + "chord", + "cemetery", + "murmur", + "commute", + "outset", + "booth", + "poise", + "preside", + "rigorous", + "giggle", + "compassion", + "envisage", + "coupon", + "dub", + "beneficiary", + "lapse", + "mutter", + "ranch", + "acoustic", + "shiver", + "retention", + "trench", + "spacious", + "jerk", + "dazzle", + "crunch", + "refrain", + "wholesale", + "groove", + "dart", + "overturn", + "tout", + "genome", + "outright", + "peg", + "insulin", + "nuisance", + "boycott", + "siege", + "glitter", + "rein", + "tractor", + "ramp", + "foil", + "smear", + "glide", + "weary", + "pathetic", + "swirl", + "analog", + "lash", + "tug", + "intersection", + "hitherto", + "ascertain", + "blunt", + "preacher", + "cram", + "pedal", + "viability", + "muse", + "drape", + "clamp" + ], + "answers": [ + "劫数", + "军舰", + "志气 ", + "头盔", + "捏 少量", + "传教士", + "诱惑", + "围绕 包围", + "侦察", + "动脉 干道", + "保释金", + "占有 任期", + "免除 豁免", + "赌场", + "神学", + "延长赛", + "硝制皮革", + "侧面", + "同狱友人", + "边缘", + "尉官", + "颤抖", + "抛扔", + "野蛮人", + "发津贴", + "磨碎", + "使遭受折磨", + "踏板 踩踏", + "闪耀 闪光", + "继承物 遗产", + "韵律", + "马鞍", + "徒劳 虚荣", + "推 猛推", + "磨碎 崩溃 破碎", + "叛乱 反抗", + "弦", + "墓地 公寓", + "嘟囔 低语", + "通勤", + "开始 开端", + "小隔间", + "姿势 冷静 镇静", + "掌管 主持", + "严格的", + "咯咯笑", + "同情", + "想象", + "配给券", + "配音", + "受惠人", + "过失 小毛病", + "咕哝", + "牧场", + "声学的", + "颤抖", + "保留", + "沟渠", + "广阔的", + "混蛋 猛拉", + "使眩晕 使目眩", + "咬碎 粉碎", + "限制", + "批发", + "沟槽", + "猛冲", + "反转 推翻", + "兜售", + "基因组", + "完全的 彻底的", + "用夹子固定", + "胰岛素", + "麻烦事 讨厌的人", + "联合抵制", + "包围", + "闪烁", + "驾驭 统治", + "拖拉机", + "斜道", + "箔 金属薄片", + "污点", + "滑动", + "疲惫的", + "可怜的 悲哀的", + "漩涡 打旋", + "类比", + "鞭打", + "拖拉", + "交叉 十字路口", + "迄今", + "查明", + "钝的", + "布道人 讲道人", + "塞入 填塞", + "踏板", + "可行性", + "沉思 冥想", + "悬挂 覆盖", + "夹紧 固定住" + ] +} \ No newline at end of file diff --git a/src/main/java/xyz/scottc/internalVocabPool/SAT3000Level3List03.json b/src/main/java/xyz/scottc/internalVocabPool/SAT3000Level3List03.json new file mode 100644 index 0000000..f295142 --- /dev/null +++ b/src/main/java/xyz/scottc/internalVocabPool/SAT3000Level3List03.json @@ -0,0 +1,204 @@ +{ + "questions": [ + "blush", + "masculine", + "crest", + "customary", + "fiddle", + "parlor", + "lurk", + "sprinkle", + "villain", + "torment", + "preclude", + "trek", + "stifle", + "rotten", + "avert", + "slack", + "bowel", + "Pope", + "lime", + "exacerbate", + "recess", + "grease", + "picturesque", + "repeal", + "mesh", + "intercourse", + "yearn", + "limp", + "howl", + "squat", + "shred", + "rake", + "nude", + "blot", + "slick", + "vomit", + "dictatorship", + "streamline", + "chuckle", + "mortal", + "fixture", + "grumble", + "rumble", + "forensic", + "bog", + "overhaul", + "comrade", + "jockey", + "rash", + "pervasive", + "shear", + "yen", + "rugged", + "lush", + "mar", + "hurl", + "hiss", + "anthropologist", + "trot", + "mustache", + "whine", + "continuum", + "vocational", + "wield", + "wink", + "assassinate", + "markedly", + "pneumonia", + "conjure", + "fortress", + "flex", + "hygiene", + "shudder", + "snapshot", + "arithmetic", + "conspicuous", + "sling", + "lust", + "bracelet", + "proprietor", + "corpse", + "presumption", + "muster", + "bandage", + "foe", + "disseminate", + "waive", + "frantic", + "monarch", + "nudge", + "salient", + "fret", + "oust", + "tornado", + "jargon", + "itch", + "frail", + "ramble", + "scorn" + ], + "answers": [ + "脸红 惭愧", + "男性的", + "到达顶点", + "习惯上的", + "不停摆动", + "客厅", + "潜藏", + "洒 撒", + "恶棍", + "折磨", + "排除 预防 阻止", + "缓慢旅行", + "扼杀 抑制", + "腐烂的", + "避开 移开 预防", + "松弛的 疏忽 松懈", + "脏 腹脏", + "教皇", + "酸橙", + "加剧 恶化", + "休息", + "加润滑油", + "如画的", + "废除", + "网状物", + "交往 交流", + "渴望 向往 同情", + "柔软的", + "嚎叫 哀嚎", + "蹲下", + "切成碎片", + "耙 搜索", + "裸体的", + "污点 玷污", + "光滑的 灵巧的", + "呕吐物", + "专政", + "使成流线型", + "咯咯笑", + "终有一死的 致命的", + "固定装置", + "抱怨", + "发出隆隆声", + "法庭的 法院的", + "沼泽", + "彻底检修 全面修订", + "朋友", + "欺骗", + "爆发", + "弥漫的", + "剪羊毛 剥夺", + "日元", + "崎岖的", + "茂盛的 丰富的", + "损坏 玷污", + "投掷", + "发出嘶嘶声", + "人类学家", + "小跑 快步走", + "胡须", + "哀叫 抱怨", + "连续统一体", + "行业的 业余的", + "使用 掌握", + "眨眼", + "暗杀", + "明显的", + "肺炎", + "用魔术变出 想起", + "堡垒", + "弯曲 ", + "卫生", + "颤抖 战栗", + "拍快照", + "算数的", + "明显的", + "投掷", + "性欲", + "项链", + "所有者 经营者", + "尸体", + "假设 假定", + "集合 聚集", + "绷带", + "敌人", + "传播", + "免除", + "狂乱的 发狂的", + "君主", + "轻推 接近", + "突出的 显著的", + "烦扰 恼怒", + "驱逐", + "龙卷风", + "行话", + "痒", + "虚弱的", + "闲逛 闲谈", + "轻视 不屑" + ] +} \ No newline at end of file diff --git a/src/main/java/xyz/scottc/internalVocabPool/SAT3000Level3List04.json b/src/main/java/xyz/scottc/internalVocabPool/SAT3000Level3List04.json new file mode 100644 index 0000000..8457778 --- /dev/null +++ b/src/main/java/xyz/scottc/internalVocabPool/SAT3000Level3List04.json @@ -0,0 +1,198 @@ +{ + "questions": [ + "wail", + "municipality", + "relinquish", + "clad", + "ail", + "creek", + "vengeance", + "cardinal", + "shriek", + "surrogate", + "slant", + "sabotage", + "wrath", + "interrogate", + "pitfall", + "stoop", + "puncture", + "resilient", + "splinter", + "tickle", + "redress", + "tenet", + "hone", + "scour", + "stale", + "relegate", + "undue", + "rebuke", + "elude", + "detergent", + "fray", + "avail", + "flutter", + "riddle", + "strangle", + "bluff", + "notch", + "mumble", + "banish", + "wade", + "fanatic", + "burglar", + "swoop", + "patriot", + "entrench", + "erotic", + "metabolic", + "sleek", + "flurry", + "scribble", + "automotive", + "aura", + "anthem", + "taunt", + "neutron", + "scarlet", + "incense", + "roundabout", + "rampant", + "rapture", + "inverse", + "gorge", + "barb", + "solitude", + "humility", + "microscopic", + "incubate", + "saga", + "secretion", + "devoid", + "mule", + "haze", + "pulp", + "whirl", + "illicit", + "hideous", + "antenna", + "palette", + "imperialism", + "whack", + "downright", + "eerie", + "hustle", + "concur", + "flea", + "rusty", + "taper", + "dispel", + "covet", + "infiltrate", + "stout", + "methane", + "synonymous", + "stamina", + "obscene", + "enclave" + ], + "answers": [ + "恸哭 悲叹", + "当局 自治市", + "放弃", + "覆盖的 穿衣的", + "使苦恼 使生病", + "小河 小溪", + "复仇", + "红衣主教 主要的", + "尖叫", + "替代 代替", + "倾斜的", + "蓄意破坏", + "盛怒", + "质询", + "陷阱", + "屈尊", + "穿刺", + "有弹性的", + "碎片", + "痒", + "补偿 纠正", + "信条", + "磨刀", + "彻底冲洗 冲刷", + "陈腐的", + "降低 移交", + "过度的 未到期的", + "指责", + "躲避", + "洗涤剂", + "磨损", + "用处 效用", + "振翅而飞", + "谜", + "把\u2026勒死", + "虚张声势", + "档次 等级", + "嘟囔", + "驱逐", + "涉水而行", + "狂热的", + "入室盗窃", + "俯冲", + "爱国者", + "驻防 驻守", + "色情的", + "新陈代谢的", + "油滑的", + "疾风", + "潦草", + "汽车的 自动的", + "气氛", + "国歌", + "奚落 逗弄", + "中子", + "猩红色", + "焚香 使发怒", + "迂回的", + "猖獗的", + "断裂", + "逆的", + "峡谷", + "倒钩", + "孤独", + "谦逊 ", + "微观的", + "孵卵", + "长篇故事 传奇故事", + "分泌", + "缺乏的", + "骡子", + "阴霾 雾霾", + "浆", + "回旋", + "违法的", + "极丑的", + "触角 天线", + "调色板", + "帝国主义", + "重击", + "完全的 彻底的", + "古怪的", + "快速的", + "一致同意", + "跳蚤", + "锈的", + "逐渐减少", + "驱逐", + "觊觎", + "渗透 过滤", + "矮胖的", + "甲烷", + "同义的", + "坚毅的", + "使发怒,焚香", + "飞地" + ] +} \ No newline at end of file diff --git a/src/main/java/xyz/scottc/internalVocabPool/SAT3000Level3List05.json b/src/main/java/xyz/scottc/internalVocabPool/SAT3000Level3List05.json new file mode 100644 index 0000000..0135d37 --- /dev/null +++ b/src/main/java/xyz/scottc/internalVocabPool/SAT3000Level3List05.json @@ -0,0 +1,190 @@ +{ + "questions": [ + "fraternity", + "obligate", + "precarious", + "throng", + "quaint", + "bombard", + "fable", + "feud", + "protract", + "dissipate", + "mischief", + "ledger", + "monstrous", + "clench", + "relapse", + "fresco", + "lunatic", + "anesthetic", + "queer", + "grotesque", + "prick", + "flair", + "knuckle", + "caterpillar", + "sluggish", + "stiffen", + "hearth", + "espionage", + "punitive", + "confiscate", + "fixation", + "scold", + "ebb", + "bonfire", + "counteract", + "superstition", + "disconcert", + "pedigree", + "tint", + "pathogen", + "hump", + "crackle", + "horde", + "paternal", + "throb", + "corollary", + "conservatory", + "errand", + "rapport", + "trample", + "tamper", + "guild", + "prelude", + "unwind", + "ruffle", + "scorch", + "clot", + "revamp", + "disband", + "saliva", + "tremor", + "forfeit", + "gulp", + "trifle", + "perjury", + "bogus", + "ransom", + "suffocate", + "majestic", + "hive", + "ghastly", + "tantrum", + "ferocious", + "strew", + "endemic", + "infuse", + "seclude", + "ooze", + "pry", + "promulgate", + "deadlock", + "exasperate", + "treason", + "gild", + "instantaneous", + "amiable", + "retaliate", + "curfew", + "uncanny", + "plunder", + "gush", + "strife" + ], + "answers": [ + "友善 友爱", + "迫使", + "不稳定的 ", + "一大群 人群", + "古色古香的", + "炮击 轰击", + "寓言 传说", + "长期不和 争执", + "延长 伸展", + "分发 发散 驱散 消失", + "恶作剧", + "账单", + "巨大的", + "紧握", + "复发", + "壁画", + "狂热的", + "麻醉剂", + "奇怪的", + "奇异古怪的", + "刺 戳", + "天资", + "关节", + "毛虫", + "萧条的 迟缓的", + "变硬", + "灶台", + "间谍活动", + "惩罚性的", + "没收", + "痴迷", + "责骂", + "减退", + "篝火", + "取消", + "迷信", + "使不安 使为难", + "家谱 血统", + "淡色 色彩", + "病原体", + "突起的物体", + "发出噼啪声", + "一大群", + "父亲的", + "抽动 颤动", + "必然的结论 推论", + "温室", + "差事", + "融洽 密切关系 ", + "践踏 蔑视 伤害", + "纂改 损害 削弱", + "协会", + "序曲 开端", + "解开 解放", + "弄皱", + "烧焦的", + "凝块", + "改进", + "解散", + "唾液", + "小地震 震颤", + "罚金,没收物,丧失的东西", + "吞咽", + "琐事 少量", + "伪证 伪善", + "假的 伪造的", + "赎回", + "使窒息", + "威严的", + "蜂巢", + "可怕的", + "发脾气 发怒", + "凶猛的 残忍的", + "散播 洒满", + "本地的", + "注入 传输", + "使隔开", + "渗出", + "撬", + "宣告 颁布 公布", + "僵局", + "激怒 触怒", + "背叛 叛国", + "镀金", + "瞬间的 即刻的", + "和蔼可亲的 有爱的", + "报复 反击", + "宵禁令", + "离奇的 可怕的", + "抢夺 抢夺品", + "涌出", + "冲突" + ] +} \ No newline at end of file diff --git a/src/main/java/xyz/scottc/internalVocabPool/SAT3000Level3List06.json b/src/main/java/xyz/scottc/internalVocabPool/SAT3000Level3List06.json new file mode 100644 index 0000000..cd2d871 --- /dev/null +++ b/src/main/java/xyz/scottc/internalVocabPool/SAT3000Level3List06.json @@ -0,0 +1,188 @@ +{ + "questions": [ + "crutch", + "goggle", + "pane", + "neon", + "remuneration", + "retribution", + "sanity", + "wry", + "animosity", + "resound", + "gust", + "tavern", + "dosage", + "cyclical", + "vista", + "overture", + "ripe", + "superimpose", + "mime", + "eschew", + "rendition", + "squander", + "glimmer", + "margarine", + "retract", + "condone", + "tingle", + "genesis", + "replenish", + "uproar", + "buoy", + "sanitation", + "elucidate", + "scoff", + "hoot", + "rehabilitate", + "righteous", + "daze", + "babble", + "appease", + "besiege", + "sear", + "liquidation", + "kinetic", + "scuttle", + "spire", + "catapult", + "serpent", + "conveyance", + "inconceivable", + "debacle", + "vertex", + "meditate", + "detest", + "bosom", + "instigate", + "pamper", + "distraught", + "magnification", + "quell", + "custodian", + "doze", + "fiasco", + "cringe", + "tarnish", + "panorama", + "supplant", + "vulture", + "flinch", + "meddle", + "halo", + "malice", + "trudge", + "congregate", + "italic", + "vile", + "outstrip", + "exalt", + "euphoria", + "apex", + "rummage", + "ingest", + "benefactor", + "inexplicable", + "nocturnal", + "porous", + "raucous", + "dabble", + "swerve", + "inert", + "grimace" + ], + "answers": [ + "支持", + "瞪视 护目镜", + "窗格玻璃", + "霓虹", + "酬金", + "应得的惩罚 赔偿", + "精神正常", + "挖苦 讽刺", + "敌意", + "回响 回声", + "一阵狂风", + "小酒馆 客栈", + "剂量", + "循环的", + "景色", + "开端 序曲", + "成熟的", + "重叠 安装", + "哑剧", + "闪避", + "演绎", + "挥霍", + "闪光", + "人造黄油", + "退回 ", + "宽恕 赦免", + "刺痛", + "起源 根源", + "再装满", + "喧闹", + "鼓励 使上升", + "公共设施", + "阐明", + "嘲笑 愚弄 笑柄", + "汽车喇叭声 叫骂声", + "恢复", + "正义的", + "使茫然 头晕目眩", + "喋喋不休", + "使平息", + "包围 围住", + "使\u2026烧焦", + "清算 液化", + "动力学", + "小步疾走", + "尖顶", + "弹弓", + "巨蛇", + "运输工具 运输", + "不能想象的 不可思议的", + "崩溃 灾难", + "顶点", + "冥想 考虑 计划", + "憎恨 厌恶", + "乳房 亲密的", + "煽动", + "纵容", + "心烦意乱的", + "放大", + "消除 镇压", + "管理人员", + "打瞌睡", + "惨败", + "收缩", + "玷污", + "全景", + "提供者", + "秃鹫 贪婪的人", + "退缩 畏惧", + "干涉", + "光环", + "恶意", + "跋涉", + "使集合 聚集", + "斜体的", + "恶毒的 卑鄙的 低廉的", + "超过 胜过", + "赞扬 提升 拔升", + "狂喜", + "使达到顶点", + "翻找 翻寻", + "摄入", + "捐助者", + "无法说明的 费解的", + "夜间的", + "有孔的", + "粗声的 沙哑的", + "浅尝", + "转弯 转向", + "惰性的", + "扮鬼脸" + ] +} \ No newline at end of file diff --git a/src/main/java/xyz/scottc/internalVocabPool/SAT3000Level3List07.json b/src/main/java/xyz/scottc/internalVocabPool/SAT3000Level3List07.json new file mode 100644 index 0000000..4c1f31d --- /dev/null +++ b/src/main/java/xyz/scottc/internalVocabPool/SAT3000Level3List07.json @@ -0,0 +1,200 @@ +{ + "questions": [ + "garnish", + "meltdown", + "droop", + "fictitious", + "wand", + "fussy", + "solace", + "troupe", + "hobble", + "dew", + "esoteric", + "gully", + "unruly", + "rescind", + "anomalous", + "forsake", + "swipe", + "sterilize", + "bicker", + "annotate", + "alkaline", + "truss", + "impenetrable", + "boulevard", + "predate", + "hash", + "bemuse", + "petrify", + "attune", + "innocuous", + "notoriety", + "resonant", + "cavern", + "hoax", + "coffer", + "quail", + "prodigious", + "hoe", + "courtier", + "rebuff", + "manicure", + "reverberate", + "sedentary", + "resolute", + "allegory", + "invigorate", + "cursory", + "decry", + "unparalleled", + "gobble", + "vanguard", + "befall", + "impotent", + "gallant", + "incriminate", + "finesse", + "autocratic", + "haggle", + "repent", + "strident", + "append", + "discord", + "recline", + "truncate", + "regress", + "compatriot", + "lenient", + "extol", + "sulk", + "embroil", + "stammer", + "interject", + "glee", + "stow", + "gratuitous", + "stutter", + "contiguous", + "sonar", + "sidestep", + "speckle", + "impel", + "crafty", + "collate", + "fanfare", + "hulk", + "altruism", + "froth", + "usurp", + "judicious", + "consecrate", + "obedient", + "melodramatic", + "fungal", + "prank", + "boisterous", + "methodical", + "intrepid" + ], + "answers": [ + "装饰", + "崩溃", + "垂头丧气", + "假的", + "魔杖", + "挑剔的 过分装饰的", + "慰藉", + "演出团", + "跛行 阻碍", + "露水", + "深奥难懂的", + "水沟", + "难控制的", + "撤销", + "异常的", + "放弃", + "挥击", + "给\u2026消毒", + "争吵", + "给\u2026做注释", + "碱", + "扎紧", + "无法穿透的", + "林荫大道", + "早于", + "切碎的食物 搞糟", + "使迷惑 使茫然", + "石化", + "使适应 使协调", + "无害的", + "臭名昭著", + "洪亮的 引起回响的", + "大洞穴", + "哄骗", + "保险柜 金库", + "畏缩", + "巨大的", + "锄头", + "朝臣 奉承者", + "拒绝", + "修指甲", + "回响", + "静止的 久坐的", + "坚决的", + "寓言", + "使充满活力", + "匆忙的", + "公开谴责", + "空前的", + "狼吞虎咽", + "先锋", + "降临", + "无效的 无能的", + "勇敢的 狭义的", + "控告", + "技巧 策略", + "独裁的", + "讨价还价", + "忏悔", + "刺耳的 强硬的", + "附加", + "不一致 争吵", + "使后倾", + "缩短", + "倒退", + "同胞 同国人", + "仁慈的", + "赞美 赞扬", + "生气 愠怒", + "使卷入", + "结巴 口吃", + "插话", + "高兴", + "塞进 装填", + "多余的 免费的", + "结巴 口吃", + "毗邻的", + "声纳", + "避开", + "斑点", + "迫使", + "狡猾的", + "整理 校对", + "响声 炫耀", + "庞然大物", + "利他主义", + "起泡沫", + "篡夺", + "明智的", + "圣化", + "顺从的", + "夸张的", + "真菌的", + "恶作剧", + "喧闹的", + "有条理的", + "无畏的" + ] +} \ No newline at end of file diff --git a/src/main/java/xyz/scottc/internalVocabPool/SAT3000Level3List08.json b/src/main/java/xyz/scottc/internalVocabPool/SAT3000Level3List08.json new file mode 100644 index 0000000..54c4728 --- /dev/null +++ b/src/main/java/xyz/scottc/internalVocabPool/SAT3000Level3List08.json @@ -0,0 +1,192 @@ +{ + "questions": [ + "foreclose", + "reticent", + "hermit", + "zest", + "incipient", + "gouge", + "stampede", + "ventilate", + "sanguine", + "terse", + "mascot", + "docile", + "unassuming", + "precipitous", + "fetish", + "antithesis", + "obviate", + "outpouring", + "frenetic", + "dexterity", + "pacify", + "inexorable", + "supple", + "defraud", + "unrelenting", + "hoarse", + "breakout", + "zealous", + "fluoride", + "purveyor", + "fawn", + "suffuse", + "propulsion", + "excruciate", + "nectar", + "progenitor", + "chubby", + "rapture", + "debunk", + "insoluble", + "quench", + "indulgent", + "dainty", + "irradiate", + "decapitate", + "ransack", + "suction", + "summation", + "perspiration", + "dishearten", + "disingenuous", + "transfix", + "gregarious", + "canny", + "heinous", + "derange", + "drowsy", + "wharf", + "parch", + "bewitch", + "fortitude", + "sneaky", + "cipher", + "loath", + "grinder", + "vanquish", + "insinuate", + "introspective", + "recluse", + "gullible", + "frugal", + "repugnant", + "tussle", + "lubricant", + "impregnate", + "inhalation", + "tassel", + "kindle", + "emancipate", + "amicable", + "preconceive", + "innuendo", + "castigate", + "indiscretion", + "confederate", + "indistinct", + "tendril", + "perfunctory", + "debase", + "tribulation", + "orb", + "overbear", + "valiant" + ], + "answers": [ + "取消抵押品赎回权", + "缄默的", + "隐士", + "热情 兴奋", + "刚开始的", + "凿", + "人群 蜂拥", + "通风 发表 表达", + "乐观的", + "简洁的", + "吉祥物", + "温顺的", + "谦逊的", + "陡峭的 突然的 鲁莽的", + "喜爱", + "对立面", + "避免 消除", + "流露", + "发狂的", + "灵巧 敏捷", + "安抚", + "不可阻挡的 无情", + "柔软的 顺从的", + "欺骗", + "不间断的", + "嘶哑的", + "爆发", + "热心的 热情的", + "氟化物", + "供应者", + "奉承", + "使充满", + "推进", + "折磨 极大痛苦", + "花蜜", + "祖先", + "丰满的", + "狂喜", + "揭穿 拆穿", + "不可溶的", + "熄灭 ", + "放纵的", + "精巧的 精致的", + "照亮 使发光", + "砍掉\u2026的头", + "洗劫", + "吸", + "总结", + "汗水", + "使沮丧", + "不诚实的 不真诚的", + "使惊呆", + "爱交际的", + "精明的", + "道德败坏的 极坏的", + "打乱 使精神错乱", + "昏昏欲睡的", + "码头 停泊处", + "烤 焦干", + "使着迷 使迷惑", + "坚忍不拔", + "鬼鬼祟祟的", + "密码 暗号", + "不情愿", + "磨粉机", + "攻克 克服 抑制", + "暗示 旁敲侧击", + "反省的 内省的", + "隐居者", + "易受骗的", + "节俭的 朴素的", + "令人厌恶的 矛盾的", + "扭打 打斗", + "润滑的", + "渗透 使怀孕", + "吸入", + "流苏", + "点燃 激起", + "解放 释放", + "有爱的", + "预想 预见", + "影射 暗讽 讽刺", + "严厉批评 谴责", + "轻率 言行失检", + "同党 共犯", + "不清楚的 模糊的", + "一束 一缕", + "敷衍的", + "贬低", + "磨难", + "球状物", + "克服 镇压", + "勇敢的" + ] +} \ No newline at end of file diff --git a/src/main/java/xyz/scottc/internalVocabPool/SAT3000Level3List09.json b/src/main/java/xyz/scottc/internalVocabPool/SAT3000Level3List09.json new file mode 100644 index 0000000..f66e243 --- /dev/null +++ b/src/main/java/xyz/scottc/internalVocabPool/SAT3000Level3List09.json @@ -0,0 +1,204 @@ +{ + "questions": [ + "schism", + "bisect", + "unfurl", + "combative", + "fortuitous", + "oblong", + "spatter", + "wily", + "swelter", + "somersault", + "repulse", + "inscrutable", + "chlorophyll", + "hieroglyphic", + "paleontologist", + "trite", + "merciful", + "honk", + "decoy", + "concord", + "receptacle", + "resuscitate", + "molt", + "venerate", + "voracious", + "premeditate", + "fastidious", + "kickback", + "extort", + "pedantic", + "loll", + "cobblestone", + "offbeat", + "ratchet", + "unbridle", + "dimple", + "propound", + "behemoth", + "doodle", + "begrudge", + "scoundrel", + "reprehensible", + "variegate", + "hexagonal", + "cosmonaut", + "indefatigable", + "incise", + "disavow", + "javelin", + "despondent", + "ebullient", + "encumber", + "morose", + "decibel", + "studious", + "jovial", + "stoic", + "swindle", + "drudgery", + "tinkle", + "recant", + "unwitting", + "voluptuous", + "lullaby", + "unremitting", + "misconstrue", + "demure", + "naivete", + "detonation", + "geyser", + "humdrum", + "centennial", + "figment", + "listless", + "frolic", + "infernal", + "missive", + "inimical", + "refract", + "garble", + "merriment", + "entreat", + "pliable", + "carnivorous", + "askew", + "fuzz", + "freewheel", + "undulation", + "droll", + "demagogue", + "torrid", + "insipid", + "vacuous", + "quixotic", + "embezzle", + "palatial", + "rectitude", + "orangutan", + "elixir" + ], + "answers": [ + "分裂 分歧", + "等分", + "展开", + "战斗的", + "偶然的", + "长方形", + "溅射", + "诡计多端的", + "酷热难当的", + "翻滚 翻筋斗", + "击退", + "不可预测的 谜一样的", + "叶绿素", + "象形文字", + "古生物学家", + "陈腐的 平庸的", + "仁慈的", + "鹅叫声", + "诱饵", + "一致 和谐", + "容器", + "恢复", + "换羽脱毛", + "尊敬", + "贪吃的 狼吞虎咽的", + "预谋", + "一丝不苟的 过分严谨的", + "佣金 回馈", + "敲诈 侵占", + "学究式的", + "懒洋洋地靠着", + "圆石", + "不寻常的 非传统的", + "锯齿条 小幅提升", + "去掉辔头 不受控制的", + "激起涟漪", + "提出\u2026供考虑", + "巨大的 巨兽", + "涂鸦", + "嫉妒 怨恨", + "无赖", + "应受谴责的", + "使多样化 使斑驳", + "六角形的", + "俄宇航员", + "不知疲倦的", + "切割 切", + "否认 否定", + "标枪", + "沮丧的", + "热情洋溢的", + "阻塞 妨碍", + "抑郁的 闷闷不乐的", + "分贝", + "用功的 热心的", + "欢乐的", + "坚忍的", + "诈骗", + "苦工 苦差事", + "叮当响", + "宣布放弃", + "不知情的", + "性感的 丰满的", + "摇篮曲", + "不懈的 不间断的", + "误解", + "端庄的 严肃的", + "天真", + "引爆", + "间歇喷泉", + "单调的 无聊的", + "百年周年纪念日", + "臆想的事物", + "无精打采的", + "起泡沫", + "地狱的", + "信件 公函", + "不友好的", + "折射", + "纂改", + "欢乐", + "恳求 ", + "可弯曲的", + "食肉的", + "偏斜", + "绒毛", + "滑行 凭惯性前进", + "波动", + "滑稽", + "煽动者", + "热情的", + "枯燥的 单调的", + "空虚的", + "唐吉坷德式的", + "盗用 贪污", + "堂皇的 宏伟的 壮丽的", + "公正 诚实", + "猩猩", + "圣水" + ] +} \ No newline at end of file diff --git a/src/main/java/xyz/scottc/internalVocabPool/SAT3000Level3List10.json b/src/main/java/xyz/scottc/internalVocabPool/SAT3000Level3List10.json new file mode 100644 index 0000000..1f997b9 --- /dev/null +++ b/src/main/java/xyz/scottc/internalVocabPool/SAT3000Level3List10.json @@ -0,0 +1,298 @@ +{ + "questions": [ + "misshapen", + "otherness", + "vacillate", + "fatalistic", + "repetitious", + "telepathy", + "keystone", + "impostor", + "filial", + "outsmart", + "periodicity", + "deject", + "magnetize", + "aurora", + "exultant", + "efface", + "reprove", + "egotism", + "halcyon", + "garrulous", + "dilettante", + "dissolute", + "insolence", + "bashful", + "effervescent", + "limber", + "satiric", + "parabola", + "inchoate", + "actuate", + "insuperable", + "fecund", + "recapitulation", + "countermand", + "lionize", + "enunciation", + "indolence", + "herbivorous", + "entrain", + "satiate", + "recommence", + "propellant", + "stratus", + "quitter", + "loquacious", + "beguile", + "camphor", + "pileup", + "largess", + "misanthrope", + "raconteur", + "equilateral", + "verbose", + "avocation", + "flume", + "abash", + "malevolence", + "unwonted", + "irresolute", + "counterclockwise", + "enervate", + "torpid", + "precession", + "sagacious", + "timorous", + "demoralization", + "onomatopoeia", + "irretrievable", + "importunity", + "munificent", + "immure", + "relict", + "mockingbird", + "faddish", + "abdicate", + "blow over", + "breeding", + "caress", + "clipping", + "comedown", + "correctitude", + "creeping", + "criteria", + "crooked", + "cupidity", + "cut back", + "debark", + "denunciate", + "dispirit", + "dissolve", + "distillate", + "don", + "embank", + "ennui", + "extemporize", + "façade", + "forbid", + "fungi", + "glowing", + "hat trick", + "Hispanic", + "impending", + "indissoluble", + "inefficacious", + "infection", + "intemperance", + "keep track of", + "long to", + "luminousness", + "magnanimity", + "migrator", + "monologue", + "mortgage", + "nagging", + "overexertion", + "palpable", + "palliate", + "premeditate", + "plough", + "quivering", + "ragged", + "reacquaint", + "reduce to", + "refashion", + "resigned", + "revival", + "rousing", + "self-absorption", + "self-deluding", + "self-propelled", + "self-righteous", + "set forth", + "soak into", + "smother", + "Spartan", + "spring up", + "subtract", + "take credit for", + "taper", + "tiptoe", + "top-notch", + "unbundle", + "untangle", + "wind up", + "zombify", + "supernovae" + ], + "answers": [ + "畸形的 歪曲", + "相异 不同", + "犹豫", + "宿命论的", + "重复的", + "心灵感应", + "主旨", + "骗子", + "子女的", + "在智力上超过", + "周期性", + "拒绝", + "磁化", + "极光 曙光", + "狂喜的", + "擦除", + "责骂 谴责", + "个人主义", + "太平的 安详的", + "喋喋不休的 多嘴的", + "业余", + "放荡的 淫乱的", + "傲慢", + "害羞的 腼腆的", + "冒泡的 兴奋的", + "柔软的 敏捷的", + "讽刺的", + "抛物线", + "早期的 刚开始的", + "开动 促使", + "不可克服的", + "多产的 丰饶的", + "摘要", + "取消", + "吹捧 奉为名人", + "表明 宣言 发表", + "懒惰", + "食草的", + "乘火车", + "充分满足", + "重新开始", + "推进物", + "层云", + "虎头蛇尾的人", + "健谈的", + "使迷惑", + "樟脑", + "累计", + "恩惠物品", + "反人类者", + "健谈者", + "等边的", + "啰嗦的", + "业余爱好", + "使用水槽饮水", + "使困窘 害羞", + "恶意", + "异常的", + "优柔寡断的", + "逆时针的", + "使无力", + "麻木的", + "运动 旋进", + "明智的", + "羞怯的", + "道德败坏", + "拟声法", + "不可挽回的", + "强求", + "慷慨的", + "禁闭 监禁", + "遗迹", + "知更鸟", + "流行的", + "退出 退位", + "消散 平息", + "饲养 繁殖", + "爱抚 拥抱", + "剪报", + "衰落 没落", + "得体 端正", + "爬行的", + "准则 标准", + "歪曲的", + "贪婪 贪心", + "减少 削减", + "卸载 下船", + "谴责 抨击", + "使沮丧 使气馁", + "溶解", + "蒸馏液", + "先生 阁下", + "筑堤防护", + "厌倦 无聊", + "即兴表演", + "房屋正面 假象", + "禁止", + "真菌", + "炽热的 发光", + "帽子戏法", + "西班牙人的", + "即将到来的", + "不能分解的", + "无用的", + "感染", + "放纵", + "记录", + "渴望", + "明亮", + "慷慨 宽宏大量", + "候鸟 移居者", + "独白", + "抵押", + "挑剔的 唠叨的", + "用力过猛", + "明显的", + "减轻 减缓", + "预谋", + "犁地", + "颤抖的", + "衣衫褴褛的", + "重新认识", + "减少到", + "重做 重新设计", + "温顺的 顺从的", + "复活 再生", + "鼓舞人心的", + "聚精会神", + "自欺欺人的", + "自立推进的", + "伪善的 自以为是的", + "提出 陈述", + "渗入", + "窒息", + "斯巴达式的", + "涌现", + "-", + "归功于", + "逐渐减少", + "踮着脚走", + "出众的", + "分类交易", + "解开 解决", + "收尾 ", + "使僵化", + "超新星" + ] +} \ No newline at end of file diff --git a/src/main/java/xyz/scottc/utils/AfColumnLayout.java b/src/main/java/xyz/scottc/utils/AfColumnLayout.java new file mode 100644 index 0000000..86bfd89 --- /dev/null +++ b/src/main/java/xyz/scottc/utils/AfColumnLayout.java @@ -0,0 +1,212 @@ +package xyz.scottc.utils; + +import java.awt.*; +import java.util.ArrayList; +import java.util.Iterator; +import java.util.List; + +/* 纵向布局器,和 AfYLayout 等效 + * + */ +public class AfColumnLayout implements LayoutManager2 +{ + private List items = new ArrayList<>(); + private int gap = 2; + private boolean usePerferredSize = false; // 竖立方向是否占满 + + public AfColumnLayout() + { + } + public AfColumnLayout(int gap) + { + this.gap = gap; // 控件之间的间距 + } + public AfColumnLayout(int gap, boolean usePerferredSize) + { + this.gap = gap; + this.usePerferredSize = usePerferredSize; + } + + @Override + public void addLayoutComponent(String name, Component comp) + { + Item item = new Item(); + item.comp = comp; + item.constraints = "auto"; + items.add(item); + } + + @Override + public void removeLayoutComponent(Component comp) + { + Iterator iter = items.iterator(); + while(iter.hasNext()) + { + Item item = iter.next(); + if(item.comp == comp) + { + iter.remove(); + } + } + } + + @Override + public void addLayoutComponent(Component comp, Object constraints) + { + Item item = new Item(); + item.comp = comp; + item.constraints = (String) constraints; + items.add(item); + } + + @Override + public Dimension preferredLayoutSize(Container parent) + { + return new Dimension(30,30); + } + + @Override + public Dimension minimumLayoutSize(Container parent) + { + return new Dimension(30,30); + } + + @Override + public Dimension maximumLayoutSize(Container target) + { + return new Dimension(30,30); + } + + + @Override + public void layoutContainer(Container parent) + { + // 得到内矩形 + Rectangle rect = new Rectangle(parent.getWidth(), parent.getHeight()); + //Rectangle rect = parent.getBounds(); + Insets insets = parent.getInsets(); + rect.x += insets.left; + rect.y += insets.top; + rect.width -= (insets.left + insets.right); + rect.height -= (insets.top + insets.bottom); + + // 第一轮:过滤到无效的 Item ( 有些控件是隐藏的 ) + List validItems = new ArrayList<>(); + for(Item it: items ) + { + if(it.comp.isVisible()) + validItems.add(it); + } + + // 第二轮处理:百分比,像素,auto的,直接计算出结果; 权重的,在第三轮计算 + int totalGapSize = gap * (validItems.size() - 1);// 间距大小 + int validSize = rect.height - totalGapSize; + int totalSize = 0; + int totalWeight = 0; + for(Item it : validItems) + { + Dimension preferred = it.comp.getPreferredSize(); + it.width = usePerferredSize ? preferred.width : rect.width; + it.height = preferred.height; + it.weight = 0; + + // 计算宽度 + String cstr = it.constraints; + if( cstr == null || cstr.length() == 0) + { + //System.out.println("(AfColumnLayout) Warn: Must define constraints when added to container!"); + } + else if( cstr.equals("auto")) + { + } + else if(cstr.endsWith("%")) // 按百分比 + { + int num = Integer.valueOf(cstr.substring(0,cstr.length()-1)); + it.height = validSize * num / 100; + } + else if(cstr.endsWith("w")) // 按权重 + { + int num = Integer.valueOf(cstr.substring(0,cstr.length()-1)); + it.height = 0; + it.weight = num; + } + else if(cstr.endsWith("px")) // 按权重 + { + int num = Integer.valueOf(cstr.substring(0,cstr.length()-2)); + it.height = num; + } + else // 按像素 + { + int num = Integer.valueOf(cstr); + it.height = num; + } + + totalSize += it.height; + totalWeight += it.weight; + + //System.out.println("计算值:width=" + it.width + ",weight=" + it.weight); + } + + // 第三轮: 剩余空间按权重分配 + if( totalWeight > 0) + { + int remainSize = validSize - totalSize; + double unit = (double) remainSize / totalWeight; + for(Item it : validItems) + { + if(it.weight > 0) + { + it.height = (int)( unit * it.weight ); + } + } + } + + //System.out.println("总宽度: " + rect.width); + + // 第四轮: 按宽度和高度布局 + int y = 0; + for(Item it : validItems) + { + int x = 0; // 水平靠左 + if(y + it.height > rect.height) + it.height = rect.height - y; + if(it.height <= 0) break; + + it.comp.setBounds(rect.x + x, rect.y + y, it.width, it.height); + + //System.out.println("宽度: " + it.width); + y += it.height; + y += gap; // 间距 + } + } + + @Override + public float getLayoutAlignmentX(Container target) + { + return 0; + } + + @Override + public float getLayoutAlignmentY(Container target) + { + return 0; + } + + @Override + public void invalidateLayout(Container target) + { + + } + + /////////////////////// + private static class Item + { + Component comp; + String constraints = "auto"; + int width = 0; + int height = 0; + int weight = 0; // 权重 + } + + +} diff --git a/src/main/java/xyz/scottc/utils/AfRowLayout.java b/src/main/java/xyz/scottc/utils/AfRowLayout.java new file mode 100644 index 0000000..4ea10f6 --- /dev/null +++ b/src/main/java/xyz/scottc/utils/AfRowLayout.java @@ -0,0 +1,212 @@ +package xyz.scottc.utils; + +import java.awt.*; +import java.util.ArrayList; +import java.util.Iterator; +import java.util.List; + +/* 横向布局器,和 AfXLayout 等效 + * + */ +public class AfRowLayout implements LayoutManager2 +{ + private List items = new ArrayList<>(); + private int gap = 2; + private boolean usePerferredSize = false; // 竖立方向是否占满 + + public AfRowLayout() + { + } + public AfRowLayout(int gap) + { + this.gap = gap; // 控件之间的间距 + } + public AfRowLayout(int gap, boolean usePerferredSize) + { + this.gap = gap; + this.usePerferredSize = usePerferredSize; + } + + @Override + public void addLayoutComponent(String name, Component comp) + { + Item item = new Item(); + item.comp = comp; + item.constraints = "auto"; + items.add(item); + } + + @Override + public void removeLayoutComponent(Component comp) + { + Iterator iter = items.iterator(); + while(iter.hasNext()) + { + Item item = iter.next(); + if(item.comp == comp) + { + iter.remove(); + } + } + } + + @Override + public void addLayoutComponent(Component comp, Object constraints) + { + Item item = new Item(); + item.comp = comp; + item.constraints = (String) constraints; + items.add(item); + } + + @Override + public Dimension preferredLayoutSize(Container parent) + { + return new Dimension(30,30); + } + + @Override + public Dimension minimumLayoutSize(Container parent) + { + return new Dimension(30,30); + } + + @Override + public Dimension maximumLayoutSize(Container target) + { + return new Dimension(30,30); + } + + + @Override + public void layoutContainer(Container parent) + { + // 得到内矩形 + Rectangle rect = new Rectangle(parent.getWidth(), parent.getHeight()); + //Rectangle rect = parent.getBounds(); + Insets insets = parent.getInsets(); + rect.x += insets.left; + rect.y += insets.top; + rect.width -= (insets.left + insets.right); + rect.height -= (insets.top + insets.bottom); + + // 第一轮:过滤到无效的 Item ( 有些控件是隐藏的 ) + List validItems = new ArrayList<>(); + for(Item it: items ) + { + if(it.comp.isVisible()) + validItems.add(it); + } + + // 第二轮处理:百分比,像素,auto的,直接计算出结果; 权重的,在第三轮计算 + int totalGapSize = gap * (validItems.size() - 1);// 间距大小 + int validSize = rect.width - totalGapSize; + int totalSize = 0; + int totalWeight = 0; + for(Item it : validItems) + { + Dimension preferred = it.comp.getPreferredSize(); + it.width = preferred.width; + it.height = usePerferredSize ? preferred.height : rect.height; + it.weight = 0; + + // 计算宽度 + String cstr = it.constraints; + if( cstr == null || cstr.length() == 0) + { + //System.out.println("(AfRowLayout) Warn: Must define constraints when added to container!"); + } + else if( cstr.equals("auto")) + { + } + else if(cstr.endsWith("%")) // 按百分比 + { + int num = Integer.valueOf(cstr.substring(0,cstr.length()-1)); + it.width = validSize * num / 100; + } + else if(cstr.endsWith("w")) // 按权重 + { + int num = Integer.valueOf(cstr.substring(0,cstr.length()-1)); + it.width = 0; + it.weight = num; + } + else if(cstr.endsWith("px")) // 按权重 + { + int num = Integer.valueOf(cstr.substring(0,cstr.length()-2)); + it.width = num; + } + else // 按像素 + { + int num = Integer.valueOf(cstr); + it.width = num; + } + + totalSize += it.width; + totalWeight += it.weight; + + //System.out.println("计算值:width=" + it.width + ",weight=" + it.weight); + } + + // 第三轮: 剩余空间按权重分配 + if( totalWeight > 0) + { + int remainSize = validSize - totalSize; + double unit = (double) remainSize / totalWeight; + for(Item it : validItems) + { + if(it.weight > 0) + { + it.width = (int)( unit * it.weight ); + } + } + } + + //System.out.println("总宽度: " + rect.width); + + // 第四轮: 按宽度和高度布局 + int x = 0; + for(Item it : validItems) + { + int y = (rect.height - it.height)/2; + if(x + it.width > rect.width) + it.width = rect.width - x; + if(it.width <= 0) break; + + it.comp.setBounds(rect.x + x, rect.y + y, it.width, it.height); + + //System.out.println("宽度: " + it.width); + x += it.width; + x += gap; // 间距 + } + } + + @Override + public float getLayoutAlignmentX(Container target) + { + return 0; + } + + @Override + public float getLayoutAlignmentY(Container target) + { + return 0; + } + + @Override + public void invalidateLayout(Container target) + { + + } + + /////////////////////// + private static class Item + { + Component comp; + String constraints = "auto"; + int width = 0; + int height = 0; + int weight = 0; // 权重 + } + + +} diff --git a/src/main/java/xyz/scottc/utils/BorderUtils.java b/src/main/java/xyz/scottc/utils/BorderUtils.java new file mode 100644 index 0000000..b492be4 --- /dev/null +++ b/src/main/java/xyz/scottc/utils/BorderUtils.java @@ -0,0 +1,44 @@ +package xyz.scottc.utils; + +import javax.swing.*; +import javax.swing.border.Border; +import javax.swing.border.CompoundBorder; +import javax.swing.border.EmptyBorder; + +public class BorderUtils { + + public static void addMargin(JComponent component, int size) { + BorderUtils.addMargin(component, size); + } + + public static void addMargin(JComponent component, int top, int left, int bottom, int right) { + BorderUtils.addOuterBorder(component, new EmptyBorder(top, left, bottom, right)); + } + + public static void addPadding(JComponent component, int size) { + BorderUtils.addPadding(component, size, size, size, size); + } + + public static void addPadding(JComponent component, int top, int left, int bottom, int right) { + BorderUtils.addInnerBorder(component, new EmptyBorder(top, left, bottom, right)); + } + + public static void addOuterBorder(JComponent component, Border outerBorder) { + Border border = component.getBorder(); + if (border != null) { + component.setBorder(new CompoundBorder(border, outerBorder)); + } else { + component.setBorder(outerBorder); + } + } + + public static void addInnerBorder(JComponent component, Border innerBorder) { + Border border = component.getBorder(); + if (border != null) { + component.setBorder(new CompoundBorder(border, innerBorder)); + } else { + component.setBorder(innerBorder); + } + } + +} diff --git a/src/main/java/xyz/scottc/utils/FileUtils.java b/src/main/java/xyz/scottc/utils/FileUtils.java new file mode 100644 index 0000000..ade503d --- /dev/null +++ b/src/main/java/xyz/scottc/utils/FileUtils.java @@ -0,0 +1,89 @@ +package xyz.scottc.utils; + +import java.io.*; +import java.net.FileNameMap; +import java.net.URLDecoder; + +public class FileUtils { + + public static File getDirectoryFile(Object object) { + if (object != null) { + String path = object.getClass().getProtectionDomain().getCodeSource().getLocation().getPath(); + try { + path = URLDecoder.decode(path, "UTF-8"); + File file = new File(path); + return file.getParentFile(); + } catch (UnsupportedEncodingException e) { + e.printStackTrace(); + } + } + System.out.println("FileUtils.getDirectory null"); + return null; + } + + public static void copyFile(File file, File targetDirectory) { + copyFile(file, targetDirectory.getAbsolutePath()); + } + + public static void copyFile(File file, String targetDirectory) { + InputStream inputStream = null; + OutputStream outputStream = null; + try { + inputStream = new FileInputStream(file); + outputStream = new FileOutputStream(targetDirectory + "/" + file.getName()); + byte[] buffer = new byte[1024]; + int length; + while ((length = inputStream.read(buffer)) != -1) { + outputStream.write(buffer, 0, length); + } + outputStream.flush(); + } catch (IOException e) { + e.printStackTrace(); + } finally { + if (inputStream != null) { + try { + inputStream.close(); + } catch (IOException e) { + e.printStackTrace(); + } + } + if (outputStream != null) { + try { + outputStream.close(); + } catch (IOException e) { + e.printStackTrace(); + } + } + } + } + + public static void copyFile(InputStream inputStream, File targetDir, String fileName) { + OutputStream outputStream = null; + try { + outputStream = new FileOutputStream(targetDir + "/" + fileName); + byte[] buffer = new byte[1024]; + int length = 0; + while((length = inputStream.read(buffer)) != -1) { + outputStream.write(buffer, 0, length); + } + outputStream.flush(); + } catch (IOException exception) { + exception.printStackTrace(); + } finally { + if (inputStream != null) { + try { + inputStream.close(); + } catch (IOException exception) { + exception.printStackTrace(); + } + } + if (outputStream != null) { + try { + outputStream.close(); + } catch (IOException exception) { + exception.printStackTrace(); + } + } + } + } +} diff --git a/src/main/java/xyz/scottc/utils/ImageZoomUtils.java b/src/main/java/xyz/scottc/utils/ImageZoomUtils.java new file mode 100644 index 0000000..79f5edd --- /dev/null +++ b/src/main/java/xyz/scottc/utils/ImageZoomUtils.java @@ -0,0 +1,82 @@ +package xyz.scottc.utils; + +import javax.swing.*; +import java.awt.*; +import java.awt.image.ImageObserver; + +public class ImageZoomUtils { + + private static int width; + private static int height; + private static int finalWidth; + private static int finalHeight; + + public static void fit(JComponent component, Graphics g, Image image, ImageObserver observer, int xOffset, int yOffset) { + if (component != null && image != null) { + ratioHandler(component, image, observer); + g.drawImage(image, xOffset, yOffset, finalWidth, finalHeight, observer); + } + } + + public static void fitCenter(JComponent component, Graphics g, Image image, ImageObserver observer) { + if (component != null && image != null) { + ratioHandler(component, image, observer); + + int xOffset = (width - finalWidth) / 2; + int yOffset = (height - finalHeight) / 2; + + g.drawImage(image, xOffset, yOffset, finalWidth, finalHeight, observer); + } + } + + public static void fitTopLeft(JComponent component, Graphics g, Image image, ImageObserver observer) { + ImageZoomUtils.fit(component, g, image, observer, 0, 0); + } + + public static void fitTopRight(JComponent component, Graphics g, Image image, ImageObserver observer) { + if (component != null && image != null) { + ratioHandler(component, image, observer); + + int xOffset = width - finalWidth; + int yOffset = 0; + + g.drawImage(image, xOffset, yOffset, finalWidth, finalHeight, observer); + } + } + + public static void fitBottomLeft(JComponent component, Graphics g, Image image, ImageObserver observer) { + if (component != null && image != null) { + ratioHandler(component, image, observer); + + int xOffset = 0; + int yOffset = height - finalHeight; + + g.drawImage(image, xOffset, yOffset, finalWidth, finalHeight, observer); + } + } + + public static void fitBottomRight(JComponent component, Graphics g, Image image, ImageObserver observer) { + if (component != null && image != null) { + ratioHandler(component, image, observer); + + int xOffset = width - finalWidth; + int yOffset = height - finalHeight; + + g.drawImage(image, xOffset, yOffset, finalWidth, finalHeight, observer); + } + } + + private static void ratioHandler(JComponent component, Image image, ImageObserver observer) { + width = component.getWidth(); + height = component.getHeight(); + int imageWidth = image.getWidth(observer); + int imageHeight = image.getHeight(observer); + + finalWidth = width; + finalHeight = finalWidth * imageHeight / imageWidth; + if (finalHeight > height) { + finalHeight = height; + finalWidth = finalHeight * imageWidth / imageHeight; + } + } +} diff --git a/src/main/java/xyz/scottc/utils/JSONUtils.java b/src/main/java/xyz/scottc/utils/JSONUtils.java new file mode 100644 index 0000000..448c17d --- /dev/null +++ b/src/main/java/xyz/scottc/utils/JSONUtils.java @@ -0,0 +1,96 @@ +package xyz.scottc.utils; + +import org.json.JSONArray; +import org.json.JSONObject; + +import java.io.*; +import java.util.ArrayList; +import java.util.List; + +public class JSONUtils { + + public static void toFile(Object json, File file, String encoding){ + String jsonString; + //判断是否为json对象 + if (json instanceof JSONObject) { + jsonString = ((JSONObject) json).toString(2); + } else if(json instanceof JSONArray) { + jsonString = ((JSONArray) json).toString(2); + } else { + System.out.println("[ERROR] Invalid Json Object! (Shoule be JSONObject or JSONArray)"); + return; + } + + //存入文件 + OutputStream outputStream = null; + try { + outputStream = new FileOutputStream(file); + // UTF-8写入BOM头部 + encoding = encoding.toUpperCase(); + if("UTF-8".equals(encoding)) + { + byte[] bom = {(byte) 0xEF, (byte) 0xBB, (byte) 0xBF}; + outputStream.write(bom); + } + outputStream.flush(); + //写入文件 + byte[] buffer = jsonString.getBytes(); + outputStream.write(buffer); + outputStream.flush(); + } catch (IOException exception) { + exception.printStackTrace(); + } finally { + if (outputStream != null) { + try { + outputStream.close(); + } catch (IOException exception) { + exception.printStackTrace(); + } + } + } + } + + public static Object fromFile(File file, String encoding) throws Exception { + InputStream inputStream = null; + try { + inputStream = new FileInputStream(file); + long fileLength = file.length(); + byte[] buffer = new byte[(int) fileLength]; + int length = inputStream.read(buffer); + + int offset = 0; + encoding = encoding.toUpperCase(); + if(length > 3 && "UTF-8".equals(encoding)) + { + if (buffer[0] == (byte)0xEF && buffer[1]==(byte)0xBB && buffer[2] == (byte)0xBF) offset = 3; // 前3个字节是BOM + } + String jsonString = new String(buffer, offset, length - offset, encoding); + + if (jsonString.trim().startsWith("{")) { + return new JSONObject(jsonString); + } + if (jsonString.trim().startsWith("[")) { + return new JSONArray(jsonString); + } + } catch (Exception e) { + e.printStackTrace(); + } finally { + if (inputStream != null) { + try { + inputStream.close(); + } catch (IOException exception) { + exception.printStackTrace(); + } + } + } + throw new Exception("Invalid Json File"); + } + + public static List JSONArrayToArrayList(JSONArray jsonArray) { + List list = new ArrayList<>(); + for (Object object : jsonArray) { + list.add(object.toString()); + } + return list; + } +} diff --git a/src/main/java/xyz/scottc/utils/LineSeparator.java b/src/main/java/xyz/scottc/utils/LineSeparator.java new file mode 100644 index 0000000..7dd7964 --- /dev/null +++ b/src/main/java/xyz/scottc/utils/LineSeparator.java @@ -0,0 +1,46 @@ +package xyz.scottc.utils; + +import javax.swing.*; +import java.awt.*; + +public class LineSeparator extends JPanel { + + public static final int HORIZONTAL = 0; + public static final int VERTICAL = 1; + + private int length; + private int type; + + private int width; + private int height; + + public LineSeparator(int type, int length) { + this.type = type; + this.length = length; + } + + @Override + protected void paintComponent(Graphics g) { + super.paintComponent(g); + this.width = this.getWidth(); + this.height = this.getHeight(); + + //清空显示 + g.clearRect(0, 0, width, height); + g.setColor(this.getParent().getBackground()); + g.fillRect(0, 0, width, height); + + int widthCenter = this.width / 2; + int heightCenter = this.height / 2; + + g.setColor(Color.BLACK); + switch (this.type) { + case HORIZONTAL: + g.drawLine(0, heightCenter, this.length, heightCenter); + break; + case VERTICAL: + g.drawLine(widthCenter, 0, widthCenter, this.length); + break; + } + } +} diff --git a/src/main/java/xyz/scottc/utils/RowLayout.java b/src/main/java/xyz/scottc/utils/RowLayout.java new file mode 100644 index 0000000..c97bc11 --- /dev/null +++ b/src/main/java/xyz/scottc/utils/RowLayout.java @@ -0,0 +1,81 @@ +package xyz.scottc.utils; + +import java.awt.*; +import java.util.ArrayList; +import java.util.List; + +public class RowLayout implements LayoutManager2 { + + private List items = new ArrayList<>(); + + @Override + public void addLayoutComponent(Component comp, Object constraints) { + Item item = new Item(); + item.component = comp; + item.constraints = constraints.toString(); + items.add(item); + } + + @Override + public void addLayoutComponent(String name, Component comp) { + Item item = new Item(); + item.component = comp; + item.constraints = "auto"; + items.add(item); + } + + @Override + public void removeLayoutComponent(Component comp) { + for (Item item : items) { + if (item.component == comp) { + items.remove(items.indexOf(item)); + } + } + } + + @Override + public Dimension maximumLayoutSize(Container target) { + return null; + } + + @Override + public float getLayoutAlignmentX(Container target) { + return 0; + } + + @Override + public float getLayoutAlignmentY(Container target) { + return 0; + } + + @Override + public void invalidateLayout(Container target) { + + } + + @Override + public Dimension preferredLayoutSize(Container parent) { + return null; + } + + @Override + public Dimension minimumLayoutSize(Container parent) { + return null; + } + + @Override + public void layoutContainer(Container parent) { + //得到内矩形 + Rectangle rectangle = parent.getBounds(); + + } + + private static class Item { + Component component; + String constraints = "auto"; + int width = 0; + int height = 0; + int weight = 0; + } + +} diff --git a/src/main/java/xyz/scottc/utils/UtilColorfulLabel.java b/src/main/java/xyz/scottc/utils/UtilColorfulLabel.java new file mode 100644 index 0000000..e363b56 --- /dev/null +++ b/src/main/java/xyz/scottc/utils/UtilColorfulLabel.java @@ -0,0 +1,15 @@ +package xyz.scottc.utils; + +import javax.swing.*; +import java.awt.*; + +public class UtilColorfulLabel extends JLabel { + + public UtilColorfulLabel(String text, Color background, int fontSize) { + super(text); + this.setOpaque(true); + this.setBackground(background); + this.setHorizontalAlignment(SwingConstants.CENTER); + this.setFont(new Font("", Font.BOLD, fontSize)); + } +} diff --git a/src/main/java/xyz/scottc/utils/UtilImageComponent.java b/src/main/java/xyz/scottc/utils/UtilImageComponent.java new file mode 100644 index 0000000..38810e4 --- /dev/null +++ b/src/main/java/xyz/scottc/utils/UtilImageComponent.java @@ -0,0 +1,93 @@ +package xyz.scottc.utils; + +import javax.swing.*; +import java.awt.*; + +public class UtilImageComponent extends JPanel { + + private Image image; + private Color backgroundColor; + private FitTypes type; + + public UtilImageComponent() { + this.setOpaque(false); + } + + public UtilImageComponent(Image image, FitTypes type) { + this.image = image; + this.type = type; + this.setOpaque(false); + } + + public void setPreferredSizeInX(int x) { + int y = x * image.getHeight(null) / image.getWidth(null); + super.setPreferredSize(new Dimension(x, y)); + } + + public void setPreferredSizeInY(int y) { + int x = image.getWidth(null) * y / image.getHeight(null); + super.setPreferredSize(new Dimension(x, y)); + } + + @Override + protected void paintComponent(Graphics g) { + super.paintComponent(g); + int width = this.getWidth(); + int height = this.getHeight(); + + //Background Color + g.setColor(this.backgroundColor); + g.fillRect(0, 0, width, height); + + //Image + if (this.image != null) { + switch (this.type) { + case FIT_CENTER: + ImageZoomUtils.fitCenter(this, g, this.image, null); + break; + case FIT_TOP_LEFT: + ImageZoomUtils.fitTopLeft(this, g, this.image, null); + break; + case FIT_TOP_RIGHT: + ImageZoomUtils.fitTopRight(this, g, this.image, null); + break; + case FIT_BOTTOM_LEFT: + ImageZoomUtils.fitBottomLeft(this, g, this.image, null); + break; + case FIT_BOTTOM_RIGHT: + ImageZoomUtils.fitBottomRight(this, g, this.image, null); + break; + } + } + } + + public Image getImage() { + return image; + } + + public void setImage(Image image) { + this.image = image; + this.repaint(); + } + + public Color getBackgroundColor() { + return this.backgroundColor; + } + + public void setBackgroundColor(Color backgroundColor) { + this.backgroundColor = backgroundColor; + this.repaint(); + } + + public FitTypes getType() { + return type; + } + + public void setType(FitTypes type) { + this.type = type; + } + + public enum FitTypes{ + FIT_CENTER, FIT_TOP_LEFT, FIT_TOP_RIGHT, FIT_BOTTOM_LEFT, FIT_BOTTOM_RIGHT; + } +} diff --git a/src/main/java/xyz/scottc/utils/UtilJButton.java b/src/main/java/xyz/scottc/utils/UtilJButton.java new file mode 100644 index 0000000..ad24e84 --- /dev/null +++ b/src/main/java/xyz/scottc/utils/UtilJButton.java @@ -0,0 +1,18 @@ +package xyz.scottc.utils; + +import javax.swing.*; +import java.awt.*; + +public class UtilJButton extends JButton { + + public UtilJButton(String text, int size) { + super(text); + this.setFont(new Font("微软雅黑", Font.BOLD, size)); + } + + public UtilJButton(String text, int size, Icon icon) { + super(text, icon); + this.setFont(new Font("微软雅黑", Font.BOLD, size)); + } + +} diff --git a/src/main/java/xyz/scottc/utils/UtilJCheckBox.java b/src/main/java/xyz/scottc/utils/UtilJCheckBox.java new file mode 100644 index 0000000..031dc09 --- /dev/null +++ b/src/main/java/xyz/scottc/utils/UtilJCheckBox.java @@ -0,0 +1,12 @@ +package xyz.scottc.utils; + +import javax.swing.*; +import java.awt.*; + +public class UtilJCheckBox extends JCheckBox { + + public UtilJCheckBox(String text, Font font) { + super(text); + this.setFont(font); + } +} diff --git a/src/main/java/xyz/scottc/utils/UtilJLabel.java b/src/main/java/xyz/scottc/utils/UtilJLabel.java new file mode 100644 index 0000000..00589bf --- /dev/null +++ b/src/main/java/xyz/scottc/utils/UtilJLabel.java @@ -0,0 +1,24 @@ +package xyz.scottc.utils; + +import javax.swing.*; +import java.awt.*; + +public class UtilJLabel extends JLabel { + + public UtilJLabel() { + this(VDConstantsUtils.EMPTY, null); + } + + public UtilJLabel(Font font) { + this(VDConstantsUtils.EMPTY, font); + } + + public UtilJLabel(String text) { + this(text, null); + } + + public UtilJLabel(String text, Font font) { + super(text); + this.setFont(font); + } +} diff --git a/src/main/java/xyz/scottc/utils/UtilJPanel.java b/src/main/java/xyz/scottc/utils/UtilJPanel.java new file mode 100644 index 0000000..1ca1d2f --- /dev/null +++ b/src/main/java/xyz/scottc/utils/UtilJPanel.java @@ -0,0 +1,92 @@ +package xyz.scottc.utils; + +import javax.swing.*; +import java.awt.*; + +public class UtilJPanel extends JPanel { + + private Image backgroundImage; + private Color backgroundImageMask; + + public int width; + public int height; + + public UtilJPanel() { + this.setOpaque(false); + } + + public UtilJPanel(LayoutManager layout) { + super(layout); + this.setOpaque(false); + } + + public UtilJPanel(LayoutManager layout, Image backgroundImage, Color backgroundImageMask) { + super(layout); + this.backgroundImage = backgroundImage; + this.backgroundImageMask = backgroundImageMask; + } + + public UtilJPanel addPadding(int top, int left, int bottom, int right) { + BorderUtils.addPadding(this, top, left, bottom, right); + return this; + } + + public UtilJPanel addPadding(int size) { + return this.addPadding(size, size, size, size); + } + + public UtilJPanel addMargin(int top, int left, int bottom, int right) { + BorderUtils.addMargin(this, top, left, bottom, right); + return this; + } + + public UtilJPanel addMargin(int size) { + return this.addMargin(size, size, size, size); + } + + public UtilJPanel setBackGround(Color color) { + this.setOpaque(true); + this.setBackground(color); + return this; + } + + public UtilJPanel setPreferredWidth(int width) { + Dimension size = this.getPreferredSize(); + if (size == null) size = new Dimension(0, 0); + size.width = width; + this.setPreferredSize(size); + return this; + } + + public UtilJPanel setPreferredHeight(int height) { + Dimension size = this.getPreferredSize(); + if (size == null) size = new Dimension(0, 0); + size.height = height; + this.setPreferredSize(size); + return this; + } + + @Override + protected void paintComponent(Graphics g) { + super.paintComponent(g); + + //如果传入了背景图片就添加背景图片 + this.addBackgroundImage(g); + + this.width = this.getWidth(); + this.height = this.getHeight(); + } + + private void addBackgroundImage(Graphics g) { + if (this.backgroundImage != null) { + int width = this.getWidth(); + int height = this.getHeight(); + g.clearRect(0, 0, width, height); + g.drawImage(this.backgroundImage, 0, 0, width, height, null); + + //背景图片蒙版 + g.setColor(backgroundImageMask); + g.fillRect(0, 0, width, height); + } + } +} diff --git a/src/main/java/xyz/scottc/utils/VDAmountDisplay.java b/src/main/java/xyz/scottc/utils/VDAmountDisplay.java new file mode 100644 index 0000000..939fdd4 --- /dev/null +++ b/src/main/java/xyz/scottc/utils/VDAmountDisplay.java @@ -0,0 +1,42 @@ +package xyz.scottc.utils; + +import java.awt.*; + +public class VDAmountDisplay extends UtilJLabel{ + + private int currentAmount = 0; + private int totalAmount = 0; + + public VDAmountDisplay(Font font) { + super(font); + this.setText(this.currentAmount + "/" + this.totalAmount); + } + + private void update() { + this.setText(this.currentAmount + "/" + this.totalAmount); + } + + public void stop() { + this.currentAmount = 0; + this.totalAmount = 0; + this.update(); + } + + public int getCurrentAmount() { + return currentAmount; + } + + public void setCurrentAmount(int currentAmount) { + this.currentAmount = currentAmount; + this.update(); + } + + public int getTotalAmount() { + return totalAmount; + } + + public void setTotalAmount(int totalAmount) { + this.totalAmount = totalAmount; + this.update(); + } +} diff --git a/src/main/java/xyz/scottc/utils/VDConstantsUtils.java b/src/main/java/xyz/scottc/utils/VDConstantsUtils.java new file mode 100644 index 0000000..810620d --- /dev/null +++ b/src/main/java/xyz/scottc/utils/VDConstantsUtils.java @@ -0,0 +1,42 @@ +package xyz.scottc.utils; + +import javax.swing.*; +import java.awt.*; +import java.util.ArrayList; +import java.util.List; + +public class VDConstantsUtils { + + public static final String NAME = "Vocabulary Decoder"; + public static final String ABOUT = "Author: Scott\nEmail: ScottCTD@outlook.com"; + public static final String HELP = "Common Mode:\nAnswer the meaning of a vocabulary \nor the correspond vocabulary of it's \nmeaning. You can check the answer \nwhen you are answring."; + public static final String EMPTY = ""; + public static final String SPACE = " "; + public static final String WARNING_TITLE = "Ops"; + public static final String QUESTION_TITLE = "Yes or No?"; + + public static final Font MICROSOFT_YAHEI_PLAIN_15 = new Font("微软雅黑", Font.PLAIN, 15); + public static final Font MICROSOFT_YAHEI_PLAIN_20 = new Font("微软雅黑", Font.PLAIN, 20); + public static final Font MICROSOFT_YAHEI_BOLD_30 = new Font("微软雅黑", Font.BOLD, 30); + public static final Font MICROSOFT_YAHEI_BOLD_40 = new Font("微软雅黑", Font.BOLD, 40); + public static final Font MICROSOFT_YAHEI_BOLD_60 = new Font("微软雅黑", Font.BOLD, 60); + public static final Font MICROSOFT_YAHEI_BOLD_80 = new Font("微软雅黑", Font.BOLD, 80); + + public static void showWarningMessage(Component parent, String message) { + JOptionPane.showConfirmDialog(parent, message, WARNING_TITLE, JOptionPane.DEFAULT_OPTION, JOptionPane.WARNING_MESSAGE); + } + + public static int showQuestionMessgae(Component parent, String message) { + return JOptionPane.showConfirmDialog(parent, message, QUESTION_TITLE, JOptionPane.YES_NO_CANCEL_OPTION, + JOptionPane.QUESTION_MESSAGE); + } + + public static void interconvertList(List list01, List list02) { + List temp = new ArrayList<>(list01); + list01.clear(); + list01.addAll(list02); + list02.clear(); + list02.addAll(temp); + } + +} diff --git a/src/main/java/xyz/scottc/utils/VDMenu.java b/src/main/java/xyz/scottc/utils/VDMenu.java new file mode 100644 index 0000000..45d3be6 --- /dev/null +++ b/src/main/java/xyz/scottc/utils/VDMenu.java @@ -0,0 +1,12 @@ +package xyz.scottc.utils; + +import javax.swing.*; +import java.awt.*; + +public class VDMenu extends JMenu { + + public VDMenu(String s) { + super(s); + this.setFont(new Font("", Font.PLAIN, 20)); + } +} diff --git a/src/main/java/xyz/scottc/utils/VDMenuItem.java b/src/main/java/xyz/scottc/utils/VDMenuItem.java new file mode 100644 index 0000000..e37ac7a --- /dev/null +++ b/src/main/java/xyz/scottc/utils/VDMenuItem.java @@ -0,0 +1,12 @@ +package xyz.scottc.utils; + +import javax.swing.*; +import java.awt.*; + +public class VDMenuItem extends JMenuItem { + + public VDMenuItem(String text) { + super(text); + this.setFont(new Font("", Font.PLAIN, 15)); + } +} diff --git a/src/main/java/xyz/scottc/utils/VDTextArea.java b/src/main/java/xyz/scottc/utils/VDTextArea.java new file mode 100644 index 0000000..8d1342e --- /dev/null +++ b/src/main/java/xyz/scottc/utils/VDTextArea.java @@ -0,0 +1,32 @@ +package xyz.scottc.utils; + +import javax.swing.*; +import java.awt.*; + +public class VDTextArea extends JTextArea { + + public VDTextArea(String text, Font font) { + this(text, 0, 0, font, true, false); + } + + public VDTextArea(int rows, int columns, Font font, boolean enable, boolean enter) { + this(VDConstantsUtils.EMPTY, rows, columns, font, enable, enter); + } + + public VDTextArea(String text, int rows, int columns, Font font) { + this(text, rows, columns, font, true, false); + } + + public VDTextArea(String text, int rows, int columns, Font font, boolean enable, boolean enter) { + super(text, rows, columns); + this.setFont(font); + this.setEnabled(enable); + this.setDisabledTextColor(Color.BLACK); + + if (enter) { + //prevent enter from wrapping line + KeyStroke enterKey = KeyStroke.getKeyStroke("ENTER"); + this.getInputMap().put(enterKey, "none"); + } + } +} diff --git a/src/main/java/xyz/scottc/utils/VDTimer.java b/src/main/java/xyz/scottc/utils/VDTimer.java new file mode 100644 index 0000000..b4eb1da --- /dev/null +++ b/src/main/java/xyz/scottc/utils/VDTimer.java @@ -0,0 +1,93 @@ +package xyz.scottc.utils; + +import javax.swing.*; +import java.awt.*; + +public class VDTimer extends JLabel { + + Thread timer; + + private boolean init = false; + private boolean suspend = false; + + private int second; + private int minute; + private int hour; + + public VDTimer() { + this.setText("0:0:0"); + this.setFont(new Font("微软雅黑", Font.PLAIN, 23)); + } + + public void startFromZero() { + this.start(0, 0, 0); + } + + public void start(int second, int minute, int hour) { + if (!this.init) { + this.second = second; + this.minute = minute; + this.hour = hour; + this.init = true; + timer = new Thread(new TimerThread()); + timer.start(); + } + } + + public void suspend() { + if (this.init && !this.suspend) { + this.suspend = true; + } + } + + public void continu() { + if (this.init && this.suspend) { + this.suspend = false; + } + } + + public void stop() { + if (this.init) { + this.init = false; + this.second = 0; + this.minute = 0; + this.hour = 0; + this.setText("0:0:0"); + } + } + + private class TimerThread implements Runnable { + + @Override + public void run() { + while (init) { + if (!suspend) { + try { + if (second + 1 >= 60) { + second = 0; + if (minute + 1 >= 60) { + minute = 0; + hour++; + } else { + minute++; + } + } else { + second++; + } + setText(hour + ":" + minute + ":" + second); + Thread.sleep(995); + } catch (InterruptedException e) { + e.printStackTrace(); + } + } else { + Thread.yield(); + try { + Thread.sleep(1000); + } catch (InterruptedException e) { + e.printStackTrace(); + } + } + } + } + } +} diff --git a/src/test/java/FilesWalkTest01.java b/src/test/java/FilesWalkTest01.java new file mode 100644 index 0000000..14676e0 --- /dev/null +++ b/src/test/java/FilesWalkTest01.java @@ -0,0 +1,16 @@ +import java.io.IOException; +import java.nio.file.Files; +import java.nio.file.Path; +import java.nio.file.Paths; +import java.util.stream.Stream; + +public class FilesWalkTest01 { + + public static void main(String[] args) throws IOException { + + String path = "D:\\Download"; + + Stream pathStream = Files.walk(Paths.get(path)); + pathStream.forEach(System.out::println); + } +} diff --git a/src/test/java/TestFrameSize.java b/src/test/java/TestFrameSize.java new file mode 100644 index 0000000..cceb7cf --- /dev/null +++ b/src/test/java/TestFrameSize.java @@ -0,0 +1,32 @@ +import xyz.scottc.utils.UtilJPanel; + +import javax.swing.*; + +/* +left right bottom 9 +top 38 + */ +public class TestFrameSize extends JFrame { + + private final UtilJPanel rootPanel = new UtilJPanel(); + + public static void main(String[] args) { + TestFrameSize testFrameSize = new TestFrameSize(); + testFrameSize.init(); + } + + private void init() { + this.setSize(1000, 1000); + this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); + this.setResizable(false); + this.setVisible(true); + this.setContentPane(this.rootPanel); + + System.out.println(this.getHeight()); + System.out.println(this.getWidth()); + + System.out.println("========================"); + } + + +} diff --git "a/\346\236\266\346\236\204.md" "b/\346\236\266\346\236\204.md" new file mode 100644 index 0000000..c1a3e8b --- /dev/null +++ "b/\346\236\266\346\236\204.md" @@ -0,0 +1,22 @@ +# Vocab Decoder + +## 功能实现 + +### json导入单词 + +### 输出单词json文件 + +### 正常背单词 + +每一页一个单词 1disabled textfield 1textfield + +1. 英文模式填中文 + 1. 前期自行判断 可以加模糊判断 +2. 中文模式填英文 + 1. 错词马上出现a + +### 多选模式 + +### 考试模式 + +### 各种其他模式 \ No newline at end of file