从c#转Java,现在做窗体,现在才发现,java的界面和c#的界面设计理念一点都不同。布局方式貌似都不和心意啊...就互相嵌套都好费神。
网上逛了一圈,题目都是《谁说java做布了漂亮的界面》这类型的,我一看,尼玛,这也叫漂亮?
除了用其他软件设计和一定的平台渲染,java,你能提供更好的设计理念么?
java 你火了这么多年,除了跨平台,和移植性不错等优点,难道连界面这点事都搞不定么?
你不要对我说java不注重界面,他主要是做****的。你还真搞笑...java活了这么多年,从来就是你们这些人去适应,难道就没有人质疑么?
有质疑的人,你们....貌似都沉默了...
或许,作为初学者,我站的高度没有你们那么遥不可及。难道,你就甘心一直这样持续下去?
或许是我受.NET毒害太深,毕竟我学编程不过3年。技术还刚刚入门。作为高手的你们,对java的狂热一丝不减。我的话可能已经引起了公愤。但是你们没有对java的界面设计感到头痛么?难道你觉得把大把的时间花费在界面上是技术高深的体现么?某些事,或许深入的久了,就会被麻痹。
某些事,或许适应的久了,就会真的适应了
没有人会去质疑,没有人去反驳...java目前在世界上的使用者居首位,如此庞大的人群,和更多的后来者。java,你的界面设计依然还是你的弱项。
更多的人适应了,还有更多的人学着适应,还有更多的人被适应,我想,某天我也会适应了....难道,真的就是这样的么?真的就必须是这样的么?真的不会更改么?而你...拥有质疑的意识么刚刚学习java,界面搞得我好烦,发发牢骚顺便散散分
网上逛了一圈,题目都是《谁说java做布了漂亮的界面》这类型的,我一看,尼玛,这也叫漂亮?
除了用其他软件设计和一定的平台渲染,java,你能提供更好的设计理念么?
java 你火了这么多年,除了跨平台,和移植性不错等优点,难道连界面这点事都搞不定么?
你不要对我说java不注重界面,他主要是做****的。你还真搞笑...java活了这么多年,从来就是你们这些人去适应,难道就没有人质疑么?
有质疑的人,你们....貌似都沉默了...
或许,作为初学者,我站的高度没有你们那么遥不可及。难道,你就甘心一直这样持续下去?
或许是我受.NET毒害太深,毕竟我学编程不过3年。技术还刚刚入门。作为高手的你们,对java的狂热一丝不减。我的话可能已经引起了公愤。但是你们没有对java的界面设计感到头痛么?难道你觉得把大把的时间花费在界面上是技术高深的体现么?某些事,或许深入的久了,就会被麻痹。
某些事,或许适应的久了,就会真的适应了
没有人会去质疑,没有人去反驳...java目前在世界上的使用者居首位,如此庞大的人群,和更多的后来者。java,你的界面设计依然还是你的弱项。
更多的人适应了,还有更多的人学着适应,还有更多的人被适应,我想,某天我也会适应了....难道,真的就是这样的么?真的就必须是这样的么?真的不会更改么?而你...拥有质疑的意识么刚刚学习java,界面搞得我好烦,发发牢骚顺便散散分
解决方案 »
- 有人能告诉我JAVA EE和JAVA WEB的关系和区别吗?
- 数据库监听,用struts2.0
- 怎么用一条sql语句把学生的分数都列出来
- Birt用外部数据源出错
- spring的AOP拦截struts2中的方法问题
- =======最新常见面试题======,大家看看,最新的哦
- 谁能说说SOAP,WSDL,AXIS,HTTP在web service 中的联系。
- 关于weblogic中SessionBean能存活多长时间的问题??
- Tomcat5.0.12配置两个地方就不能正常启动,求助!
- struts2 中namespace的问题
- APPLET,用以下公式计算数学常数E的X次方:EX=1+X1/1!+X2/2!+X3/3!+、、、、、、,为什么实现不了
- 关于Struts2 <s:select headerKey="" headerValue="">的问题
“C#你作为在世界上使用最简单的语言, 难道你自己连XXX设计理念还不能换一下么?”
“python你作为在世界上执行效率如此高的语言, 难道你自己连XXX设计理念还不能换一下么?”唠叨一句:java仿C++,C#仿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,楼主都要下狠功夫练布局,这关过不去,就别做桌面程序了..加油!
可惜老三的Swing是一把刀的文章被删除了,否则你也可以看看他的例子
做好看的界面很费脑子的
其实我是从上周开始学习java的,有的方面和c#差不多,所以,我在第五天后,就把一个以前用c#做的端口扫描器用java实现了。其中用到泛型、类是必须的、还有多线程,什么的都在。感觉和c#只是在语言的某些语法上不同还有少部分是不相同的。
所以,我在学习界面这块的时候,觉得设计界面实在太耗时了。如果你想用那些布局管理器做出心仪的界面来,确实不好实现。所以就出现了我上面的问题。
你们的批评我看的很羞愧,说实话,我确实脸红了。 额 顺带一句,貌似有几个的发言被删了...不知怎么回事
我在java所处的高度没有你们那么高,所以,我接受你们的经验。谢谢各位。
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
}
}
}
下面紧接着.....
//---所有要用的函数-------------------------------------------------------------
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;
}
// ------------------------------------------------------------------------------
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编译就可以