首页 文章 精选 留言 我的

精选列表

搜索[表格控件],共10000篇文章
优秀的个人博客,低调大师

android在代码中四种设置控件(以及TextView的文字颜色)背景颜色的方法

http://blog.csdn.net/fth826595345/article/details/9208771 主题 TextView 转载请注明出处:http://blog.csdn.net/fth826595345/article/details/9208771 直接上代码吧,注释解说: TextView tText=(TextView) findViewById(R.id.textv_name); //第1种: tText.setTextColor(android.graphics.Color.RED);//系统自带的颜色类 // 第2种: tText.setTextColor(0xffff00ff);//0xffff00ff是int类型的数据,分组一下0x|ff|ff00ff,0x是代表颜色整数的标记,ff是表示透明度,ff00ff表示颜色,注意:这里ffff00ff必须是8个的颜色表示,不接受ff00ff这种6个的颜色表示。 //第3种: tText.setTextColor(android.graphics.Color.parseColor("#87CEFA")) ; //还是利用Color类; //第4种: tText.setTextColor(this.getResources().getColor(R.color.red)); /*通过获得资源文件进行设置。根据不同的情况R.color.red也可以是R.string.red或者R.drawable.red, * 当然前提是需要在相应的配置文件里做相应的配置,如(xml 标签): * * <color name="red">#FF0000</color> <drawable name="red">#FF0000</drawable> <string name="red">#FF0000</string>*/ 本文转自SharkBin博客园博客,原文链接:http://www.cnblogs.com/SharkBin/p/4887547.html,如需转载请自行联系原作者

优秀的个人博客,低调大师

【Android游戏开发二十三】自定义ListView【通用】适配器并实现监听控件!

ListView :在Android应用开发过程中属于最常用的系统组件之一,当然可能童鞋们问为什么会突然游戏开发中讲这个,呵呵,其实在游戏开发中,也会常常使用到系统组件,比如游戏排行榜,简单的游戏关卡选择等等,都可以来使用ListView来实现; 当然关于ListView我想大家都会使用了,那么这篇文章也不是跟大家讲解ListView是如果使用的,而是如何实现自定义一个【通用】适配器类; 在ListView三种适配器当中,最受大家青睐的肯定就是SimpleAdapter适配器,用过的童鞋们都很清楚,它的扩展性很强,可以将ListView中每一项都使用自定义布局,插入N多组件;但是SimpleAdapter也有弱点,那就是当ListView中每一项有Button、CheckBox等这些有事件的组件,我们想监听它们就必须自定义适配器!那么今天的重点也就是来讲解一下如何写一个自定义通用适配器类! SimpleAdapter 构造的时候,我们知道需要五个参数来进行映射数据到ListView中,那么我们今天的自定义通用适配器其实也就是实现系统SimpleAdapter的一个自定义版; OK,可能我说这么多,大家还是不太懂,其实今天要讲述的自定义通用适配器优点有三点: 1.使用通用适配器就不需要每次使用自定义适配器的时候,都要去重新去写一个,太累。。。。 2.构造方法与SimpleAdapter构造方法相同,五个参数也一摸一样! 3.只需要在自定义的适配器类中,将我们需要监听的组件进行设置监听即可!别的代码不需要去改动! 例如我们需要完成下图这种ListView:(图1) 首先我们来完成ListView中每项的布局: main.xml: <?xmlversion="1.0"encoding="utf-8"?> <LinearLayoutxmlns:android="http://schemas.android.com/apk/res/android" android:orientation="horizontal" android:layout_width="fill_parent" android:layout_height="fill_parent" > <ImageView android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/iv" /> <LinearLayout android:orientation="vertical" android:layout_width="wrap_content" android:layout_height="wrap_content" > <TextView android:layout_width="wrap_content" android:layout_height="wrap_content" android:textSize="20sp" android:id="@+id/bigtv" /> <TextView android:layout_width="wrap_content" android:layout_height="wrap_content" android:textSize="10sp" android:id="@+id/smalltv" /> </LinearLayout> <Button android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="button" android:id="@+id/btn" /> <CheckBox android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/cb" /> </LinearLayout> 修改源码:MainActivity.java: publicclassMainActivityextendsActivity{ privateSimpleAdapteradapter;//声明适配器对象 privateListViewlistView;//声明列表视图对象 privateList<Map<String,Object>>list;//声明列表容器 publicstaticMainActivityma; @Override publicvoidonCreate(BundlesavedInstanceState){ super.onCreate(savedInstanceState); ma=this; //实例化列表容器 list=newArrayList<Map<String,Object>>(); listView=newListView(this);//实例化列表视图 //实例一个列表数据容器 Map<String,Object>map=newHashMap<String,Object>(); //往列表容器中添加数据 map.put("item1_imageivew",R.drawable.icon); map.put("item1_bigtv","BIGTV"); map.put("item1_smalltv","SMALLTV"); //将列表数据添加到列表容器中 list.add(map); //--使用系统适配器,无法实现组件监听; ////实例适配器 adapter=newSimpleAdapter(this,list,R.layout.main,newString[]{ "item1_imageivew","item1_bigtv","item1_smalltv"},newint[]{ R.id.iv,R.id.bigtv,R.id.smalltv}); listView.setAdapter(adapter); ////显示列表视图 this.setContentView(listView); } } 到此,我们之前要求完成的(图1)要求的ListView,[对ListView不太熟悉的童鞋自行百度google先学习一下基础吧] 当然这里我们只是完成了界面,如果想监听(图1)中的按钮和复选框事件,那么我们肯定需要自定义一个适配器,那么下面开始介绍如何实现通用适配器: 创建一个新类,类名:“MySimpleAdapter.java”继承BaseAdapter: /** * */ packagecom.himi; importjava.util.List; importjava.util.Map; importandroid.app.AlertDialog; importandroid.content.Context; importandroid.view.LayoutInflater; importandroid.view.View; importandroid.view.ViewGroup; importandroid.widget.BaseAdapter; importandroid.widget.Button; importandroid.widget.CheckBox; importandroid.widget.CompoundButton; importandroid.widget.ImageView; importandroid.widget.TextView; importandroid.widget.CompoundButton.OnCheckedChangeListener; /** *@authorHimi * */ publicclassMySimpleAdapterextendsBaseAdapter{ privateLayoutInflatermInflater; privateList<Map<String,Object>>list; privateintlayoutID; privateStringflag[]; privateintItemIDs[]; publicMySimpleAdapter(Contextcontext,List<Map<String,Object>>list, intlayoutID,Stringflag[],intItemIDs[]){ this.mInflater=LayoutInflater.from(context); this.list=list; this.layoutID=layoutID; this.flag=flag; this.ItemIDs=ItemIDs; } @Override publicintgetCount(){ //TODOAuto-generatedmethodstub returnlist.size(); } @Override publicObjectgetItem(intarg0){ //TODOAuto-generatedmethodstub return0; } @Override publiclonggetItemId(intarg0){ //TODOAuto-generatedmethodstub return0; } @Override publicViewgetView(intposition,ViewconvertView,ViewGroupparent){ convertView=mInflater.inflate(layoutID,null); for(inti=0;i<flag.length;i++){//备注1 if(convertView.findViewById(ItemIDs[i])instanceofImageView){ ImageViewiv=(ImageView)convertView.findViewById(ItemIDs[i]); iv.setBackgroundResource((Integer)list.get(position).get( flag[i])); }elseif(convertView.findViewById(ItemIDs[i])instanceofTextView){ TextViewtv=(TextView)convertView.findViewById(ItemIDs[i]); tv.setText((String)list.get(position).get(flag[i])); }else{ //...备注2 } } addListener(convertView); returnconvertView; } /** *童鞋们只需要将需要设置监听事件的组件写在下面这方法里就可以啦! *别的不需要修改! *备注3 */ publicvoidaddListener(ViewconvertView){ ((Button)convertView.findViewById(R.id.btn)).setOnClickListener( newView.OnClickListener(){ @Override publicvoidonClick(Viewv){ newAlertDialog.Builder(MainActivity.ma) .setTitle("自定义通用SimpleAdapter") .setMessage("按钮成功触发监听事件!") .show(); } }); ((CheckBox)convertView.findViewById(R.id.cb)). setOnCheckedChangeListener(newOnCheckedChangeListener(){ @Override publicvoidonCheckedChanged(CompoundButtonbuttonView,booleanisChecked){ newAlertDialog.Builder(MainActivity.ma) .setTitle("自定义通用SimpleAdapter") .setMessage("CheckBox成功触发状态改变监听事件!") .show(); } }); } } 备注1:这个For循环中是对ListView中每一项中包含所有的组件进行判定每个组件的类型,从而去设置其数据! 其中 《instanceof》这个关键字可能有的童鞋不太熟习,这个是对Object 类型的判断; 这里我只是对ImageView、TextView的类型进行的数据识别,为什么我这里只写了这两种,那是因为Button、CheckBox等这些带事件响应的组件是无法通过适配器映射到ListView上的; 其实关于适配器映射的机制,这里简单说下:例如一个TextView组件,那么在ListView的每一项(List)中put()添加的时候,put()方法中第一个参数key大家知道是用于与适配器进行对应映射数据用的值,那么第二个参数其实就是put进组件的数据;其实当其数据反射在ListViw时,其实内部就是对组件进行实例化,并且对组件设置数据; 备注2 :我这里最后还有一个else{...}这里是留给童鞋们去扩展的,因为可能还有一些其他能映射的组件,所以这里留下接口,供大家扩展; 备注3:addListener(View convertView)这是我留出来的方法,童鞋们只需要将需要设置监听事件的组件写在这方法里就可以啦! 那么看一下我们使用通用监听器的效果吧: OK,很正常!那么在来看看使用系统的SimpleAdapter 与我们自定义的MySimpleAdapter代码对比图:怎么样!构造参数完全一样,而且我们这个比它强大,我们只要去设置下需要监听的组件监听代码就OK了。 娃哈哈,好啦,今天就到这里吧,希望此通用适配器对大家有用! 补充:大家使用自定义适配器的时候,有时候ListView每一项的焦点没有了,比如本文中是因为Button和CheckBox截获了焦点,童鞋们只要将button和checkBox的焦点设置不可见就OK啦。~ xml中focusable是这个属性; android:focusable="false" 这里也提醒一下开发游戏的童鞋们,很多游戏开发者认为开发游戏不用去学习系统组件的使用,不用去沾染xml、布局啥的,其实这么想的童鞋们你们就大错特错了,Android之所以能这么火,其组件的美观占了很重的份量,这么美的组件不用岂不是很浪费!!希望童鞋们对组件不熟悉的游戏开发者都要去学习学习下组件的使用! 源码下载:http://www.himigame.com/android-game/374.html 本文转自 xiaominghimi 51CTO博客,原文链接:http://blog.51cto.com/xiaominghimi/606981,如需转载请自行联系原作者

优秀的个人博客,低调大师

复制走的是数字,留下的是身份:Web 表格里被忽视的数据断层

某制造企业的计划员同时开着系统的两个页面:左边是采购台账,右边是自己整理的到货跟踪表。她从台账里选中几行复制,切到跟踪表粘贴——数字、格式都完好地过来了。看起来一切正常。但系统后端有一套逻辑依赖每个单元格背后挂着的"批次号、来源单据 ID",正是靠这些隐藏标记,跟踪表里的数字才能回溯到原始单据。跨页面这么一复制,值到了,身份没到。当天下午,自动核对的报表开始缺关联,排查了两个小时才发现:问题出在上午那次再平常不过的复制粘贴上。

优秀的个人博客,低调大师

将一个电子表格迁移到MySQL和Spark2.0.1上

把传统数据迁移到现代大数据平台有时是一件很令人畏惧的事,诚然,不是每个人都需要这么去做,但是有时候新的分析方法确实能让人看到数据中的惊喜,Marc Borowczak近日撰文描述了一些方法。 下为译文 PART 1 在这篇简短的指导中,笔者将会简短地回顾一种方法并且用我喜欢的数据集来演示。这不是一个ML库也不是一个Kaggle竞赛的数据集,仅仅是积累了数十年笔者跟踪塑料模型集合产生的数据,如此这般一定会适合传统的标准。 描述的步骤是在笔记本电脑上用VirtualBox运行Ubuntu 16.04.1 LTS Gnome,并且假定你已经保存了一张Excel notebook的CSV格式(或者你已经有了一些现有的CSV文件)。这个例子将使用一个从Excel表中保存的CSV文件,也就是Unbuilt.csv。假定该文件是受保护的,但可以被MySQL 5.7.15访问。这个例子中的CSV位于/var/lib/mysql-files/Unbuilt.csv。以下步骤是必需的: 在MySQL中引入.csv文件,并且可以备份一份压缩的MySQL数据库文件。 连接到在Spark2.0.1上的MySQL数据库然后访问它的的数据:这里将使用jupyter pyspark演示一种交互式的Python方法,并且在下文留下一种基于现有方法的Rstudio Sparkyl访问。 1. 在MySQL表中引入一个.CSV 文件 这一步很容易完成,假设你已经安装完了MySQL。 A. 在MySQL中创建一个新的数据库 首先你需要创建一个新的数据库。简便起见,你以根账户访问MySQL创建一个新的数据库(或者使用任意别的你已经有的用户证书)。对于这个例子来说我们将会创建一个模型数据库,并且挑选它以备使用: marc@marc-VirtualBox:~$ mysql -u root -p Enter password: Welcome to the MySQL monitor. Commands end with ; or \g. Your MySQL connection id is 6 Server version: 5.7.15-0ubuntu0.16.04.1 (Ubuntu) Copyright (c) 2000, 2016, Oracle and/or its affiliates. All rights reserved. Oracle is a registered trademark of Oracle Corporation and/or its affiliates. Other names may be trademarks of their respective owners. Type 'help;' or '\h' for help. Type '\c' to clear the current input statement. mysql> create database models; Query OK, 1 row affected (0.00 sec) mysql> use models; Database changed B. 在你的数据库里创建一个新的表下一步是创建一个表来引入.cvs数据,同时对于每一个领域宣告一种兼容的格式(在这种情况下正在创建一种被称作unbuilt的表) mysql> create table unbuilt ( -> itemid int not null auto_increment, -> iscale int not null, -> type varchar(63) not null, -> subtype varchar(63) not null, -> brand varchar(63) not null, -> model varchar(31) not null, -> description varchar(255) not null, -> msrp decimal(10,2) not null, -> auction decimal(10,2) not null, -> maxval decimal(10,2) not null, -> minval decimal(10,2) not null, -> decals varchar(31) not null, -> remarks varchar(255) not null, -> primary key (itemid) -> ); Query OK, 0 rows affected (0.04 sec) C. 引入CSV数据 最后一步是引入.csv数据到表中 mysql> load data infile '/var/lib/mysql-files/Unbuilt.csv' -> into table unbuilt -> fields terminated by ',' -> lines terminated by '\r\n' -> ignore 1 rows; Query OK, 625 rows affected (0.02 sec) Records: 625 Deleted: 0 Skipped: 0 Warnings: 0 mysql> exit Bye为了完成这次操作,需要在mysql文件夹中采用适当的许可。没有成功从这个位置引入该文件会导致如下错误: ERROR 1290 (HY000): The MySQL server is running with the --secure-file-priv option so it cannot execute this statement对于MySQL安全设置而言,你引用了在线文档。我们接下来描述的以下的可选步骤是为了增强你刚落户于的数据库,并且也在MySQL的文档中描述过。查看示例 htpp://dev.mysql.com/doc/refman/5.7/en/examples.html。 marc@marc-VirtualBox:~$ mysqldump -u root -p --quick models | gzip > models.gz Enter password: 一个快速且明智的检查方法由阅读数据库,挑选表并运行一次快速的查询组成。 marc@marc-VirtualBox:~$ mysql -u root -p models Enter password: Reading table information for completion of table and column names You can turn off this feature to get a quicker startup with -A Welcome to the MySQL monitor. Commands end with ; or \g. Your MySQL connection id is 10 Server version: 5.7.15-0ubuntu0.16.04.1 (Ubuntu) Copyright (c) 2000, 2016, Oracle and/or its affiliates. All rights reserved. Oracle is a registered trademark of Oracle Corporation and/or its affiliates. Other names may be trademarks of their respective owners. Type 'help;' or '\h' for help. Type '\c' to clear the current input statement. mysql> show databases; +--------------------+ | Database | +--------------------+ | information_schema | | metastore_db | | models | | mysql | | performance_schema | | sys | +--------------------+ 6 rows in set (0.00 sec) mysql> show tables; +------------------+ | Tables_in_models | +------------------+ | unbuilt | +------------------+ 1 row in set (0.00 sec) mysql> describe unbuilt; +-------------+---------------+------+-----+---------+----------------+ | Field | Type | Null | Key | Default | Extra | +-------------+---------------+------+-----+---------+----------------+ | itemid | int(11) | NO | PRI | NULL | auto_increment | | iscale | int(11) | NO | | NULL | | | type | varchar(63) | NO | | NULL | | | subtype | varchar(63) | NO | | NULL | | | brand | varchar(63) | NO | | NULL | | | model | varchar(31) | NO | | NULL | | | description | varchar(255) | NO | | NULL | | | msrp | decimal(10,2) | NO | | NULL | | | auction | decimal(10,2) | NO | | NULL | | | maxval | decimal(10,2) | NO | | NULL | | | minval | decimal(10,2) | NO | | NULL | | | decals | varchar(31) | NO | | NULL | | | remarks | varchar(255) | NO | | NULL | | +-------------+---------------+------+-----+---------+----------------+ 13 rows in set (0.00 sec) mysql> select model,description,auction from unbuilt where auction > 250; +-----------+------------------------------------------------------+---------+ | model | description | auction | +-----------+------------------------------------------------------+---------+ | HKM01E04 | B-17G Flying Fortress | 299.00 | | 60311 | Zero Fighter Real Sound Action Set | 487.36 | | VF2405 | P-47D Thunderbolt Gabreski | 480.00 | | PA226 | Phantom Huey Chopper | 570.00 | | 3705 | BB-63 Missouri 'Mighty Mo' with PE and flags | 446.40 | | DBS1-6000 | Ford Mustang Mach I | 299.99 | | H1552-598 | Allison Turboprop Jet Engine Motorized Model 501-DI3 | 365.00 | | 16010 | Harley Davidson FXE1200 Super Glide | 268.40 | | 16041 | Harley Davidson FLSTSB 'Fat Boy' with PE | 270.79 | +-----------+------------------------------------------------------+---------+ 9 rows in set (0.00 sec)用现在迁移到MySQL的数据,我们现在走在了用现代的数据科学工具例如Spark2.0.1来访问它的康庄大道上。 2.在Spark2.0.1中用Jupyter PySpark访问MySQL 先前描述了怎样使用Toree去交互地使用Spark 1.6.1.运行Scala 2.10或者PySpark。Toree最近被更新来支持Scala2.11并且后者的创建已经被改编来运行在2016-10-6发行的Spark2.0.1。 假设你有一个本地Hadoop2.7.2操作版的工作站。一个典型的安装有一个hduser发行,然后我们可以很容易地连接进一个HDFS环境并从专用文件夹发布。 marc@marc-VirtualBox:~$ su hduser Password: hduser@marc-VirtualBox:/home/marc$ start-all.sh This script is Deprecated. Instead use start-dfs.sh and start-yarn.sh Starting namenodes on [localhost] localhost: starting namenode, logging to /usr/local/hadoop/logs/hadoop-hduser-namenode-marc-VirtualBox.out localhost: starting datanode, logging to /usr/local/hadoop/logs/hadoop-hduser-datanode-marc-VirtualBox.out Starting secondary namenodes [0.0.0.0] 0.0.0.0: starting secondarynamenode, logging to /usr/local/hadoop/logs/hadoop-hduser-secondarynamenode-marc-VirtualBox.out starting yarn daemons starting resourcemanager, logging to /usr/local/hadoop/logs/yarn-hduser-resourcemanager-marc-VirtualBox.out localhost: starting nodemanager, logging to /usr/local/hadoop/logs/yarn-hduser-nodemanager-marc-VirtualBox.out hduser@marc-VirtualBox:/home/marc$ su marc Password: marc@marc-VirtualBox:~$ cd spyder marc@marc-VirtualBox:~/spyder$ jupyter notebook ... Starting Spark Kernel with SPARK_HOME=/usr/local/spark [I 12:04:52.486 NotebookApp] Kernel started: 6be7a5b5-3a4e-4eeb-a7ef-de12cbbcf474 Setting default log level to "WARN". To adjust logging level use sc.setLogLevel(newLevel). (Scala,org.apache.toree.kernel.interpreter.scala.ScalaInterpreter@295eaa7c) (PySpark,org.apache.toree.kernel.interpreter.pyspark.PySparkInterpreter@3918c187) (SparkR,org.apache.toree.kernel.interpreter.sparkr.SparkRInterpreter@2c88b9fc) (SQL,org.apache.toree.kernel.interpreter.sql.SqlInterpreter@64dafeed) 16/10/05 12:05:01 WARN Main$$anon$1: No external magics provided to PluginManager! 可以看出,命令打开一个熟悉的jupyter Notebooks并且方便地连接到一个pyspark内核。下面将详细介绍一些访问步骤,以证明连接是可用的。 结论 这应该有助于展示将遗留数据迁移和连接到MySQL的目的。进一步我们回顾了如何使用jupyter notebook访问pyspark和利用Toree/Spark2.0.1提供的交互界面。 真的没有必要放弃遗留数据:将数据迁移到新的平台将使企业能够在更广泛的时间尺度上提取和分析数据,并打开新的方法来利用ML技术,分析结果和对结果采取行动。导入mysql数据就像在R-Studio上操作一样容易。在即将到来的文章中我们将会讨论那条路。 引用 1. MySQL 5.7在线文档 2. 拓展机器学习的方法(第二部分) 3. Apache Spark 2.0.1 在线文档 4. Apache Toree Github 5. Matplotlib 在线文档 PART 2 这里演示了相同的结果可以以更直接的方式实现。我们将要在我们上次使用的相同的平台(Ubuntu 16.04.1 LTS 运行于一个 windows VirtualBox Hadoop 2.7.2 和 Spark 2.0.1)和相同的数据集(我的传统的模型集合Unbuilt.CSV)上阐明这个。我们的目标是展示怎样把数据迁移到Hadoop HDFS并且直接地分析它和使用最新的在一个 Jupyter 笔记本中带有PySpark 2.0.1的 ML工具。 许多有趣的事实可以通过子集的结合被推断出来,过滤并且聚合这些信息,并且也在文档中被记录下来。比如,通过一个折线图我们就能够排出最受欢迎的规模,数量最多的模型和最有价值的项目,通过类别来对模型计数,……并且用现代的ML工具操作这些以前的数据。对大规模数据而言,聚合很容易实现,正如在这里阐明的那样。 这,又一次,服务于展示传统数据的直接迁移的目的。回顾了从Jupyter notebook使用PySpark如何访问并且利用Toree/Spark2.0.1提供的交互式的接口。一个Jupyter notebook也被提供出来帮助你迁移数据。这里可以重申真的没有必要抛弃过去的数据。直接或间接地把数据迁移到新的平台上将会使在更广的时间范围内抽取和分析数据的生意成为可能,并且开启一种新的方法来利用ML技术,分析结果和对发现采取行动。

资源下载

更多资源
Mario

Mario

马里奥是站在游戏界顶峰的超人气多面角色。马里奥靠吃蘑菇成长,特征是大鼻子、头戴帽子、身穿背带裤,还留着胡子。与他的双胞胎兄弟路易基一起,长年担任任天堂的招牌角色。

Nacos

Nacos

Nacos /nɑ:kəʊs/ 是 Dynamic Naming and Configuration Service 的首字母简称,一个易于构建 AI Agent 应用的动态服务发现、配置管理和AI智能体管理平台。Nacos 致力于帮助您发现、配置和管理微服务及AI智能体应用。Nacos 提供了一组简单易用的特性集,帮助您快速实现动态服务发现、服务配置、服务元数据、流量管理。Nacos 帮助您更敏捷和容易地构建、交付和管理微服务平台。

Rocky Linux

Rocky Linux

Rocky Linux(中文名:洛基)是由Gregory Kurtzer于2020年12月发起的企业级Linux发行版,作为CentOS稳定版停止维护后与RHEL(Red Hat Enterprise Linux)完全兼容的开源替代方案,由社区拥有并管理,支持x86_64、aarch64等架构。其通过重新编译RHEL源代码提供长期稳定性,采用模块化包装和SELinux安全架构,默认包含GNOME桌面环境及XFS文件系统,支持十年生命周期更新。

WebStorm

WebStorm

WebStorm 是jetbrains公司旗下一款JavaScript 开发工具。目前已经被广大中国JS开发者誉为“Web前端开发神器”、“最强大的HTML5编辑器”、“最智能的JavaScript IDE”等。与IntelliJ IDEA同源,继承了IntelliJ IDEA强大的JS部分的功能。

用户登录
用户注册