
Java对于服务器 个人电脑和移动设备来说是一项伟大的技术 由于需要java的跨平台的特性 因此java在服务器和移动设备方面的应用是非常成功的 但java在个人电脑应用方面的情况和在服务器及移动设备方面的应用有所不同 但是这很快就会有所改变 至少比你想象得要快 在这篇文章中 我会分析一下java在桌面环境中的应用将怎样得到提升 然后具体说一下java GUI(用户图形接口)的三个主要的工具:AWT Swing 和SWT 在下文中 我将会开发一个完整的java桌面应用程序 Java与桌面端 现在 流行的桌面平台要数Windows Mac and Linux了 但它们不是十全十美的 Windows主宰著桌面 *** 作系统的市场 其上有巨大的应用和开发群体 但它昂贵且有许多安全漏洞 Linux有着稳固的基础 它是开源的软件 比Windows更可靠 Macs非常容易 *** 作且不是黑客的目标 但与Windows和Linux比起来 Mac的硬件和软件可选的余地非常的有限 公司和个人选择他们的 *** 作系统基于许多因素 花费少且安全性高是首选的因素 这导致一些组织从Windows 系统转而选择Linux 对许多用户来说 可用性及对原有应用程序的支持是非常重要的因素 这意味着Windows 将继续享有巨大的市场 Mac有其自己忠诚的用户 这使得苹果机仍然可以存活 Linux 在桌面的流行及Mac的成功创造了多样性 这种多样性正是Java需要的 这种多样性使得Java在桌面有举足轻重的地位 跨平台的支持 Java 运行于所有相关的 *** 作系统 包括Windows Mac和Linux 对于任何组织 他想把现有的应用从一个 *** 作系统移植到另一个 *** 作系统而不用做太多的改动 那么Java正是他们首选的桌面开发平台 或许用微软的可视化工具很容易构建 NET应用 但是这将使你被绑定在了Windows平台上了 很多人也许想立刻用Linux 代替Windows 从而避免由微软件 *** 作系统的漏洞带来的问题 用户不能容忍的问题之一是当从Windows移植到Linux带来的巨大的费用 如果你的应用程序用Java构建 你就没有了这些问题 Java的图形用户界面看上去会跟你用的 *** 作系统一样 而并不需要做什么改动 假如有一天又有一种桌面 *** 作系统出现的话 java 是个安全的赌注 因为它现在能够运行在Windows和Linux 上 那么可以推测它也可以运行在将来可能出现的 *** 作系统上 这些 *** 作系统可能或迟或早地由微软 或是开源社区 或是其它的人开发出来 丰富的特征 最初 Java只有非常有限的一些特征去构建图形用户界面 思想就是用平台无关的Java应用程序接口打包不同的 *** 作系统的本地图形用户界面 称之为抽象的窗口工具 仅有普通的部件如文件域 文本区 选择框 单选按钮 列表框和按钮被AWT支持 图形和图像的特性支持非常有限 也就是说 只足够构建简单的applet程序 认识到需要更高级的图形用户界面组件和图形能力 Sun公司开发了Swing Java D Java D 图像的输入/输出 Java高级图像(JAI)和很多其它的 这些中的一些窗体组件现在已经是Java 标准版(J SE)里的一部分 并且其它的一些扩展必须和你的应用程序打包在一起 例如Swing Java D 图像的输入/输出都是Java的核心API 随着Java开发工具包(JDK)和Java运行环境一起提供 让我们不要忘了J EE平台 如果你开发服务器端的应用程序并且需要丰富的图形用户界面 那么你毫无疑问应该选择Java 这允许你把服务器端的一些代码移到客户端 反之亦然 例如 一个项目可能开始是基于WEB和图形界面 在某些时候 用户可能要求图形元素不能在HTML中实现 如果你选择java做客户端应用 那么你可以重用这些当初用来做服务器端的代码 如果你用远程调用 一些类会真正地实现服务器和客户端的共享 通过页面服务器 Java桌面应用也能够和其它的Java 或非Java应用程序通信 如CORBA TCP/IP 或是 >
class Trangle{
private double a, b, c;//三个边
private double area;//面积
private double perimeter;//周长
public double getArea() {//返回面积
return area;
}
public double getPerimeter() {//返回周长
return a+b+c;
}
public void setA(double a) {//修改边a
thisa = a;
}
public void setB(double b) {//修改边b
thisb = b;
}
public void setC(double c) {////修改边c
thisc = c;
}
public static boolean isTrangle(double a, double b, double c){//判断三个数能否构成一个三角形
if(a <= 0 || b <=0 || c<=0){
return false;
}
return a + b > c && a + c > b && b + c > a;
}
}
class Lader{
private double a;//上底
private double b;//下底
private double h;//高
private double area;//面积
public double getArea() {//返回面积
return (a+b)h/2;
}
}
class Circle{
private double r;//半径
private double perimeter;//周长
private double area;//面积
public double getArea() {//返回面积
return 314 r r;
}
public double getPerimeter() {//返回周长
return 3142r;
}
}
可以把普通的Java程序做成真正的exe,也就是单一个exe就可以在没有安装JVM的机器上运行。这样的工具常见的有JET和gcj前者是收费的,而且做出来的exe还是需要一堆dll。推荐使用gcj他有windows和Linux版,直接下载zip包,不需要安装,里面有不少例子,一些build的批处理文件。从原理来说gcj自己实现了JVM规范,也就是你编写一个HelloWorldjava,其中的main方法为Systemoutprintln("foo");
当使用gcj把它做成exe(大约2M),运行这个exe时,会启动里面的一个小型jvm,在这上面跑HelloWorld。
其实,把Java做成纯exe实在是吃力不讨好,有很多限制,文件又大。
我比较倾向另几种做法:
使用InstallAnywhere等工具,制作一个exe的安装包
用户可以选择使用他机器上的JRE或是这个安装包内的JRE来运行程序
这是很常见的一种做法,如JBuilder就是这么做的。
这样的好处是不要求对方机器上装有JRE,而且你原来的程序不需要任何改动。
InstallAnywhere中一个压缩的JRE大概是8M。
制作成可执行的jar,也就是在META-INF的MANIFEST文件制定Main-Class
可以通过命令行java -jar jarfilejar来执行,windows默认的把jar使用javaw -jar打开,所以有些机器上可以直接双击jar运行。
制作伪exe,其实和上一种做法是一样的,只不过做成exe,调用系统的javaexe来运行它,这样的工具有nativeJ,exe4j等
其实Java不像VB,Delphi只是一个语言,而是一个平台。
jar是最常用的部署单元,做成exe没什么意思。
一、exe4j。
说明:exe4j可以将Jar文件制作成exe文件,但需jre支持,也可将Jar文件放在外面。
软件性质:共享软件
下载地址:>
将Java应用程序本地编译为EXE的几种方法(推荐使用JOVE和JET)
1 从>>
使用javafx的Media,MediaPlayer,MediaView。代码如下:
import javaioFile;import javafxapplicationApplication;
import javafxbeansbindingBindings;
import javafxbeanspropertyReadOnlyProperty;
import javafxbeansvalueObservableValue;
import javafxeventActionEvent;
import javafxgeometryPos;
import javafxsceneScene;
import javafxscenecontrolButton;
import javafxscenecontrolMenu;
import javafxscenecontrolMenuBar;
import javafxscenecontrolMenuItem;
import javafxscenecontrolSlider;
import javafxsceneimageImage;
import javafxsceneimageImageView;
import javafxscenelayoutBorderPane;
import javafxscenelayoutHBox;
import javafxscenelayoutPane;
import javafxscenelayoutVBox;
import javafxscenemediaMedia;
import javafxscenemediaMediaPlayer;
import javafxscenemediaMediaPlayerStatus;
import javafxscenemediaMediaView;
import javafxstageFileChooser;
import javafxstageFileChooserExtensionFilter;
import javafxstageStage;
import javafxutilDuration;
public class App extends Application {
private MediaView mediaView;
private Slider processSlider;
private static final Object AUTO = new Object(), MANUAL = new Object();
public static void main(String[] args) {
launch(args);
}
@Override
public void start(Stage primaryStage) throws Exception {
primaryStagesetTitle("javafx视频播放器");
BorderPane root = new BorderPane();
// 菜单栏
initMenu(root);
// 视频播放控件
mediaView = initMediaView(root);
// 视频功能控件
initMediaControllView(root);
primaryStagesetScene(new Scene(root, 600, 400));
primaryStagesetOnCloseRequest(event -> Systemexit(0));
primaryStageshow();
}
private MenuBar initMenu(final BorderPane parent) {
Menu menu = new Menu("菜单");
MenuItem item = new MenuItem("打开");
itemsetOnAction(event -> {
FileChooser chooser = new FileChooser();
choosersetTitle("选择视频文件");
choosergetExtensionFilters()add(new ExtensionFilter("视频文件", "mp4", "flv"));
File file = choosershowOpenDialog(parentgetScene()getWindow());
if (file != null) {
MediaPlayer player = mediaViewgetMediaPlayer();
// 关闭当前的player
if (player != null) {
playerstop();
playerdispose();
}
processSlidersetValue(0);
// 创建一个新的player并自动播放
player = new MediaPlayer(new Media(filetoURI()toString()));
playercurrentTimeProperty()addListener(this::mediaProcessChanged);
playersetAutoPlay(true);
mediaViewsetMediaPlayer(player);
}
});
menugetItems()add(item);
item = new MenuItem("退出");
itemsetOnAction(event -> parentgetScene()getWindow()hide());
menugetItems()add(item);
MenuBar menuBar = new MenuBar(menu);
parentsetTop(menuBar);
return menuBar;
}
private MediaView initMediaView(final BorderPane parent) {
MediaView view = new MediaView();
Pane pane = new Pane(view);
parentsetCenter(pane);
// 视频宽高可随着窗口变化而自动缩放
viewfitWidthProperty()bind(BindingsselectDouble(viewparentProperty(), "width"));
viewfitHeightProperty()bind(BindingsselectDouble(viewparentProperty(), "height"));
viewsetPreserveRatio(true);
return view;
}
private void initMediaControllView(final BorderPane parent) {
VBox bottom = new VBox(10);
bottomsetAlignment(PosCENTER);
parentsetBottom(bottom);
Slider slider = new Slider(0, 100, 0);
slidervalueProperty()addListener(this::processSliderChanged);
// slidersetOnMouseClicked(this::processSliderClicked);
bottomgetChildren()add(slider);
processSlider = slider;
HBox hbox = new HBox(10);
bottomgetChildren()add(hbox);
hboxsetAlignment(PosCENTER);
Button btn = new Button(null, new ImageView(loadImage("pausepng")));
btnsetOnAction(this::pauseOrPlay);
hboxgetChildren()add(btn);
btn = new Button(null, new ImageView(loadImage("stoppng")));
btnsetOnAction(this::stopPlay);
hboxgetChildren()add(btn);
}
private static Image loadImage(String resPath) {
return new Image(ThreadcurrentThread()getContextClassLoader()getResourceAsStream(resPath));
}
private void pauseOrPlay(ActionEvent event) {
MediaPlayer player = mediaViewgetMediaPlayer();
if (player == null) {
return;
}
Status status = playergetStatus();
if (status == StatusREADY || status == StatusPAUSED) {
playerplay();
((Button) eventgetTarget())setGraphic(new ImageView(loadImage("pausepng")));
} else if (status == StatusPLAYING) {
playerpause();
((Button) eventgetTarget())setGraphic(new ImageView(loadImage("playpng")));
}
}
private void stopPlay(ActionEvent event) {
MediaPlayer player = mediaViewgetMediaPlayer();
if (player == null) {
return;
}
playerstop();
}
// private void processSliderClicked(MouseEvent event) {
// Slider slider = (Slider) eventgetSource();
// if (mediaViewgetMediaPlayer() != null) {
// Duration d = mediaViewgetMediaPlayer()getTotalDuration()multiply(slidergetValue() / slidergetMax());
// mediaViewgetMediaPlayer()seek(d);
// }
// }
private void processSliderChanged(ObservableValue< extends Number> observable, Number oldValue, Number newValue) {
Slider slider = (Slider) ((ReadOnlyProperty< extends Number>) observable)getBean();
if (slidergetUserData() == AUTO) { // 进度条是自动改变的,因此不用设置播放器
slidersetUserData(null);
return;
}
if (mediaViewgetMediaPlayer() != null) {
slidersetUserData(MANUAL);
Duration d = mediaViewgetMediaPlayer()getTotalDuration()multiply(newValuedoubleValue() / slidergetMax());
mediaViewgetMediaPlayer()seek(d);
}
}
private void mediaProcessChanged(ObservableValue< extends Duration> observable, Duration oldValue, Duration newValue) {
if (processSlidergetUserData() == MANUAL) { // 手动点击进度条
processSlidersetUserData(null);
return;
}
MediaPlayer player = (MediaPlayer) ((ReadOnlyProperty< extends Duration>) observable)getBean();
processSlidersetUserData(AUTO);
processSlidersetValue(newValuetoMillis() / playergetTotalDuration()toMillis() 100);
}
}
以上就是关于Java桌面端程序开发全部的内容,包括:Java桌面端程序开发、如何用Eclipse建立一个Java应用程序、编写一个简单java应用程序等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!
欢迎分享,转载请注明来源:内存溢出
微信扫一扫
支付宝扫一扫
评论列表(0条)