2012-01-20 2 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().

Кроме того, вы должны переопределить метод paintComponent(), а не метод paint(). Игнорируйте любой учебник, который говорит иначе, поскольку он устарел на 10 лет.

+0

Я что-то пробовал. но он, кажется, не работает. Может у, пожалуйста, скажите мне, в чем проблема. Это мой код http://dl.dropbox.com/u/44103654/ColorPalette.java –

0

Попробуйте это:

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); 
    } 
} 

Затем в действие слушателя:

@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) имя класса не должно быть TextArea, поскольку уже есть AWT-компонент, который может привести к путанице. 2) Вы бы не создали ImageIcon, чтобы прочитать изображение. Вместо этого вы, вероятно, будете использовать ImageIO. 3) никакой реальной необходимости загромождать форум, поскольку этот ответ был дан 2 часа назад. Код кормления ложкой не помогает и может вводить вредные привычки, как указано в пунктах 1 и 2. – camickr

+2

+1 для редактирования (наконец, адресация @camickr points :-) – kleopatra

Смежные вопросы