Java 图像绘制适用于JFrame,但不适用于JPanel
我正在使用一些简单的应用程序来熟悉Swing并遇到问题 我正在尝试创建一个包含图像的框架(在面板中)以及用于放大/缩小图像的按钮 我已经能够使添加了图像的框架正常工作(尽管存在一些框架大小问题,但这是另一回事),但是,当我调用相同的组件类将其添加到面板时,什么都没有出现。我希望你们中的一个能帮助我们了解情况 代码: 图像框-正在工作,如图所示Java 图像绘制适用于JFrame,但不适用于JPanel,java,image,swing,jpanel,paintcomponent,Java,Image,Swing,Jpanel,Paintcomponent,我正在使用一些简单的应用程序来熟悉Swing并遇到问题 我正在尝试创建一个包含图像的框架(在面板中)以及用于放大/缩小图像的按钮 我已经能够使添加了图像的框架正常工作(尽管存在一些框架大小问题,但这是另一回事),但是,当我调用相同的组件类将其添加到面板时,什么都没有出现。我希望你们中的一个能帮助我们了解情况 代码: 图像框-正在工作,如图所示 class ImageFrame extends JFrame{ public ImageFrame(){ setTitle("Java Ima
class ImageFrame extends JFrame{
public ImageFrame(){
setTitle("Java Image Machine");
init();
pack();
}
public final void init(){
//ZoomPanel zoomPanel = new ZoomPanel();
//ImagePanel imagePanel = new ImagePanel();
ImageComponent component = new ImageComponent();
//this.add(zoomPanel, BorderLayout.CENTER);
this.add(component);
//this.add(imagePanel, BorderLayout.SOUTH);
}
}
但是,使用ImagePanel或与直接ImageComponent调用同时添加ZoomPanel不会:
class ImagePanel extends JPanel{
public ImagePanel(){
//setBorder(BorderFactory.createLineBorder(Color.black));
ImageComponent component = new ImageComponent();
add(component);
}
}
组件类别:
class ImageComponent extends JComponent{
public ImageComponent(){
try{
image = ImageIO.read(new File("test1.bmp"));
}
catch ( IOException e ){
e.printStackTrace();
}
System.out.println("W: " + image.getWidth(this) + " H: " + image.getHeight(this));
}
public void paintComponent( Graphics g ){
super.paintComponent(g);
if (image == null)
return;
width = image.getWidth(this);
height = image.getHeight(this);
//System.out.println("Image should be painted");
g.drawImage(image, 0, 0, null);
}
private Image image;
public int width;
public int height;
}在中添加适当的组件后,是否尝试添加
repaint()
调用
i、 e
另外,请仔细检查是否正在将ImagePanel(包含ImageComponent)添加到ImageFrame,并调用.setVisible(True)。它对我来说工作正常(我刚刚测试了ImageComponent
类):
问题可能是文件的路径,或者是
JPanel
宽度和高度与图片不一样,因此我们覆盖JPanel
的getPreferedSize(…)
,并根据Image
返回正确的大小,我在发布此文件后的API文档中发现,并尝试了它-它似乎没有帮助。您是否将ImagePanel(包含ImageComponent)添加到ImageFrame,并调用.setVisible(True)?宾果,这似乎使它可用,只要框架中没有其他面板。谢谢。:)路径正在运行,但我认为您的getPreferredSize覆盖是我缺少的。我没能让镜框显示尺寸。谢谢
class ImagePanel extends JPanel{
public ImagePanel(){
//setBorder(BorderFactory.createLineBorder(Color.black));
ImageComponent component = new ImageComponent();
add(component);
repaint();
}
}
import java.awt.Dimension;
import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.Image;
import java.awt.RenderingHints;
import java.awt.image.BufferedImage;
import java.net.URL;
import javax.imageio.ImageIO;
import javax.swing.ImageIcon;
import javax.swing.JComponent;
import javax.swing.JFrame;
public class Test {
/**
* Default constructor Test.class
*/
public Test() {
initComponents();
}
public static void main(String[] args) {
/**
* Create GUI and components on Event-Dispatch-Thread
*/
javax.swing.SwingUtilities.invokeLater(new Runnable() {
@Override
public void run() {
Test test = new Test();
}
});
}
/**
* Initialize GUI and components (including ActionListeners etc)
*/
private void initComponents() {
JFrame jFrame = new JFrame();
jFrame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
//add ImageComponent to JFrame instance
jFrame.add(new ImageComponent());
//pack frame (size JFrame to match preferred sizes of added components and set visible
jFrame.pack();
jFrame.setVisible(true);
}
}
class ImageComponent extends JComponent {
private Image image;
public int width;
public int height;
public ImageComponent() {
try {
image = ImageUtils.scaleImage(300, 300, ImageIO.read(new URL("http://harmful.cat-v.org/software/_java/java-evil-edition.png")));
//image = ImageIO.read(new URL("http://harmful.cat-v.org/software/_java/java-evil-edition.png"));//uses images scale
} catch (Exception e) {
e.printStackTrace();
}
//so we can set the JPanel preferred size to the image width and height
ImageIcon ii = new ImageIcon(image);
width = ii.getIconWidth();
height = ii.getIconHeight();
}
//so our panel is the same size as image
@Override
public Dimension getPreferredSize() {
return new Dimension(width, height);
}
@Override
public void paintComponent(Graphics g) {
super.paintComponent(g);
if (image == null) {
return;
}
width = image.getWidth(this);
height = image.getHeight(this);
g.drawImage(image, 0, 0, null);
}
}
//class used for scaling images
class ImageUtils {
static Image scaleImage(int width, int height, BufferedImage filename) {
BufferedImage bi;
try {
bi = new BufferedImage(width, height, BufferedImage.TYPE_INT_RGB);
Graphics2D g2d = (Graphics2D) bi.createGraphics();
g2d.addRenderingHints(new RenderingHints(RenderingHints.KEY_RENDERING, RenderingHints.VALUE_RENDER_QUALITY));
g2d.drawImage(filename, 0, 0, width, height, null);
} catch (Exception e) {
return null;
}
return bi;
}
}