2012-01-20 15 views
3

ボタンをクリックすると、背景画像としてテキストエリアの画像を設定します。これはどのように可能ですか?ボタンをクリックしてテキストエリアの背景イメージを設定する方法は?

import java.awt.BorderLayout; 
import java.awt.Container; 
import java.awt.Graphics; 
import java.awt.Image; 

import javax.swing.GrayFilter; 
import javax.swing.ImageIcon; 
import javax.swing.JFrame; 
import javax.swing.JScrollPane; 
import javax.swing.JTextArea; 

public class BackgroundSample { 
    public static void main(String args[]) { 
    JFrame frame = new JFrame("Background Example"); 
    frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
    final ImageIcon imageIcon = new ImageIcon("draft.gif"); 
    JTextArea textArea = new JTextArea() { 
     Image image = imageIcon.getImage(); 

     Image grayImage = GrayFilter.createDisabledImage(image); 
     { 
     setOpaque(false); 
     } 

    public void paint(Graphics g) { 
    g.drawImage(grayImage, 0, 0, this); 
    super.paint(g); 
    } 
}; 
JScrollPane scrollPane = new JScrollPane(textArea); 
Container content = frame.getContentPane(); 
content.add(scrollPane, BorderLayout.CENTER); 
frame.setSize(250, 250); 
frame.setVisible(true); 
    } 
} 

これは私が言及したものです。どのようにして同じことをやっているのですか?(ボタンをクリックすると)actionlistenerを使用して

+3

あなたがこれまでに試してみましたか?イベントリスナー、特にアクションリスナーを調べましたか? – mre

+0

テキストエリアのコンストラクタを呼び出している間、テキストエリアに背景画像を表示することができましたが、アクションリスナでこれを行う方法がわかりません。 –

+0

と情報については、私はここでアプレットを扱っています.. –

答えて

4

あなたはJTextPaneクラスを拡張し、setImage(Image image)メソッドを作成する必要があります。このメソッドはイメージの参照を保存し、repaint()を呼び出します。

また、paint()メソッドではなくpaintComponent()メソッドをオーバーライドする必要があります。 10年前のチュートリアルは無視してください。あなたのアクションリスナーに続いて

class MyTextArea extends JTextArea { 
    private Image backgroundImage; 

    public MyTextArea() { 
     super(); 
     setOpaque(false); 
    } 

    public void setBackgroundImage(Image image) { 
     this.backgroundImage = image; 
     this.repaint(); 
    } 

    @Override 
    protected void paintComponent(Graphics g) { 
     g.setColor(getBackground()); 
     g.fillRect(0, 0, getWidth(), getHeight()); 

     if (backgroundImage != null) { 
      g.drawImage(backgroundImage, 0, 0, this); 
     } 

     super.paintComponent(g); 
    } 
} 

+0

私は何か試しました。それは動作しないようです..あなたは問題が何であるか教えてくださいできますか?これは私のコードですhttp://dl.dropbox.com/u/44103654/ColorPalette.java –

0

はこれを試してみてください

@Override 
public void actionPerformed(ActionEvent arg0) { 
    Image image = ImageIO.read(..); 
    if (image != null) 
     textArea.setBackgroundImage(image);  
} 

をここでは一例です:

import java.awt.BorderLayout; 
import java.awt.Dimension; 
import java.awt.Graphics; 
import java.awt.Image; 
import java.awt.event.ActionEvent; 
import java.awt.event.ActionListener; 
import java.io.IOException; 
import javax.imageio.ImageIO; 
import javax.swing.*; 

public class BackgroundDemo { 
    private static void createAndShowUI() { 

     try { 
      UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName()); 
     } catch (ClassNotFoundException ex) { 
     } catch (InstantiationException ex) { 
     } catch (IllegalAccessException ex) { 
     } catch (UnsupportedLookAndFeelException ex) { 
     } 

     final JFrame frame = new JFrame("BackgroundDemo"); 
     frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 

     JPanel buttonsPanel = new JPanel(); 

     final MyTextArea textArea = new MyTextArea(); 
     textArea.setText("Some text"); 

     JButton loadButton = new JButton("Set background"); 
     buttonsPanel.add(loadButton); 

     loadButton.addActionListener(new ActionListener() { 
      @Override 
      public void actionPerformed(ActionEvent e) { 
       JFileChooser fc = new JFileChooser(System.getProperty("user.home")); 
       int returnVal = fc.showOpenDialog(frame); 
       if (returnVal == JFileChooser.APPROVE_OPTION) { 
        try { 
         Image image = ImageIO.read(fc.getSelectedFile()); 
         if (image != null) 
          textArea.setBackgroundImage(image); 
        } catch (IOException ex) { 
         ex.printStackTrace(); 
        } 
       } 
      } 
     }); 

     JPanel content = new JPanel(new BorderLayout()); 
     content.add(buttonsPanel, BorderLayout.SOUTH); 
     content.add(new JScrollPane(textArea), BorderLayout.CENTER); 

     frame.add(content); 
     frame.setSize(new Dimension(300, 300)); 
     frame.setLocationRelativeTo(null); 
     frame.setVisible(true); 
    } 

    static class MyTextArea extends JTextArea { 
     private Image backgroundImage; 

     public MyTextArea() { 
      super(); 
      setOpaque(false); 
     } 

     public void setBackgroundImage(Image image) { 
      this.backgroundImage = image; 
      this.repaint(); 
     } 

     @Override 
     protected void paintComponent(Graphics g) { 
      g.setColor(getBackground()); 
      g.fillRect(0, 0, getWidth(), getHeight()); 

      if (backgroundImage != null) { 
       g.drawImage(backgroundImage, 0, 0, this); 
      } 

      super.paintComponent(g); 
     } 
    } 

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

enter image description here

+0

-1、1)混乱を招く可能性のあるその名前のAWTコンポーネントが既に存在するので、クラス名はTextAreaであってはいけません。 2)イメージを読むためにImageIconを作成しないでください。代わりに、おそらくImageIOを使用します。 3)この回答が2時間早く与えられたので、フォーラムを混乱させる本当の必要はありません。スプーンフィードコードは助けにならず、ポイント1と2で指摘されているように悪い習慣を導入する可能性があります。 – camickr

+2

+1の編集(最終的に@camickrポイントを扱います:-) – kleopatra

関連する問題