2013-02-20 2 views
-3

У меня есть собственный пользовательский элемент управления, который поддерживает фоновое изображение для его содержимого. Этот буфер имеет тип BufferedImage.Как изменить размер BufferedImage, но сохранить его в графике?

ВНИМАНИЕ! Использование обратного изображения связано с требованиями. Не учите меня рисовать в paintComponent()

В настоящее время я с изменением размера изображения следующим образом:

@Override 
public void setBounds(int x, int y, int width, int height) { 

    if(bufferedImage == null) { 
     bufferedImage = new BufferedImage(width, height, BufferedImage.TYPE_INT_ARGB); 
    } 
    else { 
     if(bufferedImage.getWidth() < width || bufferedImage.getHeight() < height) { 
      BufferedImage newImage = new BufferedImage(width, height, BufferedImage.TYPE_INT_ARGB); 
      newImage.createGraphics().drawImage(bufferedImage, 0, 0, null); 
      bufferedImage = newImage; 
     } 
    } 
    super.setBounds(x, y, width, height); 
} 

, к сожалению, это требует, чтобы создать новый объект BufferedImage и, следовательно, делает полученные ранее Graphics объект недействителен.

Так что я должен иметь собственный метод

public Graphics2D createImageGraphics() { 
    if(bufferedImage != null) { 
     return bufferedImage.createGraphics(); 
    } 
    else { 
     return null; 
    } 
} 

хотя я хотел бы переопределить getGraphics().

Можно ли изменить размер изображения так, чтобы он сохранял объект Graphics?

+3

Любая причина для поддержания вашего собственного буфера в то время как свинг уже обеспечивает двойную буферизацию? –

+0

Чтобы лучше помочь, опубликуйте [SSCCE] (http://sscce.org/). –

+0

@Guillaume как его активировать? –

ответ

-1

Вот небольшой пример того, как выполнить собственную картину в Свинг:

import java.awt.BorderLayout; 
import java.awt.Color; 
import java.awt.Dimension; 
import java.awt.Graphics; 
import java.awt.event.ActionEvent; 

import javax.swing.AbstractAction; 
import javax.swing.JButton; 
import javax.swing.JFrame; 
import javax.swing.JPanel; 
import javax.swing.SwingUtilities; 

public class JFrameTest { 

    private boolean drawOval = false; 

    protected void initUI() { 
     final JPanel panel = new JPanel() { 
      @Override 
      protected void paintComponent(Graphics g) { 
       super.paintComponent(g); 
       if (drawOval) { 
        g.setColor(Color.BLUE); 
        g.drawOval(0, 0, 100, 100); 
       } 
      } 

      @Override 
      public Dimension getPreferredSize() { 
       return new Dimension(100, 100); 
      } 
     }; 

     AbstractAction drawAction = new AbstractAction("Draw") { 

      @Override 
      public void actionPerformed(ActionEvent e) { 
       drawOval = true; 
       panel.repaint(); 
      } 
     }; 

     JButton drawButton = new JButton(drawAction); 

     JPanel buttonPanel = new JPanel(); 
     buttonPanel.add(drawButton); 

     JFrame frame = new JFrame(); 
     frame.add(panel, BorderLayout.CENTER); 
     frame.add(buttonPanel, BorderLayout.SOUTH); 

     frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
     frame.pack(); 

     frame.setVisible(true); 

    } 

    public static void main(String[] args) { 

     SwingUtilities.invokeLater(new Runnable() { 

      @Override 
      public void run() { 
       new JFrameTest().initUI(); 
      } 
     }); 

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