精华内容
下载资源
问答
  • Android标签容器控件的实现

    千次阅读 2016-07-21 14:57:00
    Android中标签容器控件的实现,在一些APP中我们可以看到一些存放标签的容器控件,和我们平时使用的一些布局方式有些不同,它们一般都可以自动适应屏幕的宽度进行布局,根据对自定义控件的一些理解,今天写一个简单的...

    Android中标签容器控件的实现

    介绍

    在一些APP中我们可以看到一些存放标签的容器控件,和我们平时使用的一些布局方式有些不同,它们一般都可以自动适应屏幕的宽度进行布局,根据对自定义控件的一些理解,今天写一个简单的标签容器控件,项目源码在最后给出

    下面这个是我在手机上截取的一个实例,是在MIUI8系统上截取的

    这里写图片描述

    这个是我实现的效果图

    这里写图片描述

    原理介绍

    根据对整个控件的效果分析,大致可以将控件分别从以下这几个角度进行分析:

    1.首先涉及到自定义的ViewGroup,因为现有的控件没法满足我们的布局效果,就涉及到要重写onMeasure和onLayout,这里需要注意的问题是自定义View的时候,我们需要考虑到View的Padding属性,而在自定义ViewGroup中我们需要在onLayout中考虑Child控件的margin属性否则子类设置这个属性将会失效。整个View的绘制流程是这样的:

    最顶层的ViewRoot执行performTraversals然后分别开始对各个View进行层级的测量、布局、绘制,整个流程是一层一层进行的,也就是说父视图测量时会调用子视图的测量方法,子视图调孙视图方法,一直测量到叶子节点,performTraversals这个函数翻译过来很直白,执行遍历,就说明了这种层级关系。

    2.该控件形式上和ListView的形式比较相近,所以在这里我也模仿ListView的Adapter模式实现了对控件内容的操作,这里对ListView的setAdapter和Adapter的notifyDataSetChanged方法做个简单的解释:

    在ListView调用setAdapter后,ListView会去注册一个Observer对象到这个adapter上,然后当我们在改变设置到adapter上的数据发改变时,我们会调用adapter的notifyDataSetChanged方法,这个方法就会通知所有监听了该Adapter数据改变时的Observer对象,这就是典型的监听者模式,这时由于ListView中的内部成员对象监听了该事件,就可以知道数据源发生了改变,我们需要对真个控件重新进行绘制了,下面来一些相关的源码。

    Adapter的notifyDataSetChanged

    public void notifyDataSetChanged() {
            mDataSetObservable.notifyChanged();
        }

    ListView的setAdapter方法

    @Override
        public void setAdapter(ListAdapter adapter) {
            /**
             *每次设置新的适配的时候,如果现在有的话会做一个解除监听的操作
             */
            if (mAdapter != null && mDataSetObserver != null) {
                mAdapter.unregisterDataSetObserver(mDataSetObserver);
            }
    
            resetList();
            mRecycler.clear();
            /** 省略部分代码.....   */
            if (mAdapter != null) {
                mAreAllItemsSelectable = mAdapter.areAllItemsEnabled();
                mOldItemCount = mItemCount;
                mItemCount = mAdapter.getCount();
                checkFocus();
    
                /**
                *在这里对adapter设置了监听,
                *使用的是AdapterDataSetObserver类的对象,该对象定义在ListView的父类AdapterView中
                */
                mDataSetObserver = new AdapterDataSetObserver();
                mAdapter.registerDataSetObserver(mDataSetObserver);
                /** 省略 */
            } else {
                /** 省略 */
            }
    
            requestLayout();
        }

    AdapterView中的内部类AdapterDataSetObserver

    class AdapterDataSetObserver extends DataSetObserver {
    
            private Parcelable mInstanceState = null;
    
            @Override
            public void onChanged() {
                /* ***代码略*** */
                checkFocus();
                requestLayout();
            }
    
            @Override
            public void onInvalidated() {
               /* ***代码略*** */
                checkFocus();
                requestLayout();
            }
    
            public void clearSavedState() {
                mInstanceState = null;
            }
        }

    一段伪代码表示

    ListView{
        Observer observer{
             onChange(){
                  change;
             }
        }
    
        setAdapter(Adapter adapter){
             adapter.register(observer);
        }
    }
    
    Adapter{
        List<Observer> mObservable;
        register(observer){
            mObservable.add(observer);
        }
        notifyDataSetChanged(){
            for(i-->mObserverable.size()){
                mObserverable.get(i).onChange
            }
        }
    }

    实现过程

    获取ViewItem的接口

    package humoursz.gridtag.test.adapter;
    
    import android.view.View;
    
    import java.util.List;
    
    /**
     * Created by zhangzhiquan on 2016/7/19.
     */
    public interface GrideTagBaseAdapter {
        List<View> getViews();
    }
    

    抽象适配器AbsGridTagsAdapter

    package humoursz.gridtag.test.adapter;
    
    import android.database.DataSetObservable;
    import android.database.DataSetObserver;
    
    /**
     * Created by zhangzhiquan on 2016/7/19.
     */
    public abstract class AbsGridTagsAdapter implements GrideTagBaseAdapter {
    
        DataSetObservable mObservable = new DataSetObservable();
    
        public void notification(){
            mObservable.notifyChanged();
        }
        public void registerObserve(DataSetObserver observer){
            mObservable.registerObserver(observer);
        }
        public void unregisterObserve(DataSetObserver observer){
            mObservable.unregisterObserver(observer);
        }
    }
    

    此效果中的需要的适配器,实现了getView接口,主要是模仿了ListView的BaseAdapter

    package humoursz.gridtag.test.adapter;
    
    import android.content.Context;
    import android.view.LayoutInflater;
    import android.view.View;
    import android.widget.TextView;
    
    
    import java.util.ArrayList;
    import java.util.List;
    
    import humoursz.gridtag.test.R;
    import humoursz.gridtag.test.util.UIUtil;
    import humoursz.gridtag.test.widget.GridTagView;
    
    /**
     * Created by zhangzhiquan on 2016/7/19.
     */
    public class MyGridTagAdapter extends AbsGridTagsAdapter {
    
        private Context mContext;
    
        private List<String> mTags;
    
        public MyGridTagAdapter(Context context, List<String> tags) {
            mContext = context;
            mTags = tags;
        }
    
        @Override
        public List<View> getViews() {
            List<View> list = new ArrayList<>();
            for (int i = 0; i < mTags.size(); i++) {
    
                TextView tv = (TextView) LayoutInflater.from(mContext)
                        .inflate(R.layout.grid_tag_item_text, null);
    
                tv.setText(mTags.get(i));
    
                GridTagView.LayoutParams lp = new GridTagView
                        .LayoutParams(GridTagView.LayoutParams.WRAP_CONTENT
                        ,GridTagView.LayoutParams.WRAP_CONTENT);
    
                lp.margin(UIUtil.dp2px(mContext, 5));
    
                tv.setLayoutParams(lp);
    
                list.add(tv);
            }
            return list;
        }
    }

    最后是主角GridTagsView控件

    package humoursz.gridtag.test.widget;
    
    import android.content.Context;
    import android.database.DataSetObserver;
    import android.util.AttributeSet;
    import android.util.Log;
    import android.view.View;
    import android.view.ViewGroup;
    
    
    import java.util.List;
    
    import humoursz.gridtag.test.adapter.AbsGridTagsAdapter;
    
    /**
     * Created by zhangzhiquan on 2016/7/18.
     */
    public class GridTagView extends ViewGroup {
    
        private int mLines = 1;
    
        private int mWidthSize = 0;
    
        private AbsGridTagsAdapter mAdapter;
    
        private GTObserver mObserver = new GTObserver();
    
        public GridTagView(Context context) {
            this(context, null);
        }
    
        public GridTagView(Context context, AttributeSet attrs) {
            this(context, attrs, 0);
        }
    
        public GridTagView(Context context, AttributeSet attrs, int defStyleAttr) {
            super(context, attrs, defStyleAttr);
        }
    
        public void setAdapter(AbsGridTagsAdapter adapter) {
            if (mAdapter != null) {
                mAdapter.unregisterObserve(mObserver);
            }
            mAdapter = adapter;
            mAdapter.registerObserve(mObserver);
            mAdapter.notification();
        }
    
        @Override
        protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
            int widthSize = MeasureSpec.getSize(widthMeasureSpec);
            int heightSize = MeasureSpec.getSize(heightMeasureSpec);
            int curWidthSize = 0;
            int childHeight = 0;
            mLines = 1;
            for (int i = 0; i < getChildCount(); ++i) {
                View child = getChildAt(i);
                measureChild(child, widthMeasureSpec, heightMeasureSpec);
                curWidthSize += getChildRealWidthSize(child);
                if (curWidthSize > widthSize) {
                    /**
                     * 计算一共需要多少行,用于计算控件的高度
                     * 计算方法是,如果当前控件放下后宽度超过
                     * 容器本身的高度,就放到下一行
                     */
                    curWidthSize = getChildRealWidthSize(child);
                    mLines++;
                }
                if (childHeight == 0) {
                    /**
                     * 在第一次计算时拿到字视图的高度作为计算基础
                     */
                    childHeight = getChildRealHeightSize(child);
                }
            }
            mWidthSize = widthSize;
            setMeasuredDimension(widthSize, childHeight == 0 ? heightSize : childHeight * mLines);
    
        }
    
        @Override
        protected void onLayout(boolean changed, int l, int t, int r, int b) {
            if (getChildCount() == 0)
                return;
            int childCount = getChildCount();
            LayoutParams lp = getChildLayoutParams(getChildAt(0));
            /**
             * 初始的左边界在自身的padding left和child的margin后
             * 初始的上边界原理相同
             */
            int left = getPaddingLeft() + lp.leftMargin;
            int top = getPaddingTop() + lp.topMargin;
            int curLeft = left;
            for (int i = 0; i < childCount; ++i) {
                View child = getChildAt(i);
    
                int right = curLeft + getChildRealWidthSize(child);
                /**
                 * 计算如果放下当前试图后整个一行到右侧的距离
                 * 如果超过控件宽那就放到下一行,并且左边距还原,上边距等于下一行的开始
                 */
                if (right > mWidthSize) {
                    top += getChildRealHeightSize(child);
                    curLeft = left;
                }
                child.layout(curLeft, top, curLeft + child.getMeasuredWidth(), top + child.getMeasuredHeight());
                /**
                 * 下一个控件的左边开始距离是上一个控件的右边
                 */
                curLeft += getChildRealWidthSize(child);
            }
        }
    
        /**
         * 获取childView实际占用宽度
         * @param child
         * @return 控件实际占用的宽度,需要算上margin否则margin不生效
         */
        private int getChildRealWidthSize(View child) {
            LayoutParams lp = getChildLayoutParams(child);
            int size = child.getMeasuredWidth() + lp.leftMargin + lp.rightMargin;
            return size;
        }
    
        /**
         * 获取childView实际占用高度
         * @param child
         * @return 实际占用高度需要考虑上下margin
         */
        private int getChildRealHeightSize(View child) {
            LayoutParams lp = getChildLayoutParams(child);
            int size = child.getMeasuredHeight() + lp.topMargin + lp.bottomMargin;
            return size;
        }
    
        /**
         * 获取LayoutParams属性
         * @param child
         * @return
         */
        private LayoutParams getChildLayoutParams(View child) {
            LayoutParams lp;
            if (child.getLayoutParams() instanceof LayoutParams) {
                lp = (LayoutParams) child.getLayoutParams();
            } else {
                lp = (LayoutParams) generateLayoutParams(child.getLayoutParams());
            }
    
            return lp;
        }
    
    
        @Override
        public ViewGroup.LayoutParams generateLayoutParams(AttributeSet attr) {
            return new LayoutParams(getContext(), attr);
        }
    
        @Override
        protected ViewGroup.LayoutParams generateLayoutParams(ViewGroup.LayoutParams p) {
            return new LayoutParams(p);
        }
    
        public static class LayoutParams extends MarginLayoutParams {
    
            public LayoutParams(Context c, AttributeSet attrs) {
                super(c, attrs);
            }
    
            public LayoutParams(int width, int height) {
                super(width, height);
            }
    
            public LayoutParams(MarginLayoutParams source) {
                super(source);
            }
    
            public LayoutParams(ViewGroup.LayoutParams source) {
                super(source);
            }
    
            public void marginLeft(int left) {
                this.leftMargin = left;
            }
    
            public void marginRight(int r) {
                this.rightMargin = r;
            }
    
            public void marginTop(int t) {
                this.topMargin = t;
            }
    
            public void marginBottom(int b) {
                this.bottomMargin = b;
            }
            public void margin(int m){
                this.leftMargin = m;
                this.rightMargin = m;
                this.topMargin = m;
                this.bottomMargin = m;
            }
        }
    
    
        private class GTObserver extends DataSetObserver {
            @Override
            public void onChanged() {
                removeAllViews();
                List<View> list = mAdapter.getViews();
                for (int i = 0; i < list.size(); i++) {
                    addView(list.get(i));
                }
            }
            @Override
            public void onInvalidated() {
                Log.d("Mrz","fd");
            }
        }
    }
    

    MainActivity

    package humoursz.gridtag.test;
    
    import android.support.v7.app.AppCompatActivity;
    import android.os.Bundle;
    import android.view.View;
    
    import java.util.List;
    
    import humoursz.gridtag.test.adapter.MyGridTagAdapter;
    import humoursz.gridtag.test.util.ListUtil;
    import humoursz.gridtag.test.widget.GridTagView;
    
    public class MainActivity extends AppCompatActivity {
    
        MyGridTagAdapter adapter;
        GridTagView mGridTag;
        List<String> mList;
        @Override
        protected void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.activity_main);
            mGridTag = (GridTagView)findViewById(R.id.grid_tags);
            mList = ListUtil.getGridTagsList(20);
            adapter = new MyGridTagAdapter(this,mList);
            mGridTag.setAdapter(adapter);
        }
    
        public void onClick(View v){
            mList.removeAll(mList);
            mList.addAll(ListUtil.getGridTagsList(20));
            adapter.notification();
        }
    }
    

    XML 文件

    <?xml version="1.0" encoding="utf-8"?>
    <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
        xmlns:tools="http://schemas.android.com/tools"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        tools:context="humoursz.gridtag.test.MainActivity">
    
        <humoursz.gridtag.test.widget.GridTagView
            android:id="@+id/grid_tags"
            android:layout_width="match_parent"
            android:layout_height="wrap_content">
        </humoursz.gridtag.test.widget.GridTagView>
        <Button
            android:layout_centerInParent="true"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:onClick="onClick"
            android:text="换一批"/>
    </RelativeLayout>
    

    这样一个简单的控件就写好了,主要需要注意measure和layout否则很多效果都会失效,安卓中的LinearLayout之类的控件实际实现起来要复杂的很多,因为支持的属性实在的太多了,多动手实践可以帮助理解,下面是工程的下载地址

    Android简单标签容器工程源码

    展开全文
  • DotNetBar.Bar作为容器使用的方法及Text更新原理 老帅 一、容器用法 控件DevComponents.DotNetBar.Bar是能够有多种用途的,当中一种是用作容器,例如以下图的SQLServer管理器。就是一...

    DotNetBar.Bar作为容器使用的方法及Text更新原理

                             老帅

      
    一、容器用法
       控件
    DevComponents.DotNetBar.Bar是能够有多种用途的,当中一种是用作容器,例如以下图的SQLServer管理器。就是一个容器。容器里面存在两个页面“对象资源管理器具体信息”和“对象资源管理器“。这两个页面上又分别容纳了多种控件。



       想让DevComponents.DotNetBar.Bar作为容器使用,作为容器使用,并实现和上面一样的效果,其属性配置例如以下:


       此时,Bar中会有一个容器项目DockContainerItem,用它来一对一的控制停靠容器PanelDockContainer,后者才是真正的容器,后面的控件事实上都放在它上面。例如以下图:       



    二、容器显示的名称
      
       容器终于显示的名称,就是容器项目DockContainerItem的名称,例如以下图 


          此时假设直接设置Bar.Text名称是无用的,由于它会自己主动从容器项目DockContainerItem.Text名称更新。Bar.Text的自己主动更新是通过Bar.AutoSyncBarCaption属性设置的。这有一个优点:假设一个Bar里面有多个容器项目DockContainerItem的时候,是能够依据当前活动的容器项目DockContainerItem.Text名称,来自己主动更新Bar.Text名称的。

    例如以下图:




     
       假设想强制Bar使用固定的名称,能够设置Bar.AutoSyncBarCaption=False,再设置Bar.Text=“指定名称”

    三、容器中页签的显示控制
    1.隐藏一个页签 
            private void InitViewOutput()
            {
                dciOutput.Visible = false; //output页不可见,会自己主动引起pdcOutput.visible=false
                barOutput.Visible = fasle; //bar总体不可见
            }


    2.显示一个页签

            private void ShowViewOutput()
            {           
                dotNetBarServer.SuspendLayout = true;
                try
                {
                    if (pdcOutput.Visible == false)
                    {               
                        pdcOutput.Visible = true;
                        dciOutput.Visible = true;
                        barOutput.Visible = true;
                    }
                    barOutput.RecalcLayout();
                }
                finally
                {
                    dotNetBarServer.SuspendLayout = false;
                }
            }

    3.选择一个页签
             private void InitViewOutput()
            {
                barOutput.SelectedDockTab = 0;
            }
    





    转载于:https://www.cnblogs.com/llguanli/p/8469632.html

    展开全文
  • QLabel对象作为一个占位符可以显示可编辑的文本或者图片,也可以放一个gif动画,还可以作为一个提示标记作为其他控件; 该标签可以放纯文本,链接或者富文本信息; 参考文章:PyQt5-QLabel控件使用 ...

    QLabel对象作为一个占位符可以显示不可编辑的文本或者图片,也可以放一个gif动画,还可以作为其他控件的一个提示标记(如QComboBox下拉列表框、组合下拉框?);

    该标签可以放纯文本,链接或者富文本信息;

    参考文章:PyQt5-QLabel控件使用

    https://doc.qt.io/qtforpython/PySide2/QtWidgets/QLabel.html?highlight=qlabel#PySide2.QtWidgets.QLabel

    继承关系

    在这里插入图片描述

    详细描述

    在这里插入图片描述
    QLabel用于显示文本或图像。 没有提供用户交互功能。 标签的视觉外观可以通过各种方式进行配置,并且可以用于为另一个窗口小部件指定焦点助记键。

    QLabel可以包含以下任何内容类型:

    Content Setting
    Plain text Pass a QString to setText() .
    Rich text Pass a QString that contains rich text to setText() .
    A pixmap Pass a QPixmap to setPixmap() .
    A movie Pass a QMovie to setMovie() .
    A number Pass an int or a double to setNum() , which converts the number to plain text.
    Nothing The same as an empty plain text. This is the default. Set by clear() .

    警告:

    当将QString传递给构造函数或调用setText()时,请确保清理您的输入,因为QLabeltries猜测它是将文本显示为纯文本还是富文本(HTML
    4标记的子集)。 您可能需要显式调用setTextFormat(),例如
    如果您希望文本为纯格式,但无法控制文本源(例如,当显示从Web加载的数据时)。

    使用这些功能中的任何一个更改内容时,将清除以前的所有内容。

    默认情况下,标签显示左对齐,垂直居中的文本和图像,其中要显示的文本中的所有选项卡都会自动展开。 但是,QLabel的外观可以通过几种方式进行调整和微调。

    可以使用setAlignment()和setIndent()来调整QLabel小部件区域内内容的位置。 文本内容还可以使用setWordWrap()沿单词边界换行。 例如,此代码设置了一个下沉的面板,该面板的右下角有两行文字(两行与标签的右侧齐平):

    label = QLabel(self)
    label.setFrameStyle(QFrame.Panel | QFrame.Sunken)
    label.setText("first line\nsecond line")
    label.setAlignment(Qt.AlignBottom | Qt.AlignRight)
    

    QLabel从QFrame继承的属性和函数也可以用于指定要用于任何给定标签的小部件框架。

    QLabel通常用作交互式窗口小部件的标签。 对于此用途,QLabel提供了一种有用的机制来添加助记符(请参阅QKeySequence),该助记符会将键盘焦点设置到其他小部件(称为QLabel的“伙伴”)。 例如:

    phoneEdit = QLineEdit(self)
    phoneLabel = QLabel("&Phone:", self)
    phoneLabel.setBuddy(phoneEdit)
    

    在此示例中,当用户按下Alt + P时,键盘焦点转移到了标签的好友(QLineEdit)上。 如果伙伴是按钮(从QAbstractButton继承),则触发助记符将模拟按钮单击。

    See also
    
    QLineEditQTextEditQPixmapQMovieGUI Design Handbook: Label
    
    class QLabel([parent=None[, f=Qt.WindowFlags()]])¶
    QLabel(text[, parent=None[, f=Qt.WindowFlags()]])
    
    param f
    WindowFlags
    
    param parent
    QWidget
    
    param text
    unicode
    

    构造一个空标签。

    将parent和widget标志f传递给QFrame构造函数。

    See also
    
    setAlignment()setFrameStyle()setIndent()
    

    构造一个显示文本text的标签。

    将parent和widget标志f传递给QFrame构造函数。

    See also
    
    setText()setAlignment()setFrameStyle()setIndent()
    

    参考文章:python PyQt5中文教程☞【第八节】PyQt5控件(II)

    展开全文
  • 2、对于canvas 的元素的位置,是靠控件的大小及Canvas.Top、Canvas.Left、Canvas.Right、Canvas.Button属性,而不是控件的声明位置。 3、最适合在canvas的放置的是图形内容。 二、DockPanel 1、DockPanel通常作为...

    一、Canvas

    1、官方表述:定义一个区域,在该区域中可以使用相对于该区域的坐标显式定位子元素。

    2、对于canvas 的元素的位置,是靠控件的大小及Canvas.Top、Canvas.Left、Canvas.Right、Canvas.Button属性,而不是控件的声明位置。

    3、最适合在canvas的放置的是图形内容。

    二、DockPanel

    1、DockPanel通常作为其他面板的容器,来对内容进行分组,使用附加属性控制元素的停靠位置。

    2、注意LastChildFill属性,设置为true,将把最后一个元素进行拉伸来填满剩余空间。

    三、Grid

    1、和HTML表格类似,被划分为一个个的单元格;在使用时需要以下3个步骤:

     1)、定义并配置列。

     2)、定义并配置行。

     3)、使用附加属性设置单元格的内容。

    2、Grid支持GridSplitter拆分器,允许用户调整行或列的大小。

    四、WrapPanel

    1、WrapPanel中的内容将随窗口的大小变化而变化。

    2、WrapPanel中的元素按顺序逐个呈现。

    3、可以为每个元素设置Width和Height来控制其在容器中的整个尺寸。

    4、设置Orientation来控制控件的排序规则。

    五、StackPanel

    1、与WrapPanel类似,也是使用Orientation来控制控件的排序规则。

    2、调整窗口时,StackPanel不会将内容折行,而是简单拉伸。

    3一般是作为子面板出现。

     

     

    转载于:https://www.cnblogs.com/xiesong/p/5297821.html

    展开全文
  • 之前做的将动态创建的控件,放到容器中,从而可以使用数组访问,现在记一下怎样给它们设置事件。 1、实现思路: 比如我创建了10个按钮,每创建一个,我就构建一个信号槽的连接。由于我不能构建太多的槽函数,所以,...
  • 默认情况下,选项卡栏显示在页面区域上方,但是可以使用不同的配置(请参见TabPosition)。每个选项卡都与一个不同的窗口小部件(称为页面)相关联。页面区域中仅显示当前页面。其他所有页面均被隐藏。用户可以通过...
  • ActiveX控件和它的容器

    2011-09-30 13:26:59
    ActiveX控件和它的容器 (转) 1.COM基础 2.ActiveX控件及实现 3.ActiveX控件容器及实现 4.总结 1.COM基础 COM是一种组件开发技术, 它实际上是一种在二进制层上兼容的软件开发方法的...
  • 在学习新内容之前,我们先来弄清楚两个问题: 1 . 什么是ViewGroup? ViewGroup是一种容器。它包含零个或以上的View及子View。...ViewGroup内部可以用来存放多个View控件,并且根据自身的测量模式,来测量View子控件
  • 9. Cocos2d-x中基于布局的容器控件 1.1. ScrollView滚动视图 滚动视图是一种常见的容器型控件,它里面可以放置其他组件。Cocos2d-x中的ScrollView本身也是一种Layout,所以也可以在其中使用线形或者相对布局。...
  • 使用JavaFX控件

    千次阅读 2011-11-03 13:43:03
    使用JavaFX2.0的控件 (李佳明译自 www.JavaFX.com,原文:Alla Redko/甲骨文高级技术专家)   关于本教程 本教程覆盖了JavaFX API中内置的JavaFX UI控件。 本文包含以下章节: JavaFX的UI控件 标签...
  • 百度地图之控件使用

    2017-06-14 09:35:06
    本文是继上一篇百度地图API之环境搭建之后介绍如何在百度地图上使用一些控件。 百度地图API控件介绍 Control 控件的抽象基类,所有控件均继承此类的方法、属性。通过此类您可实现自定义控件。 ...
  • VC使用ActiveX控件常见问题

    千次阅读 2015-12-24 16:57:22
    它与开发语言无关,任何支持 ActiveX控件的软件开发平台(如VB、VC++、Access、VFP、Delphi、PowerBuilder等)上,都可以使用ActiveX控件,程序员可以像使用Windows标准控件一样使用不同厂商开发的ActiveX控件。...
  • 使用控件——单选按钮

    千次阅读 2016-12-17 22:29:50
    今天,咱们还是接着玩“控件斗地主”,这是我原创的超级游戏,有益身心健康,玩一朝,十年少。 哦,对,脑细胞极速运动了一下,想起了一个问题,这个破问题虽然网上有很多种解决方案,但是,并没有让所有人都解决...
  • delphi控件使用

    万次阅读 2013-08-08 21:07:08
    1- Tlistbox控件 重要属性items.* 举例,界面设计如下左,执行结果如下右:   代码为 procedure TForm1.Button1Click(Sender: TObject); begin edit1.Text := listbox1.Items.CommaText; ...
  • Winfrom控件使用

    2018-06-28 20:16:53
    1.按钮控件工具栏创建用户界面时,把控件从工具栏拖到窗体上,或者在工具箱中双击想要添加的控件,这时控件就会显示在窗体中,然后按照自己想要实现的效果在窗体中自由拖放控件。按钮(button)通常用来向程序发送...
  • 控件种类
  • 在 ASP.NET 的开发中 Web 用户控件的开发和使用是一项必可少的技术,在对这项技术的一番研究后写下了这篇随笔,不过确实担心这么初级的东东放到原创首页上会被拍砖头。 1.简介 2.创建 Web 用户控件 3.在 Web 窗体...
  • Qt已经提供了很多的基础控件供开发使用,而Qt原生的控件有时候并不能满足我们的需求,特别是在工业的运用上,比如我们需要一个日期时间的选择器,Qt虽然已经提供了原生的QDateTime控件,但这个原生控件不能满足...
  • 使用ActiveX控件的问题

    2011-10-19 08:53:23
    自从Microsoft最早在1996年3月的Internet专业开发人员研讨会上提出ActiveX一词以来,到今天已有无数公司的无数产品中涉及了ActiveX技术,而作为ActiveX技术之一的ActiveX控件,更是得到广大开发者的青睐。...
  • Button是Android最常用的控件之一。其用法我们这里主要是关注三个方面 ,一是点击事件,二是长按事件,三是设置文本、、点击背景效果等等。 其中点击事件和长按事件用法上跟Java差不多,主要有匿名函数方式、内部类...
  • python界面Tkinter编程(基本控件介绍及使用

    万次阅读 多人点赞 2018-04-27 10:50:23
    在本文中将主力介绍以下控件及其使用,Label、Frame、Entry、Text、Button、Listbox、Scrollbar。 2. 控件使用及介绍 在Tkinter中控件使用都是基于如下的形式的:控件类型(根对象, [属性列表]),在控件定义好...
  • 使用JavaFX2.0的控件

    万次阅读 2012-08-29 16:28:09
    使用JavaFX2.0的控件 (原文:Alla Redko/甲骨文高级技术专家)   关于本教程 本教程覆盖了JavaFX API中内置的JavaFX UI控件。 本文包含以下章节: JavaFX的UI控件 标签按钮单选按钮切换按钮复选框选择框...
  • 在WPF中使用WinForm或自定义控件

    千次阅读 2016-05-27 14:22:40
    WPF中,好多控件与WinForm是存在差异的,想要使用熟悉的WinForm控件,除了添加必要的System.Windows等系统库之外,还要添加如下的代码,以下是msdn上给的,初步测试没问题 。 1. 下边一句,需要你手动添加。 ...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 29,449
精华内容 11,779
关键字:

以下不能作为容器使用的控件是