Java 如何调整BuffereImage的大小但保留其图形?
我有自己的自定义控件,用于维护其内容的背景图像。此缓冲区的类型为BuffereImage 注意!背衬图像的使用是出于需求。不要教我在绘画中画画 目前,我正在按以下方式调整图像大小:Java 如何调整BuffereImage的大小但保留其图形?,java,swing,graphics,awt,Java,Swing,Graphics,Awt,我有自己的自定义控件,用于维护其内容的背景图像。此缓冲区的类型为BuffereImage 注意!背衬图像的使用是出于需求。不要教我在绘画中画画 目前,我正在按以下方式调整图像大小: @Override public void setBounds(int x, int y, int width, int height) { if( bufferedImage == null ) { bufferedImage = new BufferedImage(width, heig
@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);
}
尽管我想覆盖getGraphics
是否可以调整图像大小以保留图形对象?下面是一个小示例,演示如何在Swing中执行自定义绘制:
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();
}
});
}
}
Swing已经提供了双缓冲,您是否有理由在Swing中维护自己的缓冲区?panel.getGraphics.drawOval0,0,100,100;->永远不要使用getGraphics。相反,替代paintComponent使用该方法的图形参数。无论何时要更新/刷新显示器,请致电repaint@SuzanCioc我绝对没有错。双缓冲意味着您不会看到绘图的每个步骤,相反,您将看到正在绘制的任何内容的即时绘图。无论如何,这是正确的方式来做事情的摇摆。每次请求重新绘制时绘制缓冲图像实际上效率较低,而且主要是useless@SuzanCioc您绝对不是在证明Swing中没有缓冲。@SuzanCioc您这样做的目的是什么?提高绩效?消除视觉故障?我之所以这么问,是因为很可能已经有了内在的方法来做你想做的事情。
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();
}
});
}
}