从c#转Java,现在做窗体,现在才发现,java的界面和c#的界面设计理念一点都不同。布局方式貌似都不和心意啊...就互相嵌套都好费神。
网上逛了一圈,题目都是《谁说java做布了漂亮的界面》这类型的,我一看,尼玛,这也叫漂亮?
除了用其他软件设计和一定的平台渲染,java,你能提供更好的设计理念么?
java 你火了这么多年,除了跨平台,和移植性不错等优点,难道连界面这点事都搞不定么?
你不要对我说java不注重界面,他主要是做****的。你还真搞笑...java活了这么多年,从来就是你们这些人去适应,难道就没有人质疑么?
有质疑的人,你们....貌似都沉默了...
或许,作为初学者,我站的高度没有你们那么遥不可及。难道,你就甘心一直这样持续下去?
或许是我受.NET毒害太深,毕竟我学编程不过3年。技术还刚刚入门。作为高手的你们,对java的狂热一丝不减。我的话可能已经引起了公愤。但是你们没有对java的界面设计感到头痛么?难道你觉得把大把的时间花费在界面上是技术高深的体现么?某些事,或许深入的久了,就会被麻痹。
某些事,或许适应的久了,就会真的适应了
没有人会去质疑,没有人去反驳...java目前在世界上的使用者居首位,如此庞大的人群,和更多的后来者。java,你的界面设计依然还是你的弱项。
更多的人适应了,还有更多的人学着适应,还有更多的人被适应,我想,某天我也会适应了....难道,真的就是这样的么?真的就必须是这样的么?真的不会更改么?而你...拥有质疑的意识么刚刚学习java,界面搞得我好烦,发发牢骚顺便散散分

解决方案 »

  1.   

    额,既然java那么让你头痛,何必要转过去呢?我还是喜欢.net
      

  2.   

    现在java开发界面用的最多的应该是rcp-swt吧  就是eclipse那一套的开发语言
      

  3.   

    楼主既然对java的界面组件如此不满,可以自己研究开发界面优美、适应各种平台的组件。每种语言都自身的优劣性,没有一种语言可以解决全部的需求,选择适合自己的需求的。或许有人从JAVA转C#,或者从从JAVA转python,或者然后又出现帖子:
    “C#你作为在世界上使用最简单的语言, 难道你自己连XXX设计理念还不能换一下么?”
    “python你作为在世界上执行效率如此高的语言, 难道你自己连XXX设计理念还不能换一下么?”唠叨一句:java仿C++,C#仿java。
      

  4.   

    因为商用的java应用绝大部分是没有界面的,或后台服务,或B/S,所以java开发/维护者没必要把时间花在这个鸡肋上像c++标准中就没有定义界面,界面都是由各家界面库组成,这种挺好,你可以选择MFC,也可以选择用QT作为java,将界面定到语言标准里,确实是不明智的,当然java也有一些界面库LZ,我想应该是没有工作,或者工作了也是做windows界面程序,java目前根本无意争这块市场,都是企业应用这块,桌面程序,java目前争不过c++,争不过delphi为什么要花精力花财力在界面上呢,还不如去提高大部分人使用的企业应用
      

  5.   

    java 做web也就是(B/S)方面的开发的挺多,做(C/S)结构用java很少,且界面我觉得也不怎么样
      

  6.   

    作为一种工具,做桌面竟然选择java,若没有跨平台的需求,意义何在?当然,.NET做桌面用户体验也很差劲,还是delphi,vb,MFC,QT这些界面好,界面画好了,后面爱用什么用什么
      

  7.   

    好吧,我被你打败了,谁说Java做不出好看的界面?你自己技术达不到那个水平而已,.net能做出来的所有界面,java都能做出来。.net和java都只是一种语言而已,.net无非多了一些win32类库而已,只要你能实现那些类库的功能,有什么做不出来的。
      

  8.   

    所谓好看的界面,都是用GC画出来的或者贴图,.net有自己的GC,swing也有,swt也有,你练基本的界面都写不出来,怎么能够做出高级的界面来?就算你用.net做,也只是会用用别人的类库而已,让你做个有创意的播放器,你都搞不定吧。
      

  9.   

    我所有的桌面应用都是基于Java开发的,有媒体播放器,企业级的报表开发工具,自己opensource的工具。在操作系统方面,你要实现紧密结合系统的功能,必须了解系统底层的API,就算是vb,delphi,VC,都逃避不了,java有库都可以直接调用系统的API,连jni都不需要写,直接通过java就能调用系统任何一个API。语言就是语言,永远不要说哪个语言好,哪个语言不好。
      

  10.   

    JAVA做界面的话,用swt吧,对win支持是很好的。至于java的GUI差,这是一开始设计原因。因为要实现跨平台,每个平台对GUI的实现及渲染上差异很大,相对于跨平台和GUI,只能牺牲后者。习惯了VS的鼠标拖放设计+编码,从C#转移JAVA,习惯和理念都要转换啊 呵呵
      

  11.   

        每种语言都有他的优劣,既然他能火就有他火的原因,就没见过用java界面来商用的,学习java 图形化界面是为了提升java基础,通过一个可视的程序来实现一些业务,进而学习java的思想和设计模式。要想漂亮也不难,java有很多插件做出来的界面还是不错的。
      

  12.   

      我的感觉和lz不同,虽然java做界面手写的多,但很有意思..
      
      我c#也学过,也跟着老师过一个简单的学生管理系统,感觉界面主要是靠拖拉,然后双击控件,写事件处理代码
      
      java做界面,不管是swing还是swt,都有那么常用的4种布局管理器,每种布局管理器都有很多的属性可以调节,所以要想做出漂亮的界面,这4种布局管理器一定要玩转才行,而要想玩转是需要一定代码量的,不像c#一拖就行了
      
      建议lz把你以前做过的c#应用界面,选几个复杂点得用java实现,不要用UI插件,完全手写,这样才能练出来..  "就互相嵌套都好费神",楼主的这种感觉是很正常的,我也曾经在这儿感觉很吃力,但java的UI思想就是嵌套,这时就说明你java布局思想还没有形成,布局管理器还需好好练...   java界面有个eclipse插件叫windowbuilder,可以实现很c#一样的效果,但是学习阶段不建议用,还是手写能练出来,手写灵活,比如变量命名,类型...插件自动生成的代码结构很乱,最后还得调..  我用swt/jface做过一个rcp电子评标系统,界面是可以跨平台的,我放到linux下运行,就是linux的一套界面,运行速度还可以..至于swing,好像现在swing也能做出漂亮的界面.  不管是swt还是swing,楼主都要下狠功夫练布局,这关过不去,就别做桌面程序了..加油!   
      
      

  13.   

    java擅长的是做企业及开发 大哥
      

  14.   

    楼主,其实我是这样认为的,术业有专攻,java也许并不适合界面的美化,就像linux不适合桌面一个道理,各有各的用处
      

  15.   

    做出什么样的界面看水平:http://code.google.com/p/macwidgets/
    可惜老三的Swing是一把刀的文章被删除了,否则你也可以看看他的例子
    做好看的界面很费脑子的
      

  16.   

    额  好吧好吧...我承认我刚刚接触java...看得我满脸通红,汗如雨下,羞愧的不行了。结贴给分。
      

  17.   

    其实,我想说的是java这么多年了,有的东西是不是应该做得更加人性化一点。
    其实我是从上周开始学习java的,有的方面和c#差不多,所以,我在第五天后,就把一个以前用c#做的端口扫描器用java实现了。其中用到泛型、类是必须的、还有多线程,什么的都在。感觉和c#只是在语言的某些语法上不同还有少部分是不相同的。
    所以,我在学习界面这块的时候,觉得设计界面实在太耗时了。如果你想用那些布局管理器做出心仪的界面来,确实不好实现。所以就出现了我上面的问题。
    你们的批评我看的很羞愧,说实话,我确实脸红了。 额  顺带一句,貌似有几个的发言被删了...不知怎么回事
    我在java所处的高度没有你们那么高,所以,我接受你们的经验。谢谢各位。
      

  18.   

    我学习java4天后的成果  端口扫描器  希望格式都在import java.util.ArrayList;
    import java.util.Scanner;
    import java.net.InetSocketAddress;
    import java.net.Socket;
    import java.net.SocketAddress;
    import java.lang.Thread;public class MyPortScanner extends Thread
    {
    //在这里定义几个全局变量
    /**
     * @see 用来保存累加的ip和提供多线程的ip池
     **/
    public static ArrayList<String> IPlist=new ArrayList<String>();
    /**
     * @see 用来保存索要扫描的端口和提供多线程所需的端口池
     **/
    public static ArrayList<Integer> Portlist=new ArrayList<Integer>();
    /**
     *@see 用来匹配ip是否是允许的字符串      isMatchIpString
     **/
        static String isMatchIpString="(0|[1-9]|[1-9][0-9]|(1[0-9][0-9]|(2[0-4][0-9]|25[0-5]))).(0|[1-9]|[1-9][0-9]|(1[0-9][0-9]|(2[0-4][0-9]|25[0-5]))).(0|[1-9]|[1-9][0-9]|(1[0-9][0-9]|(2[0-4][0-9]|25[0-5]))).(0|[1-9]|[1-9][0-9]|(1[0-9][0-9]|(2[0-4][0-9]|25[0-5])))";
        /**
     *@see 用来匹配端口是否是允许的字符串  isMatchPortString
     **/
        static String isMatchPortString="(^([0-9]{1,5},?)*$)|(^([0-9]{1,5}-?[0-9]{1,5},?)*$)";
        /**
    *@see 用来匹配正整数是否是允许的字符串
        **/
    static String isMatchTimeoutString="(\\d)*";
        /**
         *@see  指向{@link Portlist}中所使用的Port的下标  因为在扫描时 需要知道{@link Portlist}中的ip 这是指向{@link Portlist}的下标
         **/
        public static int pointIpNumer=0;
        ///**
         //*@see  指向{@link IPlist}中所使用的ip的下标  因为在扫描时 需要知道{@link IPlist}中的ip 这是指向{@link IPlist}的下标
         //**/
        //public static int pointPortNumber=0;
        /**
         * @see 允许的最大线程
         **/
        public static  int allowMaxthread=100;
        /**
         * @当前运行的线程数
         */
        public static int nowRunthread=0;
        
        //static boolean Portisdone=false;
    //----------------------------------------------------------------------------------------------------------------------------------------------
    /**
     * @see主函数
     **/
    public static void main(String[] args) {
    //System.out.print("hello");
    Scanner sc=new Scanner(System.in);
    String startIpforStart="127.0.0.1",endIpforStart="127.0.0.1",portRang="21,23,25,80,3389,100-200";
    int outtime=300;
    while(true)
    {
    System.out.print("请输入起始ip:");
    startIpforStart=sc.next();
    if(startIpforStart.matches(isMatchIpString))
    break;
    else
    System.out.print("ip错误\n");
    }
    while(true)
    {
    System.out.print("请输入结束ip:");
    endIpforStart=sc.next();
    if(endIpforStart.matches(isMatchIpString))
    break;
    else
    System.out.print("ip错误\n");
    }
    while(true)
    {
    System.out.print("响应时间(300ms|毫秒)(数字):");
    String time=sc.next();
    if(time.matches(isMatchTimeoutString))
    {
    outtime=Integer.parseInt(time);
    break;
    }
    else
    {
    System.out.print("响应时间写错了\n");
    }
    }
    while(true)
    {
    try{
    System.out.print("请输入端口范围:(如:20-80,135,445)");
    portRang=sc.next();
    if(portRang.matches(isMatchPortString))
    {
    break;
    }
    else
    System.out.print("端口范围错误,请参照提示.\n");
    }
    catch(Exception ex)
    {
    System.out.print("异常:"+ex);
    }
    }
    //开始向Iplist中添加ip  222.240.0.0 222.245.223.255
    Thread forAddipth=new IPAdd(startIpforStart, endIpforStart);
    forAddipth.start();

    System.out.print("正在计算端口,请稍后.....\n");
    if(!CheckPorts(portRang))
    {
    System.out.print("端口添加失败\n");
    }
    else
    {
    System.out.print("扫描端口中...\n");

    //这里先休眠5s钟 等待iplist列表中添加了足够多的ip
    long sleeptime=5000;
    try {
    Thread.sleep(sleeptime);

    catch (InterruptedException e) {
    e.printStackTrace();
    }
    //下面就开始从IPlist中取ip了 可能在这个时候IPlist还没有添加完  但是已经足够用了  一边用 一边添加(虽然看不见  但是仍然存在)
    while(true)
    {
    if(pointIpNumer<IPlist.size())
    {
    String sendip=IPlist.get(pointIpNumer);//ip
    for(int pointPortNumber=0;pointPortNumber<Portlist.size();pointPortNumber++)
    {
    Thread th=new MyPortScanner(sendip,Portlist.get(pointPortNumber),outtime);
    th.setName(sendip+Portlist.get(pointPortNumber));
    th.start();
    nowRunthread++;//新增了一个线程
    while(nowRunthread>=allowMaxthread);
    }
    }
    else
    {
    try {
    Thread.sleep(3000);
    } catch (InterruptedException e) {
    // TODO Auto-generated catch block
    //e.printStackTrace();
    }
    System.out.print("扫描完毕...");
    break;//代表扫面完毕了
    }
    pointIpNumer++;//指向下一个ip
    }
    }
    }
    下面紧接着.....
      

  19.   


    //---所有要用的函数-------------------------------------------------------------
    public static boolean Add_port(String ThePortrang)
    {
    MyPortScanner.Portlist.clear();//清空原来的
        boolean TheTF = true;
        String[] newrange = ThePortrang.split("\\-");
        try
        {
            int ARang = Integer.parseInt(newrange[0]);
            int BRang =  Integer.parseInt(newrange[1]);
            if (ARang < BRang && BRang < 65536)
                for (int iA = ARang; iA < BRang + 1; iA++)
                {
                 Portlist.add(iA);
                }
            else if (BRang < ARang && ARang < 65536)
            {
                for (int iB = BRang; iB < ARang + 1; iB++)
                {
                 Portlist.add(iB);
                }
            }
            else TheTF = false;//那么这样的端口就不在程序范围了
        }
        catch (Exception ex)
        {
            TheTF = false;
        }     
        //这个没用  先注释了
        //if (TheTF == true)
           // Portisdone = true;
        return TheTF;
    }

    public static boolean CheckPorts(String portString)//端口号只有整数,范围是从0 到65535(2^16-1)但是有的扫描器上可以扫65536的 所以宁可错扫 但绝不放过 用最大的 65536端口
        {
            boolean Theboolen = true;
            String regtext1 = "(^[0-9,-]*$)";//只能有数字和-和,出现
            String regtext2 = "(^[0-9,-]*$)";
            String Regtext3 ="(\\d)*(-)(\\d)*";
            if (portString.matches(regtext1))//判断是否写了(数字和","号 和"-"号)以外的字符 false代表出现了
            {
                if (portString.matches(regtext2))//若匹配 则是输入了","号分隔了 如:20,23,80-100或者 23,24,25,
                {
                    //这下分两种情况了                     120,23,80-100    ||        2,23,24,25
                    //不论怎样,先分割字符串
                    String[] portData = portString.split("\\,");
                    for (int i = 0; i < portData.length; i++)
                    {
                        //这下又开始麻烦了- -!
                        //好吧 判断里面有没有"-"
                        if (portData[i].matches(Regtext3))//20-80
                        {
                            Theboolen = Add_port(portData[i]);
                            if (Theboolen == false) break;//....
                        }
                        else //重复代码!
                        {
                            if(portData [i]!="")
                            if (Integer.parseInt(portData[i]) < 65536)
                                Portlist.add(Integer.parseInt(portData[i]));
                            else
                            { Theboolen = false; break; }
                        }
                    }
               }            else if (portString.matches(Regtext3))//若匹配 则是输入了"-"号格式如:20-80
                {
                    Theboolen = Add_port(portString);
                }            else //那么就只有这个情况了 只输入了数字 如:20
                {
                    if (Integer.parseInt(portString) < 65536)
                        Portlist.add(Integer.parseInt(portString));
                    else Theboolen = false;
                }
            }
            else Theboolen = false;
            return Theboolen;
        }
      

  20.   


    // ------------------------------------------------------------------------------
    String ip="127.0.0.1";
    int porter;
    int timeouter=300;
    public MyPortScanner(String accessIp,int port,int timeout)
    {
    ip=accessIp;
    porter=port;
    timeouter=timeout;
    }
    public MyPortScanner(int port,int timeout)
    {
    porter=port;
    timeouter=timeout;
    }
    public MyPortScanner(int port)
    {
    porter=port;
    }

    /**
     * @see 函数功能
     * @param 参数....
     * **/
    public void run()
    {
    try{
    SocketAddress AddressAndPort=new InetSocketAddress(ip,porter);
    Socket s=new Socket();
    s.connect(AddressAndPort,timeouter);
    s.close();
    System.out.print(ip+":"+porter+"\n");
    }
    catch(Exception ex)
    {
    //System.out.print("线程出现异常:"+nowRunthread+" \n");
    }
    finally
    {
    nowRunthread--;//这个线程运行完毕了
    }
    }
    //--------------------------------------------------------------------------
    }
    class IPAdd extends Thread{//IP类  可以为IPList添加自增的ip   extends Thread
    String Strat;
        String End;    /**
         * @see IPAdd的构造函数
         * @param Startip 起始ip
         * @param Endip   结束ip
         */
        public IPAdd(String Startip, String Endip)
        {
            //这里智能一下下,判断起始ip是哪个
            int AvsB = 0;
            AvsB = Startip== Endip?1:0;
            if (AvsB < 1)
            {
                Strat = Startip;
                End = Endip;
            }
            else
            {
                Strat = Endip;
                End = Startip;
            }
        }    public void run()
        {
            String[] TheStartIp = Strat.split("\\.");//接受起始ip
            String[] TheEndIp = End.split("\\.");//接受结束ip
            //分别保存ip段的网络地址+子网地址+主机地址如:127.0.0.1
            int first;//127  代表【0】处
            int second;//0   代表【1】处
            int third;//0    代表【2】处
            int fourth;//1   代表【3】处        //【0】处开始不相同
            //#region
            if (Integer.parseInt(TheStartIp[0]) < Integer.parseInt(TheEndIp[0]))
            {
                first = Integer.parseInt(TheStartIp[0]);
                second = Integer.parseInt(TheStartIp[1]);
                third = Integer.parseInt(TheStartIp[2]);
                fourth = Integer.parseInt(TheStartIp[3]);            while (first < Integer.parseInt(TheEndIp[0]))
                {
                    //前面定义 里面要用
                    while (second < 256)
                    {
                        while (third < 256)
                        {
                            while (fourth < 256)
                            {
                             MyPortScanner.IPlist.add(first+"."+second+"."+third+"."+fourth);
                                fourth++;
                            }
                            if (fourth > 255)
                                fourth = 0;                        third++;
                        }
                        if (third > 255)
                            third = 0;
                        second++;
                    }
                    if (second > 255)
                        second = 0;
                    first++;
                }
                Strat = first+ "." + second+ "." + third+ "." + fourth;
                TheStartIp = Strat.split("\\.");
                //System.out.print("第一阶段完毕-------------------------------");
            }        //--------------------------------------------------------------------------------------------------------------------------
            //【1】处开始不相同
            if (Integer.parseInt((TheStartIp[0])) == Integer.parseInt(TheEndIp[0]) && Integer.parseInt((TheStartIp[1])) < Integer.parseInt(TheEndIp[1]))
            {
                first = Integer.parseInt(TheStartIp[0]);
                second = Integer.parseInt(TheStartIp[1]);
                third = Integer.parseInt(TheStartIp[2]);
                fourth = Integer.parseInt(TheStartIp[3]);
                while (second < Integer.parseInt(TheEndIp[1]))
                {
                    while (third < 256)
                    {
                        while (fourth < 256)
                        {
                         MyPortScanner.IPlist.add(first+"."+second+"."+third+"."+fourth);
                            fourth++;
                        }
                        if (fourth > 255)
                            fourth = 0;                    third++;
                    }
                    if (third > 255)
                        third = 0;
                    second++;
                }
                Strat =first+"."+second+"."+third+"."+fourth;
                TheStartIp = Strat.split("\\.");
                // System.out.print("第二阶段完毕-------------------------------");
            }
            //----------------------------------------------------------------------------------------------------------------------------------
            //【2】处开始不相同
            //----------------------------------------------------------------------------------------------------------------------------------
            if (Integer.parseInt((TheStartIp[0])) == Integer.parseInt(TheEndIp[0]) && Integer.parseInt((TheStartIp[1])) == Integer.parseInt(TheEndIp[1]) && Integer.parseInt((TheStartIp[2])) < Integer.parseInt(TheEndIp[2]))
            {
                first = Integer.parseInt(TheStartIp[0]);
                second = Integer.parseInt(TheStartIp[1]);
                third = Integer.parseInt(TheStartIp[2]);
                fourth = Integer.parseInt(TheStartIp[3]);
                while (third < Integer.parseInt(TheEndIp[2]))
                {
                    while (fourth < 256)
                    {
                     MyPortScanner.IPlist.add(first+"."+second+"."+third+"."+fourth);
                     fourth++;
                    }
                    if (fourth > 255)
                        fourth = 0;
                    third++;
                }
                Strat =first+"."+second+"."+third+"."+fourth;
                TheStartIp = Strat.split("\\.");
                //System.out.print("第三阶段完毕-------------------------------");
            }
            //-----------------------------------------------------------------------------------------------------------------------
            //【3】处开始不相同
            if (Integer.parseInt((TheStartIp[0])) == Integer.parseInt(TheEndIp[0]) && Integer.parseInt((TheStartIp[1])) == Integer.parseInt(TheEndIp[1]) && Integer.parseInt((TheStartIp[2])) == Integer.parseInt(TheEndIp[2]) && Integer.parseInt((TheStartIp[3])) < Integer.parseInt(TheEndIp[3]) + 1)
            {
                first = Integer.parseInt(TheStartIp[0]);
                second = Integer.parseInt(TheStartIp[1]);
                third = Integer.parseInt(TheStartIp[2]);
                fourth = Integer.parseInt(TheStartIp[3]);
                while (fourth < Integer.parseInt(TheEndIp[3]) + 1)
                {
                 MyPortScanner.IPlist.add(first+"."+second+"."+third+"."+fourth);
                 fourth++;
                }
                System.out.print("------IP增加完毕----------------\n");
            }
            else
            {
             System.out.print("IP貌似填错了\n");
            }
        }
    }
    全部都完成了...有兴趣的可以试试  直接把这三部分复制到一个文件中 保存为MyPortScanner.java编译就可以