一: 首先弄清題目的意思

創(chuàng)新互聯(lián)建站是一家專業(yè)提供仁布企業(yè)網(wǎng)站建設(shè),專注與做網(wǎng)站、網(wǎng)站設(shè)計、html5、小程序制作等業(yè)務(wù)。10年已為仁布眾多企業(yè)、政府機構(gòu)等服務(wù)。創(chuàng)新互聯(lián)專業(yè)網(wǎng)站制作公司優(yōu)惠進行中。
A.需要的主要組件列表:
1. ?創(chuàng)建一個窗口,窗口標(biāo)題叫Information
2. ?3個標(biāo)簽, 用于顯示文字 Name Number Class
3. ?3個文本框, 用于填寫信息
4. ?1個按鈕, ?文字是確認
5. ?1個文本域
B.業(yè)務(wù)邏輯
1. 當(dāng)點擊按鈕確認的時候, 把 文本框的信息顯示到文本域
C.設(shè)計的主要技術(shù)
JLabel , JButton, JTextField ...等, 都是swing的組件 , ?所以應(yīng)該使用swing進行創(chuàng)建
二: ?確定使用的布局
swing雖然重寫了大部分的組件, 但是布局, 依舊沿襲awt技術(shù)
分析圖片上的布局:
至少有2種方法可以實現(xiàn),?
方法一: 絕對布局 , 優(yōu)點: ?配合可視化GUI拖曳, 可以完美的實現(xiàn)圖上的組件的位置
但是缺點也是致命的, 不同的操作系統(tǒng)平臺下, 可能會出現(xiàn)位置的移動,
只適合開發(fā)平臺, 移植效果差 . ?所以不推薦使用
方法二: 靈活的表格布局, 配合流式布局 , 所有操作系統(tǒng)下,顯示效果都比較統(tǒng)一.?
三: 效果圖
四: 參考代碼
import?java.awt.*;
import?java.awt.event.*;
import?javax.swing.*;
public?class?FrameDemo?extends?JFrame?{
//申明需要的組件
private?final?JTextField?jtf1,jtf2,jtf3;
private?final?JTextArea?jta;
public?FrameDemo()?{
setTitle("Information");//設(shè)置窗口標(biāo)題
setSize(320,?360);//設(shè)置窗口大小
setLocationRelativeTo(null);//設(shè)置窗口居中
setDefaultCloseOperation(EXIT_ON_CLOSE);//設(shè)置關(guān)閉時退出虛擬機
getContentPane().setLayout(new?FlowLayout());//設(shè)置窗口布局為流式布局
JPanel?jp?=?new?JPanel(new?GridLayout(4,?2));//設(shè)置jp面板為表格布局4行2列
//第一行
JPanel?jp01?=?new?JPanel();
JLabel?jl1?=?new?JLabel("Name:");
jp01.add(jl1);
JPanel?jp1?=?new?JPanel();
jtf1?=?new?JTextField(8);
jp1.add(jtf1);
//第二行
JPanel?jp02?=?new?JPanel();
JLabel?jl2?=?new?JLabel("Number:");
jp02.add(jl2);
JPanel?jp2?=?new?JPanel();
jtf2?=?new?JTextField(8);
jp2.add(jtf2);
//第三行
JPanel?jp03?=?new?JPanel();
JLabel?jl3?=?new?JLabel("Class:");
jp03.add(jl3);
JPanel?jp3?=?new?JPanel();
jtf3?=?new?JTextField(8);
jp3.add(jtf3);
//第四行
JPanel?jp04?=?new?JPanel();
JLabel?jl4?=?new?JLabel("");
jp04.add(jl4);
JPanel?jp4?=?new?JPanel();
JButton?jb?=?new?JButton("確認");
jp4.add(jb);
jp.add(jp01);
jp.add(jp1);
jp.add(jp02);
jp.add(jp2);
jp.add(jp03);
jp.add(jp3);
jp.add(jp04);
jp.add(jp4);
getContentPane().add(jp);
jta?=?new?JTextArea();
jta.setColumns(20);//設(shè)置文本域的大小
jta.setEditable(false);//設(shè)置文本域不可編輯
jta.setBackground(jp.getBackground());//設(shè)置文本域的背景色和面板一樣
getContentPane().add(jta);
jb.addActionListener(new?ActionListener()?{//給按鈕添加事件
public?void?actionPerformed(ActionEvent?e)?{//點擊按鈕,顯示信息到文本域
String?name?=?jtf1.getText();
String?number?=?jtf2.getText();
String?clazz?=?jtf3.getText();
jta.setText("You?name?is?"+name+"?number?is?"+number+"?class?is?"+clazz);
}
});
}
public?static?void?main(String[]?args)?{
new?FrameDemo().setVisible(true);//創(chuàng)建窗口,被設(shè)置為可見
}
}
五: 拓展
雖然圖形界面的實現(xiàn)方法是多樣的, ?我們一定要根據(jù)具體情況, 選擇一個比較優(yōu)化的 合理的, 符合業(yè)務(wù)邏輯的實現(xiàn)方法
要讓照片隨機播放,需要把照片名改成比如photo1.jpg,photo2.jpg,photo3.jpg...的有序號順序排列的文件名,
然后把改名后的照片文件放到你的項目名的目錄下,比如你的項目名叫"slideshow",你就把照片文件放到slideshow文件夾下.
最后把下面的Java程序拷貝到你的項目中,把有DD類名的地方改成你的類名,就行了.
完整的讓一些照片在JFrame窗體里自動隨機播放的幻燈片程序如下
(我用的圖片文件是photo1.jpg,photo2.jpg,photo3.jpg,注意事項在注釋中注明
import java.awt.Graphics;
import javax.swing.ImageIcon;
import javax.swing.JFrame;
public class DD extends JFrame implements Runnable{
ImageIcon ii=new ImageIcon("photo1.jpg");//這里換成你的圖片文件名,放在你的項目名的文件夾中
DD(){
super("Slide");
setSize(400, 400);
setLocationRelativeTo(null);
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
setVisible(true);
}
public void paint(Graphics g){
super.paint(g);
g.drawImage(ii.getImage(),0,0,400,400,null);
}
@Override
public void run() {
while(true){
try {
Thread.sleep(500);//這里是幻燈片播放間隔的時間,這里為500毫秒=0.5秒
} catch (InterruptedException e) {
e.printStackTrace();
}
int i=(int)(Math.random()*3)+1;//這里是產(chǎn)生從1-3的隨機數(shù),如果你有6個圖片文件,把3改成6就是從1-6的隨機數(shù)了.
ii=new ImageIcon("photo"+i+".jpg");//這里調(diào)用你的圖片文件,如果你有6個圖片文件,改成從1-6的文件名方便調(diào)用
this.repaint();
}
}
public static void main(String[] args) {
DD d=new DD();
Thread t=new Thread(d);
t.start();
}
}
import java.awt.BorderLayout;
import java.awt.Component;
import java.awt.FileDialog;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.ItemEvent;
import java.awt.event.ItemListener;
import java.awt.event.WindowAdapter;
import java.awt.event.WindowEvent;
import javax.media.ControllerClosedEvent;
import javax.media.ControllerEvent;
import javax.media.ControllerListener;
import javax.media.EndOfMediaEvent;
import javax.media.Manager;
import javax.media.MediaLocator;
import javax.media.NoPlayerException;
import javax.media.Player;
import javax.media.PrefetchCompleteEvent;
import javax.media.RealizeCompleteEvent;
import javax.media.Time;
import javax.swing.JCheckBoxMenuItem;
import javax.swing.JFrame;
import javax.swing.JMenu;
import javax.swing.JMenuBar;
import javax.swing.JMenuItem;
import javax.swing.SwingUtilities;
import javax.swing.UIManager;
public class JMFMediaPlayer extends JFrame implements ActionListener,
ControllerListener, ItemListener {
// JMF的播放器
Player player;
// 播放器的視頻組件和控制組件
Component vedioComponent;
Component controlComponent;
// 標(biāo)示是否是第一次打開播放器
boolean first = true;
// 標(biāo)示是否需要循環(huán)
boolean loop = false;
// 文件當(dāng)前目錄
String currentDirectory;
// 構(gòu)造方法
public JMFMediaPlayer(String title) {
super(title);
addWindowListener(new WindowAdapter() {
public void windowClosing(WindowEvent e){
// 用戶點擊窗口系統(tǒng)菜單的關(guān)閉按鈕
// 調(diào)用dispose以執(zhí)行windowClosed
dispose();
}
public void windowClosed(WindowEvent e){
if (player != null){
// 關(guān)閉JMF播放器對象
player.close();
}
System.exit(0);
}
});
// 創(chuàng)建播放器的菜單
JMenu fileMenu = new JMenu("文件");
JMenuItem openMemuItem = new JMenuItem("打開");
openMemuItem.addActionListener(this);
fileMenu.add(openMemuItem);
// 添加一個分割條
fileMenu.addSeparator();
// 創(chuàng)建一個復(fù)選框菜單項
JCheckBoxMenuItem loopMenuItem = new JCheckBoxMenuItem("循環(huán)", false);
loopMenuItem.addItemListener(this);
fileMenu.add(loopMenuItem);
fileMenu.addSeparator();
JMenuItem exitMemuItem = new JMenuItem("退出");
exitMemuItem.addActionListener(this);
fileMenu.add(exitMemuItem);
JMenuBar menuBar = new JMenuBar();
menuBar.add(fileMenu);
this.setJMenuBar(menuBar);
this.setSize(200, 200);
try {
// 設(shè)置界面的外觀,為系統(tǒng)外觀
UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName());
SwingUtilities.updateComponentTreeUI(this);
} catch (Exception e) {
e.printStackTrace();
}
this.setVisible(true);
}
/**
* 實現(xiàn)了ActionListener接口,處理組件的活動事件
*/
public void actionPerformed(ActionEvent e) {
if (e.getActionCommand().equals("退出")) {
// 調(diào)用dispose以便執(zhí)行windowClosed
dispose();
return;
}
FileDialog fileDialog = new FileDialog(this, "打開媒體文件", FileDialog.LOAD);
fileDialog.setDirectory(currentDirectory);
fileDialog.setVisible(true);
// 如果用戶放棄選擇文件,則返回
if (fileDialog.getFile() == null){
return;
}
currentDirectory = fileDialog.getDirectory();
if (player != null){
// 關(guān)閉已經(jīng)存在JMF播放器對象
player.close();
}
try {
// 創(chuàng)建一個打開選擇文件的播放器
player = Manager.createPlayer(new MediaLocator("file:"
+ fileDialog.getDirectory() + fileDialog.getFile()));
} catch (java.io.IOException e2) {
System.out.println(e2);
return;
} catch (NoPlayerException e2) {
System.out.println("不能找到播放器.");
return;
}
if (player == null) {
System.out.println("無法創(chuàng)建播放器.");
return;
}
first = false;
this.setTitle(fileDialog.getFile());
// 播放器的控制事件處理
player.addControllerListener(this);
// 預(yù)讀文件內(nèi)容
player.prefetch();
}
/**
* 實現(xiàn)ControllerListener接口的方法,處理播放器的控制事件
*/
public void controllerUpdate(ControllerEvent e) {
// 調(diào)用player.close()時ControllerClosedEvent事件出現(xiàn)。
// 如果存在視覺部件,則該部件應(yīng)該拆除(為一致起見,
// 我們對控制面板部件也執(zhí)行同樣的操作)
if (e instanceof ControllerClosedEvent) {
if (vedioComponent != null) {
this.getContentPane().remove(vedioComponent);
this.vedioComponent = null;
}
if (controlComponent != null) {
this.getContentPane().remove(controlComponent);
this.controlComponent = null;
}
return;
}
// 如果是媒體文件到達尾部事件
if (e instanceof EndOfMediaEvent) {
if (loop) {
// 如果允許循環(huán),則重新開始播放
player.setMediaTime(new Time(0));
player.start();
}
return;
}
// 如果是播放器預(yù)讀事件
if (e instanceof PrefetchCompleteEvent) {
// 啟動播放器
player.start();
return;
}
// 如果是文件打開完全事件,則顯示視頻組件和控制器組件
if (e instanceof RealizeCompleteEvent) {
vedioComponent = player.getVisualComponent();
if (vedioComponent != null){
this.getContentPane().add(vedioComponent);
}
controlComponent = player.getControlPanelComponent();
if (controlComponent != null){
this.getContentPane().add(controlComponent, BorderLayout.SOUTH);
}
this.pack();
}
}
// 處理“循環(huán)”復(fù)選框菜單項的點擊事件
public void itemStateChanged(ItemEvent e) {
loop = !loop;
}
public static void main(String[] args){
new JMFMediaPlayer("JMF媒體播放器");
}
}
試試吧,我這里運行正常
GUI圖形界面設(shè)計的重點是布局
SWING也是采用AWT的布局方式,進行布局管理的。(實現(xiàn)LayoutManager接口的方法,來進行管理布局,API中已有實現(xiàn)類,我們通常只需要指定實現(xiàn)類,而不需要自己重寫方法)
常用的布局有絕對布局, 邊界布局BorderLayout,流布局FlowLayout,表格布局GridLayout。
JFrame等重量級組件,默認布局是邊界布局,JPanel輕量級組件,默認布局是流布局
絕對布局:布局的特點,需要指定每個組件的大小,和具體位置。
優(yōu)點:充分的自定義,充分的自由,可以寫出漂亮的 ,細致的界面
缺點:絕對布局在不同的操作系統(tǒng)下,會有一些不同程度的變化,導(dǎo)致界面變形,甚至組件重疊等。在同一操作系統(tǒng)下,窗口放大縮小,界面也會變形
絕對布局的范例
import?javax.swing.JButton;
import?javax.swing.JFrame;
public?class?Frame1?extends?JFrame{
JButton?jb1;
public?Frame1()?{
setLayout(null);//指定窗口的布局管理器為空,也就是絕對布局
jb1?=?new?JButton("按鈕");
jb1.setLocation(100,?50);//指定組件的位置
jb1.setSize(80,?30);//指定組件的大小
//jb1.setBounds(100,?50,?80,?30);//上面兩句代碼等同于這句代碼
add(jb1);
setSize(300,?200);
setLocationRelativeTo(null);
setDefaultCloseOperation(EXIT_ON_CLOSE);
}
public?static?void?main(String[]?args)?{
new?Frame1().setVisible(true);
}
}
邊界布局BorderLayout:它可以對容器組件進行安排,并調(diào)整其大小,使其符合下列五個區(qū)域:北、南、東、西、中。每個區(qū)域最多只能包含一個組件
優(yōu)點:比較常用的布局,簡單易掌握,放大縮小,不影響組件的位置
缺點:組件位置不夠靈活。每個區(qū)域如果添加多個組件,那么后面的組件會覆蓋前面的組件。(因為可以嵌套其他組件使用,所以這些缺點基本都能克服)
3. ? 代碼參考
import?javax.swing.*;
import?java.awt.*;
public?class?P004_BorderLayout?{
JFrame?jframe;
JButton?jb1,jb2,jb3,jb4,jb5;
public?P004_BorderLayout(){
jframe?=?new?JFrame();
jframe.setTitle("邊界布局");
jframe.setBounds(300,?200,?180,?180);
jb1?=?new?JButton("東");
jframe.add(jb1,?BorderLayout.EAST);
jb2?=?new?JButton("西");
jframe.add(jb2,BorderLayout.WEST);
jb3?=?new?JButton("南");
jframe.add(jb3,BorderLayout.SOUTH);
jb4?=?new?JButton("北");
jframe.add(jb4,BorderLayout.NORTH);
jb5?=?new?JButton("中");
jframe.add(jb5);//BorderLayout.CENTER可以省略
jframe.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
jframe.setVisible(true);
}
public?static?void?main(String[]?args)?{
new?P004_BorderLayout();
}
}
流布局FlowLayout:像一排文字一個挨著一個的布局。流布局用于安排有向流中的組件,這非常類似于段落中的文本行。流的方向可以指定。
優(yōu)點:可以快速添加組件,不用指定位置,也不用指定邊界
缺點:線性排列 ,外觀單調(diào)。(嵌套其他布局,可以忽略缺點)
代碼參考
import?java.awt.FlowLayout;
import?javax.swing.*;
public?class?P003_FlowLayout?{
JFrame?jframe;
public?P003_FlowLayout(){
jframe?=?new?JFrame("流式布局");
for?(int?i?=?1;?i?=?5;?i++)?{
jframe.add(new?JButton(i+""));
}
jframe.setLocation(380,?260);
jframe.setLayout(new?FlowLayout(FlowLayout.LEFT));//窗口指定位流式布局,方向從左往右
jframe.pack();
jframe.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
jframe.setVisible(true);
}
public?static?void?main(String[]?args)?{
new?P003_FlowLayout();
}
}
表格布局GridLayout:它以矩形網(wǎng)格形式對容器的組件進行布置。容器被分成大小相等的矩形,一個矩形中放置一個組件。
優(yōu)點:組件整齊排列,
缺點:如果添加的組件數(shù)量,和指定的數(shù)量不一致,容易導(dǎo)致缺失等
參考代碼
import?javax.swing.*;
import?java.awt.*;
public?class?P005_GridLayout?{
JFrame?jframe;
public?P005_GridLayout()?{
jframe?=?new?JFrame("表格布局");
jframe.setLayout(new?GridLayout(3,?4));//表格布局,3行?4列
for?(int?i?=?0;?i?=?12;?i++)?{
jframe.add(new?JButton(i+""));
}
jframe.setLocation(300,?200);
jframe.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
jframe.pack();
jframe.setVisible(true);
}
public?static?void?main(String[]?args)?{
new?P005_GridLayout();
}
}
最后: 布局是一種靈活的東西。你可以一個布局里嵌套另外一個布局。
比如邊界布局的窗口的中間,加入按表格布局的組件,表格布局里面是流式布局。
很多的復(fù)雜的界面,通過細分,都能拆分成常用布局的嵌套
本文名稱:java播放界面設(shè)計代碼 java播放界面設(shè)計代碼怎么用
標(biāo)題URL:http://www.yijiale78.com/article16/docjidg.html
成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供企業(yè)網(wǎng)站制作、App設(shè)計、網(wǎng)站制作、品牌網(wǎng)站設(shè)計、電子商務(wù)、企業(yè)建站
聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請盡快告知,我們將會在第一時間刪除。文章觀點不代表本網(wǎng)站立場,如需處理請聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時需注明來源: 創(chuàng)新互聯(lián)