<rt id="bn8ez"></rt>
<label id="bn8ez"></label>

  • <span id="bn8ez"></span>

    <label id="bn8ez"><meter id="bn8ez"></meter></label>

    TWaver - 專(zhuān)注UI技術(shù)

    http://twaver.servasoft.com/
    posts - 171, comments - 191, trackbacks - 0, articles - 2
      BlogJava :: 首頁(yè) :: 新隨筆 :: 聯(lián)系 :: 聚合  :: 管理

    在Windows的“開(kāi)始”菜單上,會(huì)在菜單左側(cè)顯示一幅圖像。很多基于Windows的軟件也有類(lèi)似效果的菜單。用Java Swing可以制作出類(lèi)似效果的菜單嗎?答案當(dāng)然是肯定的,而且非常簡(jiǎn)單。

    我們首先從Swing的JPopupMenu組件進(jìn)行擴(kuò)展,讓其接受一個(gè)圖片,顯示在左側(cè);或者接受一個(gè)字符串,動(dòng)態(tài)生成圖片后,在顯示在左側(cè)。為了避免準(zhǔn)備圖片的麻煩,我們就以動(dòng)態(tài)生成內(nèi)存圖片為例,編寫(xiě)一個(gè)JImagedPopupMenu類(lèi)。

    JImagedPopupMenu在創(chuàng)建時(shí)可以接受一個(gè)字符串,生成一副內(nèi)存圖片BufferedImage。然后,我們需要覆蓋JComponent的getInsets方法,重新計(jì)算Inset的left值,將其在原數(shù)值基礎(chǔ)上加上圖片的寬度,然后返回:

    1public Insets getInsets() {
    2    Insets insets = (Insets)super.getInsets().clone();
    3    insets.left += imageIcon.getIconWidth();
    4    return insets;
    5}
    最后,覆蓋paintComponent方法,在原基礎(chǔ)上增加圖片的繪制:
     1public void paintComponent(Graphics g) {
     2    super.paintComponent(g);
     3    if (imageIcon != null{
     4        Insets insets = getInsets();
     5        g.drawImage(imageIcon.getImage(),
     6                    insets.left - imageIcon.getIconWidth(),
     7                    insets.top,
     8                    null);
     9    }

    10}

    完整代碼如下:

     1import java.awt.*;
     2import java.awt.event.*;
     3import java.awt.geom.*;
     4import java.awt.image.*;
     5import javax.swing.*;
     6
     7public class JImagedPopupMenu extends JPopupMenu {
     8
     9    private Font font = new Font("微軟雅黑", Font.BOLD, 16);
    10    private ImageIcon imageIcon = null;
    11
    12    public JImagedPopupMenu(ImageIcon imageIcon) {
    13        this.imageIcon = imageIcon;
    14    }

    15
    16    public JImagedPopupMenu(String text) {
    17        this.imageIcon = createImage(text);
    18    }

    19
    20    private ImageIcon createImage(String text) {
    21        BufferedImage bi = new BufferedImage(301000, BufferedImage.TYPE_INT_ARGB);
    22        ImageIcon image = new ImageIcon(bi);
    23        Graphics2D g2d = bi.createGraphics();
    24
    25        GradientPaint paint = new GradientPaint(00, Color.green.darker(), 3010, Color.yellow.brighter(), true);
    26        g2d.setPaint(paint);
    27
    28        g2d.fillRect(00, bi.getWidth(), bi.getHeight());
    29
    30        AffineTransform at = new AffineTransform();
    31        at.rotate(-Math.PI / 2);
    32
    33        g2d.setTransform(at);
    34        g2d.setColor(Color.darkGray);
    35        g2d.setFont(font);
    36        g2d.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON);
    37        g2d.drawString(text, -150, bi.getWidth() / 2 + 5);
    38
    39        return image;
    40    }

    41
    42    @Override
    43    public Insets getInsets() {
    44        Insets insets = (Insets) super.getInsets().clone();
    45        insets.left += imageIcon.getIconWidth();
    46        return insets;
    47    }

    48
    49    @Override
    50    public void paint(Graphics g) {
    51        super.paint(g);
    52        if (imageIcon != null{
    53            Insets insets = getInsets();
    54            g.drawImage(imageIcon.getImage(),
    55                    insets.left - imageIcon.getIconWidth(),
    56                    insets.top,
    57                    null);
    58        }

    59    }

    60
    61    public static void main(String[] args) {
    62        final JFrame frame = new JFrame();
    63        frame.setSize(600400);
    64        frame.setTitle("TWaver中文社區(qū)之Swing探秘");
    65        final JImagedPopupMenu menu = new JImagedPopupMenu("TWaver中文社區(qū)");
    66        menu.add(new JMenuItem("Winzip 8.0"));
    67        menu.addSeparator();
    68        menu.add(new JMenuItem("Programs"));
    69        menu.add(new JMenuItem("Document"));
    70        menu.add(new JMenuItem("Settings"));
    71        menu.add(new JMenuItem("Search"));
    72        menu.add(new JMenuItem("Help and Support"));
    73        menu.add(new JMenuItem("Run"));
    74        menu.addSeparator();
    75        menu.add(new JMenuItem("Shut Down"));
    76        JLabel label = new JLabel("Right click me to show image popup menu.");
    77        label.addMouseListener(new java.awt.event.MouseAdapter() {
    78
    79            public void mouseReleased(MouseEvent e) {
    80                if (e.isPopupTrigger()) {
    81                    menu.show(frame, e.getPoint().x, e.getPoint().y);
    82                }

    83            }

    84        }
    );
    85        frame.getContentPane().add(label, BorderLayout.CENTER);
    86        frame.show();
    87    }

    88}

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


    評(píng)論

    # re: Swing探秘:創(chuàng)建帶圖像的菜單  回復(fù)  更多評(píng)論   

    2010-08-19 17:40 by zhengzhibin
    有創(chuàng)意,沒(méi)想到還可以這樣玩JPopupMenu

    # re: Swing探秘:創(chuàng)建帶圖像的菜單  回復(fù)  更多評(píng)論   

    2010-08-19 22:35 by 凡客
    JImagedPopupMenu在創(chuàng)建時(shí)可以接受一個(gè)字符串,生成一副內(nèi)存圖片BufferedImage

    只有注冊(cè)用戶登錄后才能發(fā)表評(píng)論。


    網(wǎng)站導(dǎo)航:
     
    主站蜘蛛池模板: 9277手机在线视频观看免费| 亚洲色大情网站www| 亚洲精品无码永久中文字幕 | 亚洲熟妇AV日韩熟妇在线| 亚洲免费观看在线视频| 亚洲日韩中文字幕| 亚洲成a人片在线观看中文app| 久久亚洲精品成人综合| 亚洲AV第一页国产精品| 久久丫精品国产亚洲av不卡| 亚洲熟妇av一区| 中文字幕在线观看亚洲视频| 亚洲日本va一区二区三区| 亚洲youwu永久无码精品| 国产区图片区小说区亚洲区| 野花视频在线官网免费1| 一级做a爰片久久毛片免费陪| www一区二区www免费| a级毛片毛片免费观看永久| 日本免费污片中国特一级| 99久久免费精品视频| 日韩视频在线精品视频免费观看| 毛片免费在线播放| 免费国产综合视频在线看| 久久亚洲中文字幕精品一区| 亚洲日本乱码在线观看| 亚洲宅男永久在线| 亚洲成a人片在线不卡| 国产亚洲Av综合人人澡精品| 韩日电影在线播放免费版| 91在线老王精品免费播放| 日韩毛片免费无码无毒视频观看| 在线观着免费观看国产黄| 中文亚洲成a人片在线观看| 亚洲国产日韩一区高清在线| 国产精品高清视亚洲精品| 日韩大片在线永久免费观看网站 | 亚洲国产成+人+综合| 亚洲AV日韩AV一区二区三曲| 国产精品永久免费视频| 88xx成人永久免费观看|