最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

Java Swing實(shí)現(xiàn)窗體添加背景圖片的2種方法詳解

 更新時(shí)間:2017年11月14日 11:25:52   作者:pzy4447  
這篇文章主要介紹了Java Swing實(shí)現(xiàn)窗體添加背景圖片的2種方法,結(jié)合實(shí)例形式較為詳細(xì)的分析了Swing實(shí)現(xiàn)窗體添加背景圖片的方法,并總結(jié)分析了Swing重繪中repaint與updateUI的區(qū)別,需要的朋友可以參考下

本文實(shí)例講述了Java Swing實(shí)現(xiàn)窗體添加背景圖片的2種方法。分享給大家供大家參考,具體如下:

在美化程序時(shí),常常需要在窗體上添加背景圖片。通過(guò)搜索和測(cè)試,發(fā)現(xiàn)了2種有效方式。下面分別介紹。

1. 利用JLabel加載圖片

利用JLabel自帶的setIcon(Icon icon)加載icon,并設(shè)置JLabel對(duì)象的位置和大小使其完全覆蓋窗體。這是一個(gè)很取巧的辦法,代碼非常簡(jiǎn)單,如下所示。

JLabel lbBg = new JLabel(imageIcon);
lbBg.setBounds(0, 0, frameSize.width, frameSize.height);
this.getContentPane().add(lbBg);

然而這種方法有幾個(gè)要注意的點(diǎn):

(1)不能使用布局管理器

此時(shí)你需要將布局管理器設(shè)置為null,然后精確控制所有控件的大小和位置。否則,JLabel無(wú)法完整覆蓋窗體。

(2)應(yīng)當(dāng)先添加背景JLabel,再添加其它控件。否則其它控件將被JLabel所遮擋(為什么不是后添加的遮擋先添加的?)。

(3)由于控件及窗體的尺寸需要手動(dòng)控制,因此無(wú)法對(duì)背景圖片進(jìn)行縮放。

2. 重載JPanel的paintComponent(Graphics g)方法

通過(guò)重載該方法,在JPanel的繪制階段將指定圖片繪制上去即可。由于背景是繪制出來(lái)的,因此不會(huì)對(duì)布局有任何影響。

示例代碼如下:

@Override
public void paintComponent(Graphics g) {
super.paintComponent(g);
g.drawImage(image, 0, 0, d.width, d.height, this);
MainFrame.instance().repaint();
}

下面是一個(gè)完整的demo。

package frame;
import java.awt.Dimension;
import java.awt.Graphics;
import java.awt.Image;
import javax.swing.ImageIcon;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.JTextField;
public class ImageFrame extends JFrame {
  class ImagePanel extends JPanel {
    Dimension d;
    Image image;
    public ImagePanel(Dimension d, Image image) {
      super();
      this.d = d;
      this.image = image;
    }
    @Override
    public void paintComponent(Graphics g) {
      super.paintComponent(g);
      g.drawImage(image, 0, 0, d.width, d.height, this);
      MainFrame.instance().repaint();
    }
  }
  Dimension frameSize = new Dimension(500, 300);
  ImageIcon imageIcon = new ImageIcon(this.getClass().getResource(
      "/images/bg.jpg"));
  public ImageFrame() {
    // 設(shè)置窗體屬性
    setSize(frameSize);
    setLocationRelativeTo(null);
    setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    setIconImage(imageIcon.getImage());
    setUndecorated(true);
  }
  public void addImageByJLable() {
    setLayout(null);
    // 設(shè)置背景
    JLabel lbBg = new JLabel(imageIcon);
    lbBg.setBounds(0, 0, frameSize.width, frameSize.height);
    this.getContentPane().add(lbBg);
    addComponents();
    setVisible(true);
  }
  public void addImageByRepaint() {
    ImagePanel imagePanel = new ImagePanel(frameSize, imageIcon.getImage());
    setContentPane(imagePanel);
    addComponents();
    setVisible(true);
  }
  private void addComponents() {
    JButton btn1 = new JButton("haha");
    btn1.setBounds(10, 20, 60, 30);
    this.getContentPane().add(btn1);
    JTextField jtf = new JTextField("22222222222");
    jtf.setBounds(200, 100, 80, 30);
    this.getContentPane().add(jtf);
  }
  public static void main(String[] args) {
    // TODO Auto-generated method stub
    ImageFrame imageFrame = new ImageFrame();
    // imageFrame.addImageByJLable();
    imageFrame.addImageByRepaint();
  }
}

運(yùn)行效果如下:

圖1 使用JLabel加載圖片效果

圖1可見(jiàn),使用JLabel時(shí),由于未圖片尺寸與窗體尺寸不一致,導(dǎo)致圖片只顯示出一部分;且有一個(gè)控件被遮擋了。注意:通過(guò)精細(xì)設(shè)置尺寸和添加控件順序,可以達(dá)到較為滿意的效果的。

圖2 使用重繪方式加載圖片

圖2可見(jiàn),不需要可以設(shè)置匹配尺寸和控件的添加順序,即可得到比較滿意的效果。

補(bǔ)充說(shuō)明:Swing 重繪 repaint,updateUI區(qū)別

repaint

public void repaint()重繪此組件。

如果此組件是輕量組件,則此方法會(huì)盡快調(diào)用此組件的 paint 方法。否則此方法會(huì)盡快調(diào)用此組件的 update 方法。

注:有關(guān) AWT 和 Swing 所用繪制機(jī)制的更多信息,包括如何編寫最高效的繪制代碼的信息 。

updateUI

public void updateUI()UIManager 發(fā)出的關(guān)于 L&F 已經(jīng)更改的通知。用 UIManager 的最新版本替換當(dāng)前的 UI 對(duì)象。覆蓋: 類 JComponent 中的 updateUI另請(qǐng)參見(jiàn): JComponent.updateUI()

可能大家都試過(guò)在swing的事件監(jiān)聽(tīng)中動(dòng)態(tài)添加組件,但是JFrame卻不會(huì)動(dòng)態(tài)顯示,只有變大變?。▽?shí)際是重畫了)才會(huì)顯示。repaint,updateUI可以,用validate發(fā)現(xiàn)也可以。

API中對(duì)repaint()方法是這樣描述的,調(diào)度完當(dāng)前所有未完成的事件后重新繪制該組件,所以repaint方法不總是馬上執(zhí)行。

package awtDemo;

import java.awt.Container;
import java.awt.FlowLayout;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;

import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;
@SuppressWarnings("serial")
public class Ss extends JFrame {
    Container con = this.getContentPane();
    JButton jb1 = new JButton("jb1");
    JButton jb2 = new JButton("jb2");
    JLabel jl1 = new JLabel("jl1");
    FlowLayout gly = new FlowLayout();
    JPanel jp = new JPanel(gly);
    public Ss() {
        con.add(jp);
        jp.add(jb1);
        jp.add(jb2);
        MyListener ml = new MyListener();
        jb1.addMouseListener(ml);
        this.setSize(300, 200);
        this.setVisible(true);
    }
    private class MyListener extends MouseAdapter {
      @Override
      public void mouseClicked(MouseEvent e) {
          // TODO Auto-generated method stub
          try {
              JButton jb3 = new JButton("jb3");
              jp.add(jb3);
//              jp.updateUI();//可以正常顯示
              jp.repaint();//API中對(duì)repaint()方法是這樣描述的,調(diào)度完當(dāng)前所有未完成的事件后重新繪制該組件,repaint方法不總是馬上執(zhí)行,所以只有調(diào)整大小才可以顯示。
          //主要就是下面的invalidate和validate
          //當(dāng)然,用jp來(lái)invalidate和validatae也是可以的
//                jp.invalidate();
          } catch (Exception ex) {
              ex.printStackTrace();
          }
      }
  }
    public static void main(String s[]) {
      Ss sss = new Ss();
      sss.setVisible(true);
  }
}

swing重繪主要有四個(gè)關(guān)鍵方法:paint(),repaint(),revalidate(),paintImmediately();

而進(jìn)行繪制時(shí)后它會(huì)依次調(diào)用update(),paint(),paintComponent(),paintBorder(),paintChildren()進(jìn)行繪制;

那么repaint()方法為什么會(huì)延時(shí)呢?

調(diào)用repaint()會(huì)導(dǎo)致一個(gè)區(qū)域被增加到重繪列表隊(duì)列中,且被預(yù)定重繪。產(chǎn)生一個(gè)防止到系統(tǒng)事件隊(duì)列中的請(qǐng)求,
一旦該請(qǐng)求被處理,內(nèi)部工具自動(dòng)毀掉組件的paintImmediately()方法。然后該方法立即執(zhí)行繪制;

也就是說(shuō)通常情況下repaint()它是不會(huì)立即執(zhí)行的,調(diào)用它后會(huì)有一個(gè)等待處理的過(guò)程。但repaint比較高效,會(huì)推遲實(shí)際的繪制并將多余的請(qǐng)求壓縮到單個(gè) paint 調(diào)用中。

所以如何解決它的repaint()延時(shí)問(wèn)題呢?

1.讓它立即執(zhí)行:使用paintImmediately()。

2.使用SwingUtilities工具類中的invokeLater(Runnable doRun)方法;把你要在repaint()后執(zhí)行的操作寫在要執(zhí)行的線程中;(它會(huì)把這個(gè)方法也加入到j(luò)ava內(nèi)部事件隊(duì)列中,它排在repaint()之后,所以一般情況下,它是等repaint()執(zhí)行完之后才會(huì)執(zhí)行,雖然這樣達(dá)到效果,但并不理想);

更多關(guān)于java相關(guān)內(nèi)容感興趣的讀者可查看本站專題:《Java數(shù)據(jù)結(jié)構(gòu)與算法教程》、《Java字符與字符串操作技巧總結(jié)》、《Java操作DOM節(jié)點(diǎn)技巧總結(jié)》、《Java文件與目錄操作技巧匯總》和《Java緩存操作技巧匯總

希望本文所述對(duì)大家java程序設(shè)計(jì)有所幫助。

相關(guān)文章

  • java中struts 框架的實(shí)現(xiàn)

    java中struts 框架的實(shí)現(xiàn)

    本文給大家介紹的是java中struts 框架的實(shí)現(xiàn),有需要的小伙伴可以參考下。
    2015-06-06
  • Spring Security實(shí)現(xiàn)驗(yàn)證碼登錄功能

    Spring Security實(shí)現(xiàn)驗(yàn)證碼登錄功能

    這篇文章主要介紹了Spring Security實(shí)現(xiàn)驗(yàn)證碼登錄功能,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下
    2020-01-01
  • 到底如何設(shè)置Java線程池的大小的方法示例

    到底如何設(shè)置Java線程池的大小的方法示例

    在我們?nèi)粘I(yè)務(wù)開(kāi)發(fā)過(guò)程中,或多或少都會(huì)用到并發(fā)的功能。那么并發(fā)線程池到底設(shè)置多大呢?文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2019-09-09
  • Java 添加、刪除、格式化Word中的圖片步驟詳解( 基于Spire.Cloud.SDK for Java )

    Java 添加、刪除、格式化Word中的圖片步驟詳解( 基于Spire.Cloud.SDK for Java )

    這篇文章主要介紹了Java 添加、刪除、格式化Word中的圖片( 基于Spire.Cloud.SDK for Java ),本文分步驟通過(guò)實(shí)例代碼給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2020-08-08
  • 深入剖析Java中的synchronized關(guān)鍵字

    深入剖析Java中的synchronized關(guān)鍵字

    在 Java 程序中,我們可以利用 synchronized 關(guān)鍵字來(lái)對(duì)程序進(jìn)行加鎖,它既可以用來(lái)聲明一個(gè) synchronized 代碼塊,也可以直接標(biāo)記靜態(tài)方法或者實(shí)例方法,本文就帶大家深入了解Java中的synchronized關(guān)鍵字,感興趣的同學(xué)可以參考閱讀
    2023-06-06
  • 詳細(xì)介紹Java內(nèi)存泄露原因

    詳細(xì)介紹Java內(nèi)存泄露原因

    詳細(xì)介紹Java內(nèi)存泄露原因,需要的朋友可以參考一下
    2013-05-05
  • Sublime Text 打開(kāi)Java文檔中文亂碼的解決方案

    Sublime Text 打開(kāi)Java文檔中文亂碼的解決方案

    這篇文章主要介紹了Sublime Text 中文亂碼的解決方案,幫助大家更好的理解和使用Java,感興趣的朋友可以了解下
    2020-12-12
  • 基于java中泛型的總結(jié)分析

    基于java中泛型的總結(jié)分析

    本篇文章介紹了,在java中泛型的總結(jié)分析。需要的朋友參考下
    2013-05-05
  • Java之Thread的join方法實(shí)例

    Java之Thread的join方法實(shí)例

    這篇文章主要介紹了Java之Thread的join方法,實(shí)例形式講述了join方法的應(yīng)用,需要的朋友可以參考下
    2014-10-10
  • 使用Java將字節(jié)數(shù)組轉(zhuǎn)成16進(jìn)制形式的代碼實(shí)現(xiàn)

    使用Java將字節(jié)數(shù)組轉(zhuǎn)成16進(jìn)制形式的代碼實(shí)現(xiàn)

    在很多場(chǎng)景下,需要進(jìn)行分析字節(jié)數(shù)據(jù),但是我們存起來(lái)的字節(jié)數(shù)據(jù)一般都是二進(jìn)制的,這時(shí)候就需要我們將其轉(zhuǎn)成16進(jìn)制的方式方便分析,本文主要介紹如何使用Java將字節(jié)數(shù)組格式化成16進(jìn)制的格式并輸出,需要的朋友可以參考下
    2024-05-05

最新評(píng)論

弋阳县| 衡南县| 锦州市| 汉中市| 兴化市| 凤冈县| 兰州市| 遂昌县| 长葛市| 织金县| 陇南市| 沧源| 承德市| 高邮市| 崇文区| 台湾省| 孟村| 同心县| 香格里拉县| 灵璧县| 六枝特区| 万全县| 利川市| 仙居县| 兴仁县| 遵化市| 德保县| 城步| 奉化市| 德化县| 滕州市| 万宁市| 花莲县| 罗源县| 宁波市| 茌平县| 绵竹市| 南溪县| 三台县| 景洪市| 新宾|