首页 文章 精选 留言 我的

精选列表

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

Android--UI之ImageSwitcher

前言 这篇博客来聊一聊AndroidUI开发中ImageSwitcher控件的使用。ImageSwitcher控件与ImageView类似,都可以用于显示图片,但是ImageSwitcher通过名字可以看出,主要是用于多张图片的切换显示。在本篇博客中,会介绍ImageSwitcher控件的基本属性的设置以及常用方法的调用。在最后会通过一个示例Demo来展示本篇博客中讲到的一些内容。 ImageSwitcher ImageSwitcher是一个图片切换器,它间接继承自FrameLayout类,和ImageView相比,多了一个功能,那就是它说显示的图片切换时,可以设置动画效果,类似于淡进淡出效果,以及左进右出滑动等效果。 既然ImageSwitcher是用来显示图片的控件,AndroidAPI为我们提供了三种不同方法来设定不同的图像来源,方法有: setImageDrawable(Drawable):指定一个Drawable对象,用来给ImageSwitcher显示。 setImageResource(int):指定一个资源的ID,用来给ImageSwitcher显示。 setImageURL(URL):指定一个URL地址,用来给ImageSwitcher显示URL指向的图片资源。 动画效果设定 上面介绍到,ImageSwitcher可以设置图片切换时,动画的效果。对于动画效果的支持,是因为它继承了ViewAnimator类,这个类中定义了两个属性,用来确定切入图片的动画效果和切出图片的动画效果: android:inAnimation:切入图片时的效果。 android:outAnimation:切出图片时的效果。 以上两个属性如果在XML中设定的话,当然可以通过XML资源文件自定义动画效果,但是如果只是想使用Android自带的一些简单的效果的话,需要设置参数为“@android:anim/AnimName”来设定效果,其中AnimName为指定的动画效果。如果在代码中设定的话,可以直接使用setInAnimation()和setOutAnimation()方法。它们都传递一个Animation的抽象对象,Animation用于描述一个动画效果,一般使用一个AnimationUtils的工具类获得。对于动画效果,不是本片博客的重点,关于Android的动画效果,以后再详细讲解。 对于动画效果,一般定义在android.R.anim类中,它是一个final类,以一些int常量的形式,定义的样式,这里仅仅介绍两组样式,淡进淡出效果,以及左进右出滑动效果,如果需要其他效果,可以查阅官方文档。 fede_in:淡进。 fade_out:淡出 slide_in_left:从左滑进。 slide_out_right:从右滑出。 一般使用的话,通过这些常量名称就可以看出是什么效果,这里并不是强制Xxx_in_Xxx就一定对应了setInAnimation()方法,但是一般如果不成组设定的话,效果会很丑,建议还是成组的对应In和Out设定效果。 ViewFactory 在使用ImageSwitcher的时候,有一点特别需要注意的,需要通过setFactory()方法为它设置一个ViewSwitcher.ViewFactory接口,设置这个ViewFactory接口时需要实现makeView()方法,该方法通常会返回一个ImageView,而ImageSwitcher则负责显示这个ImageView。如果不设定ViewFactory的话,ImageSwitcher将无法使用。通过官方文档了解到,setFactory()方法被声明在ViewSwitcher类中,而ImageSwitcher直接继承自ViewSwitcher类。ViewSwitcher的功能与ImageSwitcher类似,只是ImageSwitcher用于展示图片,而ViewSwitcher用于展示一些View视图。 可以这么理解,通过ViewFactory中的makeView()方法返回一个新的View视图,用来放入ViewSwitcher中展示,而对于ImageSwitcher而言,这里通常返回的是一个ImageView。 示例程序 下面通过一个Demo来说明上面讲到的内容。在示例中定义一个ImageSwitcher和两个Button,这两个按钮分别控制着图像的上一张、下一张显示,当然,在资源中必须存在这几个待切换的图片文件。。 布局代码: 1 <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" 2 xmlns:tools="http://schemas.android.com/tools" 3 android:layout_width="match_parent" 4 android:layout_height="match_parent" 5 android:paddingBottom="@dimen/activity_vertical_margin" 6 android:paddingLeft="@dimen/activity_horizontal_margin" 7 android:paddingRight="@dimen/activity_horizontal_margin" 8 android:paddingTop="@dimen/activity_vertical_margin" 9 tools:context=".MainActivity" android:orientation="vertical"> 10 11 <ImageSwitcher 12 android:id="@+id/imageSwitcher1" 13 android:layout_width="fill_parent" 14 android:layout_height="150dp" 15 /> 16 <Button 17 android:id="@+id/btnadd" 18 android:layout_width="fill_parent" 19 android:layout_height="wrap_content" 20 android:text="上一张" /> 21 <Button 22 android:id="@+id/btnSub" 23 android:layout_width="fill_parent" 24 android:layout_height="wrap_content" 25 android:text="下一张" /> 26 </LinearLayout> 实现代码: 1 package com.bgxt.imageswitcherDemo; 2 3 import java.util.ArrayList; 4 import java.util.List; 5 6 import android.os.Bundle; 7 import android.app.Activity; 8 import android.graphics.drawable.Drawable; 9 import android.view.Menu; 10 import android.view.View; 11 import android.view.View.OnClickListener; 12 import android.view.animation.Animation; 13 import android.view.animation.AnimationUtils; 14 import android.widget.Button; 15 import android.widget.ImageSwitcher; 16 import android.widget.ImageView; 17 import android.widget.ViewSwitcher.ViewFactory; 18 19 public class MainActivity extends Activity { 20 private Button btnAdd, btnSub; 21 private ImageSwitcher imageSwitcher; 22 private int index = 0; 23 private List<Drawable> list; 24 25 @Override 26 protected void onCreate(Bundle savedInstanceState) { 27 super.onCreate(savedInstanceState); 28 setContentView(R.layout.activity_main); 29 putData(); 30 imageSwitcher = (ImageSwitcher) findViewById(R.id.imageSwitcher1); 31 btnAdd = (Button) findViewById(R.id.btnadd); 32 btnSub = (Button) findViewById(R.id.btnSub); 33 btnAdd.setOnClickListener(myClick); 34 btnSub.setOnClickListener(myClick); 35 36 //通过代码设定从左缓进,从右换出的效果。 37 imageSwitcher.setInAnimation(AnimationUtils.loadAnimation(MainActivity.this, android.R.anim.slide_in_left)); 38 imageSwitcher.setOutAnimation(AnimationUtils.loadAnimation(MainActivity.this, android.R.anim.slide_out_right)); 39 imageSwitcher.setFactory(new ViewFactory() { 40 41 @Override 42 public View makeView() { 43 // makeView返回的是当前需要显示的ImageView控件,用于填充进ImageSwitcher中。 44 return new ImageView(MainActivity.this); 45 } 46 }); 47 imageSwitcher.setImageDrawable(list.get(0)); 48 } 49 50 @Override 51 public boolean onCreateOptionsMenu(Menu menu) { 52 // Inflate the menu; this adds items to the action bar if it is present. 53 getMenuInflater().inflate(R.menu.main, menu); 54 return true; 55 } 56 57 private View.OnClickListener myClick = new OnClickListener() { 58 59 @Override 60 public void onClick(View v) { 61 switch (v.getId()) { 62 case R.id.btnadd: 63 index--; 64 if(index<0) 65 { 66 //用于循环显示图片 67 index=list.size()-1; 68 } 69 //设定ImageSwitcher显示新图片 70 imageSwitcher.setImageDrawable(list.get(index)); 71 break; 72 73 case R.id.btnSub: 74 index++; 75 if(index>=list.size()) 76 { 77 //用于循环显示图片 78 index=0; 79 } 80 imageSwitcher.setImageDrawable(list.get(index)); 81 break; 82 } 83 } 84 }; 85 86 private void putData() { 87 //填充图片的Drawable资源数组 88 list = new ArrayList<Drawable>(); 89 list.add(getResources().getDrawable(R.drawable.bmp1)); 90 list.add(getResources().getDrawable(R.drawable.bmp2)); 91 list.add(getResources().getDrawable(R.drawable.bmp3)); 92 list.add(getResources().getDrawable(R.drawable.bmp4)); 93 list.add(getResources().getDrawable(R.drawable.bmp5)); 94 } 95 } 效果展示: 源码下载 总结 本篇博客主要讲解了ImageSwitcher的使用方式,而对于其父类ViewSwitcher的使用,大致上与ImageSwitcher相似,只是填充的内容不同而已,一般了解了ImageSwitcher的使用,再看ViewSwitcher就很好理解,以后有时间再详细讲解ViewSwitcher的使用。 本文转自承香墨影博客园博客,原文链接:http://www.cnblogs.com/plokmju/p/android_ImageSwitcher.html,如需转载请自行联系原作者

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

Android:UI控件ViewPager,notifyDataSetChanged

ViewPager的使用: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 public class MainActivity extends Activity { /* *XML添加viewpager方法: *<android.support.v4.view.ViewPager *android:id="@+id/viewPager" *android:layout_width="match_parent" *android:layout_height="match_parent"/> */ int []ImageIds= new int [] {R.drawable.guide_daily_brand,R.drawable.guide_item_detail_1,R.drawable.guide_item_detail_2,R.drawable.guide_multi_shop_detail, R.drawable.guide_pic_mode,R.drawable.guide_timeline_filter}; private ArrayList<View>mViewList= new ArrayList<View>(); @Override protected void onCreate(BundlesavedInstanceState) { super .onCreate(savedInstanceState); setContentView(R.layout.activity_main); ViewPagerviewPager=(ViewPager)findViewById(R.id.viewPager); viewPager.setAdapter( new PagerAdapter() { @Override public ObjectinstantiateItem(Viewcontainer, int position) { //第一页和最后一页只创建保留两个view来复用,中间则保留三个view LayoutInflaterinflater=getLayoutInflater(); Viewlayout=inflater.inflate(R.layout.pager_item, null ); //将View加入到容器和container里面,不加判断会造成泄漏 if (mViewList.size()<ImageIds.length) { mViewList.add(layout); } ((ViewPager)container).addView(layout, 0 ); layout.setBackgroundResource(ImageIds[position]); return layout; } @Override public void destroyItem(Viewcontainer, int position,Objectobject) { //此处的position与上面的并不相等,会自动销毁不在当前页左右的view ((ViewPager)container).removeView(mViewList.get(position)); } @Override public boolean isViewFromObject(Viewarg0,Objectarg1) { return arg0==arg1; //判断对象与类型 } @Override public int getCount() { return ImageIds.length; } }); } @Override public boolean onCreateOptionsMenu(Menumenu) { getMenuInflater().inflate(R.menu.main,menu); return true ; } } 其他笔记: 1.viewpager切换时容易造成oom问题 1 2 3 4 5 6 mViewPager=(ViewPager)findViewById(R.id.photogallery_viewpager); mAdapter= new PhotoGalleryAdapter(); //限制view的数量,减少view缓存,在setAdapter之前使用 mViewPager.setOffscreenPageLimit( 3 ); mViewPager.setAdapter(mAdapter); mViewPager.setCurrentItem(mPagerSelected); 2.两种removeview方法 1 2 3 4 5 6 @Override public void destroyItem(Viewcontainer, int position,Objectobject) { //((ViewPager)container).removeView((View)object); ((ViewPager)container).removeView(mViewList.get(position)); } 3.关于notifyDataSetChanged()方法无法及时更新的问题解决方法 (1)销毁ViewItem时要使用以下方法: 1 2 3 4 5 6 @Override public void destroyItem(Viewcontainer, int position,Objectobject) { //((ViewPager)container).removeView(mViewList.get(position)); ((ViewPager)container).removeView((View)object); } 参考资料:http://www.myexception.cn/android/417891.html (2)重写notifyDataSetChanged()和getItemPosition(Object object)方法,代码如下: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 private int mChildCount= 0 ; @Override public void notifyDataSetChanged() { mChildCount=getCount(); super .notifyDataSetChanged(); } @Override public int getItemPosition(Objectobject) { if (mChildCount> 0 ) { mChildCount--; return POSITION_NONE; } return super .getItemPosition(object); } 参考资料:http://www.cnblogs.com/maoyu417/p/3740209.html 附相关注释: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 进入viewpager,我们终于找到了viewpager中控制数据变更的重点方法dataSetChanged,这个方法如下: void dataSetChanged(){ //Thismethodonlygetscalledifourobserverisattached,somAdapterisnon-null. boolean needPopulate=mItems.size()<mOffscreenPageLimit* 2 + 1 && mItems.size()<mAdapter.getCount(); int newCurrItem=mCurItem; boolean isUpdating= false ; for ( int i= 0 ;i<mItems.size();i++){ final ItemInfoii=mItems.get(i); final int newPos=mAdapter.getItemPosition(ii.object); if (newPos==PagerAdapter.POSITION_UNCHANGED){ continue ; } if (newPos==PagerAdapter.POSITION_NONE){ mItems.remove(i); i--; if (!isUpdating){ mAdapter.startUpdate( this ); isUpdating= true ; } mAdapter.destroyItem( this ,ii.position,ii.object); needPopulate= true ; if (mCurItem==ii.position){ //Keepthecurrentiteminthevalidrange newCurrItem=Math.max( 0 ,Math.min(mCurItem,mAdapter.getCount()- 1 )); needPopulate= true ; } continue ; } if (ii.position!=newPos){ if (ii.position==mCurItem){ //Ourcurrentitemchangedposition.Followit. newCurrItem=newPos; } ii.position=newPos; needPopulate= true ; } } if (isUpdating){ mAdapter.finishUpdate( this ); } Collections.sort(mItems,COMPARATOR); if (needPopulate){ //Resetourknownpagewidths;populatewillrecomputethem. final int childCount=getChildCount(); for ( int i= 0 ;i<childCount;i++){ final Viewchild=getChildAt(i); final LayoutParamslp=(LayoutParams)child.getLayoutParams(); if (!lp.isDecor){ lp.widthFactor= 0 .f; } } setCurrentItemInternal(newCurrItem, false , true ); requestLayout(); } } 重点看这样一行代码: final int newPos=mAdapter.getItemPosition(ii.object); if (newPos==PagerAdapter.POSITION_UNCHANGED){ continue ; } 官方对getItemPosition()的解释是: Calledwhenthehostviewisattemptingtodetermine if anitem’spositionhaschanged.ReturnsPOSITION_UNCHANGED if thepositionofthegivenitemhasnotchangedorPOSITION_NONE if theitemisnolongerpresentintheadapter. The default implementationassumesthatitemswillneverchangepositionandalwaysreturnsPOSITION_UNCHANGED. 意思是如果item的位置如果没有发生变化,则返回POSITION_UNCHANGED。如果返回了POSITION_NONE,表示该位置的item已经不存在了。默认的实现是假设item的位置永远不会发生变化,而返回POSITION_UNCHANGED 解决方案: 所以我们可以尝试着修改适配器的写法,覆盖getItemPosition()方法,当调用notifyDataSetChanged时,让getItemPosition方法人为的返回POSITION_NONE,从而达到强迫viewpager重绘所有item的目的。 本文转自 glblong 51CTO博客,原文链接:http://blog.51cto.com/glblong/1224648,如需转载请自行联系原作者

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

Android--UI之EditText

前言 上一篇博客介绍了Android的TextView控件,这篇博客来说一下EditText控件。EditText为一个文本控件,提供了文本输入的功能,而且继承自TextView,可以理解为可以输入的TextView。因为继承的关系,很多TextView可以用到的方法,在EditText都可以用到。 EditText 对于EditText,在很多平台上都有用到,最大的用处就是供用户输入一些信息,所以主要的方法就两个: setText():设置TextView控件中显示的内容。 getText() 获取TextView控件中显示的内容。 示例程序 现在通过两个示例程序,来讲解一下EditText的使用。 第一个例子,在EditText中插入表情图片,无论是开发任何系统,这个都是常用的实现。在编码之前,需要找到一些表情图片的资源,我这里就随机找了十张图片,注意资源文件的文件名必须是小写的,放在/res/drawable文件夹下。这样在清单文件R中,就可以看到与Drawable资源对于的资源清单ID,对于在清单文件中的资源,可以通过R类访问,但是访问到的为一个int类型的资源ID,如果需要访问详细内容,需要使用getResource()方法访问到所有的资源,在其中有特定资源的访问方法。关于资源清单文件R,以后再进行详细讲解。 在Android中,使用图片资源会用到一个Bitmap的类,此类代表一个位图资源,是一个final类,需要使用BitmapFactory类的静态方法decodeXxx()转化获得,此静态方法有多种重载模式,可以适应不同的资源来源。 下面直接上代码,对于布局而言,很简单的只有两个控件: 1 <?xml version="1.0" encoding="utf-8"?> 2 <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" 3 android:layout_width="match_parent" 4 android:layout_height="match_parent" 5 android:orientation="vertical" > 6 7 <EditText 8 android:id="@+id/edImage" 9 android:layout_width="match_parent" 10 android:layout_height="wrap_content" 11 android:layout_marginTop="20dp"/> 12 13 <Button 14 android:id="@+id/btnInImg" 15 android:text="添加表情" 16 android:layout_width="match_parent" 17 android:layout_height="wrap_content"/> 18 </LinearLayout> 实现InImageActivity.java代码: 1 package cn.bgxt.androiduiedittext; 2 3 import java.util.Random; 4 5 import android.app.Activity; 6 import android.graphics.Bitmap; 7 import android.graphics.BitmapFactory; 8 import android.graphics.drawable.Drawable; 9 import android.os.Bundle; 10 import android.text.Spannable; 11 import android.text.SpannableString; 12 import android.text.style.ImageSpan; 13 import android.view.View; 14 import android.widget.Button; 15 import android.widget.EditText; 16 17 public class InImageActivity extends Activity { 18 19 private Button btnInImg; 20 private EditText edImage; 21 //获取Drawable资源的Id数组 22 private final int[] DRAW_IMG_ID= 23 { 24 R.drawable.image0, 25 R.drawable.image1, 26 R.drawable.image2, 27 R.drawable.image3, 28 R.drawable.image4, 29 R.drawable.image5, 30 R.drawable.image6, 31 R.drawable.image7, 32 R.drawable.image8, 33 R.drawable.image9 34 }; 35 public InImageActivity() { 36 // TODO Auto-generated constructor stub 37 } 38 39 @Override 40 protected void onCreate(Bundle savedInstanceState) { 41 super.onCreate(savedInstanceState); 42 setContentView(R.layout.edittextinimg_activity); 43 44 btnInImg=(Button)findViewById(R.id.btnInImg); 45 edImage=(EditText)findViewById(R.id.edImage); 46 47 btnInImg.setOnClickListener(new View.OnClickListener() { 48 @Override 49 public void onClick(View v) { 50 // 参数一个0-9的随机数 51 int random=new Random().nextInt(9); 52 //通过bitmapFactory获得位图资源 53 Bitmap bit=BitmapFactory.decodeResource(getResources(), DRAW_IMG_ID[random]); 54 //一个ImageSpan,用于插入的存放待插入的图片 55 ImageSpan imageSpan=new ImageSpan(InImageActivity.this,bit); 56 SpannableString spannableString=new SpannableString("img"); 57 spannableString.setSpan(imageSpan, 0, 3, Spannable.SPAN_EXCLUSIVE_EXCLUSIVE); 58 edImage.append(spannableString); 59 } 60 }); 61 62 } 63 64 65 66 67 } 显示效果,点击按钮随机添加标签: 既然EditText主要是用来获取用户输入的信息的,那么第二个例子就来讲讲用户输入时候内容的验证吧。在XML Attribute中,有一些属性可以设置输入验证的范围内容,不过此为TextView类的属性,因为TextView无法输入,此处在EditText中讲解说明。 android:digits:指定特定能被输入的字符。 android:inputType:设定输入的类型,下面仅介绍一些常用的,多项可以使用“|”分割。 textUri:必须是一个URL。 textEmailAddress:Email地址 textPassword:密码。 number:数字。 android:numeric:指定数字输入类型,多项可以使用“|”分割。 integer:数字。 decimal:浮点类型。 signed:带符号。 以上属性仅仅是为了限制用户的输入,还有一些输入需要给用户以提示错误信息。这里将使用到setError()方法,如果设定了错误提示信息,会在EditText旁边以感叹号的形式显示。 布局代码: 1 <?xml version="1.0" encoding="utf-8"?> 2 <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" 3 android:layout_width="match_parent" 4 android:layout_height="match_parent" 5 android:orientation="vertical" > 6 7 <TextView 8 android:layout_width="wrap_content" 9 android:layout_height="wrap_content" 10 android:text="使用Android:digits属性(仅输入数字与abcde)" /> 11 12 <EditText 13 android:id="@+id/etNum" 14 android:layout_width="200dp" 15 android:layout_height="wrap_content" 16 android:layout_margin="10dp" 17 android:digits="123456789abcde" 18 /> 19 <TextView 20 android:layout_width="wrap_content" 21 android:layout_height="wrap_content" 22 android:text="使用Android:inputtype属性(仅输入Email)" /> 23 24 <EditText 25 android:layout_width="200dp" 26 android:layout_height="wrap_content" 27 android:layout_margin="10dp" 28 android:inputType="textPassword" 29 /> 30 <TextView 31 android:layout_width="wrap_content" 32 android:layout_height="wrap_content" 33 android:text="使用Android:inputtype属性(仅输入密码)" /> 34 35 <EditText 36 android:layout_width="200dp" 37 android:layout_height="wrap_content" 38 android:layout_margin="10dp" 39 android:numeric="decimal|signed" 40 /> 41 <Button 42 android:id="@+id/btnValidation" 43 android:text="验证第一个输入框是否为123" 44 android:layout_width="wrap_content" 45 android:layout_height="wrap_content"/> 46 </LinearLayout> Java代码: 1 package cn.bgxt.androiduiedittext; 2 3 import android.app.Activity; 4 import android.os.Bundle; 5 import android.view.View; 6 import android.widget.Button; 7 import android.widget.EditText; 8 9 public class EditValidationActivity extends Activity { 10 11 private Button btnValidation; 12 private EditText etNum; 13 public EditValidationActivity() { 14 // TODO Auto-generated constructor stub 15 } 16 @Override 17 protected void onCreate(Bundle savedInstanceState) { 18 // TODO Auto-generated method stub 19 super.onCreate(savedInstanceState); 20 setContentView(R.layout.editvalidation_activity); 21 btnValidation=(Button)findViewById(R.id.btnValidation); 22 etNum=(EditText)findViewById(R.id.etNum); 23 24 btnValidation.setOnClickListener(new View.OnClickListener() { 25 26 @Override 27 public void onClick(View v) { 28 // TODO Auto-generated method stub 29 String num=etNum.getText().toString().trim(); 30 if(!num.equals("123")) 31 { 32 etNum.setError("请输入123"); 33 } 34 } 35 }); 36 37 38 } 39 } 效果展示: 如果点击验证按钮,而第一个文本框输入的不是123,则提示错误信息: 示例代码下载 总结 以上就讲解了EditText在实际项目中常用的效果,虽然大部分使用的是TextView的属性设置的效果,但是Android下还有一些其他的供用户输入的控件,可以使用,所以才以这样的继承结构实现属性。 本文转自承香墨影博客园博客,原文链接:http://www.cnblogs.com/plokmju/p/Android_UIEditText.html,如需转载请自行联系原作者

资源下载

更多资源
腾讯云软件源

腾讯云软件源

为解决软件依赖安装时官方源访问速度慢的问题,腾讯云为一些软件搭建了缓存服务。您可以通过使用腾讯云软件源站来提升依赖包的安装速度。为了方便用户自由搭建服务架构,目前腾讯云软件源站支持公网访问和内网访问。

Spring

Spring

Spring框架(Spring Framework)是由Rod Johnson于2002年提出的开源Java企业级应用框架,旨在通过使用JavaBean替代传统EJB实现方式降低企业级编程开发的复杂性。该框架基于简单性、可测试性和松耦合性设计理念,提供核心容器、应用上下文、数据访问集成等模块,支持整合Hibernate、Struts等第三方框架,其适用范围不仅限于服务器端开发,绝大多数Java应用均可从中受益。

Sublime Text

Sublime Text

Sublime Text具有漂亮的用户界面和强大的功能,例如代码缩略图,Python的插件,代码段等。还可自定义键绑定,菜单和工具栏。Sublime Text 的主要功能包括:拼写检查,书签,完整的 Python API , Goto 功能,即时项目切换,多选择,多窗口等等。Sublime Text 是一个跨平台的编辑器,同时支持Windows、Linux、Mac OS X等操作系统。

WebStorm

WebStorm

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

用户登录
用户注册