我的代码的问题是我的图像只能获得JFrame
- 但我希望每次用户更改窗口大小时它都会更改大小。
图像大小也应该相对于JFrame
大小还是它的JPanel
?如果是这样,我将如何实现这一目标?
这是我的代码:
import javax.imageio.ImageIO;
import javax.swing.*;
import java.awt.*;
import java.awt.image.BufferedImage;
import java.io.IOException;
import java.net.MalformedURLException;
import java.net.URL;
public class MainFrame extends JFrame {
private JPanel card1;
private JPanel principalPanel,centerPanel;
private BufferedImage image;
public MainFrame() {
setSize(800,600);
setLocationRelativeTo(null);
setDefaultCloseOperation(EXIT_ON_CLOSE);
setVisible(true);
URL url = null;
try {
url = new URL("https://i.stack.imgur.com/7bI1Y.jpg");
} catch (MalformedURLException e) {
}
try {
image = ImageIO.read(url);
} catch (IOException e) {
System.out.println("Can not find image");
}
Image scaledImage = image.getScaledInstance(this.getWidth(),
this.getHeight(),Image.SCALE_SMOOTH);
card1 = new JPanel() {
@Override
protected void paintComponent(Graphics g) {
super.paintComponent(g);
g.drawImage(scaledImage,0,0,this);
}
};
centerPanel = new JPanel();
centerPanel.setLayout(new CardLayout());
centerPanel.add(card1,"1");
principalPanel = new JPanel();
principalPanel.setLayout(new BorderLayout());
principalPanel.add(centerPanel,BorderLayout.CENTER);
setContentPane(principalPanel);
}
public static void main(String[] args) {
SwingUtilities.invokeLater(new Runnable() {
@Override
public void run() {
new MainFrame();
}
});
}
}
图像可以(确实应该)在paintComponent(Graphics)
方法中缩放。这样它就可以更改为面板的任何尺寸。
另请参阅代码中的注释:
import javax.imageio.ImageIO;
import javax.swing.*;
import java.awt.*;
import java.awt.image.BufferedImage;
import java.net.URL;
public class MainFrame2 extends JFrame {
private JPanel card1;
private BufferedImage image;
public MainFrame2() {
setSize(800, 600);
setLocationRelativeTo(null);
setDefaultCloseOperation(EXIT_ON_CLOSE);
try {
// if there is a problem with URL - no point trying to load
URL url = new URL("https://i.stack.imgur.com/7bI1Y.jpg");
image = ImageIO.read(url);
} catch (Exception e) {
System.out.println("Problem loading image");
e.printStackTrace();
}
/* The frame will actually be larger than the panel.
Better to scale the image to the SIZE OF THE PANEL ...
Image scaledImage = image.getScaledInstance(this.getWidth(),
this.getHeight(), Image.SCALE_SMOOTH); */
card1 = new JPanel() {
@Override
protected void paintComponent(Graphics g) {
super.paintComponent(g);
// .. this is how.
g.drawImage(image, 0, 0, getWidth(), getHeight(), this);
}
};
setContentPane(card1);
setVisible(true); // this should be last!
}
public static void main(String[] args) {
SwingUtilities.invokeLater(new Runnable() {
@Override
public void run() {
new MainFrame2();
}
});
}
}
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句