2012-12-11 11 views
7

java netbeansを使用してMDI(Multiple Documentsインターフェイス)のjdesktoppane背景イメージを変更するには?私はjava MDIにjdesktoppaneを追加しました。つまり、私はjava MDIで使用しているjdesktoppaneのデフォルトの背景イメージを変更したいのです。どんな簡単な方法ですか?jdesktoppaneのデフォルトの背景イメージを変更するには?

添付のスナップショットのリンクをチェックすると、私の欲しいことをよりよく理解できるでしょうか。 MadProgrammersコメントへ

http://i50.tinypic.com/iml1e9.jpg

+2

次のように「古い」の方法は、あなたが新しい 'JDesktopPane'を拡張し、助けのための' paintComponent' – MadProgrammer

+0

感謝をオーバーライドしなければならないとあなたは私のように、ソースコードとしてもう少し助けを与えることができますこのコズ私はこれを使用して新しいです.. –

答えて

12

+1。

JDesktopPanepaintComponent(..)を単に置き換え、drawImage(Image img,int x,int y,ImageObserver io)と呼んでイメージを描画します。

いけないペイントチェーンを尊重し、上書きpaintComponent(..)方法ここで

に最初の呼び出しとしてsuper.paintComponent(g)を呼び出すことを忘れては一例です:

enter image description here

import java.awt.*; 
import java.awt.event.*; 
import java.awt.image.BufferedImage; 
import java.net.URL; 
import javax.imageio.ImageIO; 
import javax.swing.JDesktopPane; 
import javax.swing.JFrame; 
import javax.swing.JInternalFrame; 
import javax.swing.JMenu; 
import javax.swing.JMenuBar; 
import javax.swing.JMenuItem; 
import javax.swing.SwingUtilities; 

public class JInternalFrameDemo { 

    private JDesktopPane jdpDesktop; 
    private static int openFrameCount = 0; 
    private BufferedImage img; 

    public JInternalFrameDemo() { 
     JFrame frame = new JFrame("JInternalFrame Usage Demo"); 
     frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 

     try { 
      img = ImageIO.read(new URL("http://images1.wikia.nocookie.net/__cb20120817224359/villains/images/6/6a/Nine-Tailed_Fox_(Naruto).jpg")); 
     } catch (Exception ex) { 
      ex.printStackTrace(); 
     } 

     // A specialized layered pane to be used with JInternalFrames 
     jdpDesktop = new JDesktopPane() { 
      @Override 
      protected void paintComponent(Graphics grphcs) { 
       super.paintComponent(grphcs); 
       grphcs.drawImage(img, 0, 0, null); 
      } 

      @Override 
      public Dimension getPreferredSize() { 
       return new Dimension(img.getWidth(), img.getHeight()); 
      } 
     }; 



     createFrame(); // Create first window 

     frame.setContentPane(jdpDesktop); 

     frame.setJMenuBar(createMenuBar()); 

     // Make dragging faster by setting drag mode to Outline 
     jdpDesktop.putClientProperty("JDesktopPane.dragMode", "outline"); 

     frame.pack(); 
     frame.setVisible(true); 
    } 

    protected JMenuBar createMenuBar() { 
     JMenuBar menuBar = new JMenuBar(); 
     JMenu menu = new JMenu("Frame"); 
     menu.setMnemonic(KeyEvent.VK_N); 
     JMenuItem menuItem = new JMenuItem("New IFrame"); 
     menuItem.setMnemonic(KeyEvent.VK_N); 
     menuItem.addActionListener(new ActionListener() { 
      public void actionPerformed(ActionEvent e) { 
       createFrame(); 
      } 
     }); 
     menu.add(menuItem); 
     menuBar.add(menu); 
     return menuBar; 
    } 

    protected void createFrame() { 
     MyInternalFrame frame = new MyInternalFrame(); 
     frame.setVisible(true); 
     // Every JInternalFrame must be added to content pane using JDesktopPane 
     jdpDesktop.add(frame); 
     try { 
      frame.setSelected(true); 
     } catch (java.beans.PropertyVetoException e) { 
     } 
    } 

    public static void main(String[] args) { 
     SwingUtilities.invokeLater(new Runnable() { 
      @Override 
      public void run() { 
       new JInternalFrameDemo(); 
      } 
     }); 
    } 

    class MyInternalFrame extends JInternalFrame { 

     static final int xPosition = 30, yPosition = 30; 

     public MyInternalFrame() { 
      super("IFrame #" + (++openFrameCount), true, // resizable 
        true, // closable 
        true, // maximizable 
        true);// iconifiable 
      setSize(300, 300); 
      // Set the window's location. 
      setLocation(xPosition * openFrameCount, yPosition 
        * openFrameCount); 
     } 
    } 
} 
+1

大きな助けをしてくれてありがとうございました。それは私のためにうまくいっています.... –

0

私は別々にそれを解決しますデスクトップオブジェクトを作成する関数です。

コード

private JDesktopPane intializeDesktop(JDesktopPane mydesktop,String imagePath,int scalx,int scaly) { 

     // A specialized layered pane to be used with JInternalFrames 
     mydesktop = new JDesktopPane() { 
      ImageIcon icon = new ImageIcon(imagePath); 
      Image image = icon.getImage(); 

      Image newimage = image.getScaledInstance(scalx, scaly, Image.SCALE_SMOOTH); 

      @Override 
      protected void paintComponent(Graphics g) { 
       super.paintComponent(g); 
       g.drawImage(newimage, 0, 0, this); 
      } 
     }; 

     return mydesktop; 
    } 
+0

受け入れられた答えに比べて新しいものはありません;-) – kleopatra

+0

以下の新しい項目: - JDesktopオブジェクトの作成時にディレクトリを呼び出すことも、ユーティリティで追加することもできます。 - 画像ディレクトリ内のローカルイメージファイルで機能する –

+0

イメージ名/スケーリングパラメータを再利用してハードコードしたこと自体が矛盾しています;-) – kleopatra

関連する問題