图像不局限于直接区域
Image is not being confined to a direct area
在下面的 java 代码中,图像没有被限制在直接区域。我希望 java 图像完整显示在 400 宽 x 400 高 图像中。我试图通过 frame.setSize(400, 400);
做到这一点,但它不起作用。我的代码包括 drawImage,这是我被告知必须放入代码才能使其工作的内容。我不知道接下来要做什么。
import javax.imageio.ImageIO;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.WindowConstants;
import java.awt.Graphics;
import java.awt.image.BufferedImage;
import java.io.File;
import java.io.IOException;
public class SwingSandbox {
public static void main(String[] args) throws IOException {
JFrame frame = buildFrame();
final BufferedImage image = ImageIO.read(new File("/Users/johnzalubski/Desktop/c.jpg"));
JPanel pane = new JPanel() {
@Override
protected void paintComponent(Graphics g) {
super.paintComponent(g);
g.drawImage(image, 0, 0, null);
}
};
frame.add(pane);
}
private static JFrame buildFrame() {
JFrame frame = new JFrame();
frame.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);
frame.setSize(400, 400);
frame.setVisible(true);
return frame;
}
}
您正在更改框架的大小。你应该使用这样的东西:g.drawImage(image, 0, 0, 400, 400, null);
如果这对你有帮助,请给我投票。我是新来的,想拥有一些基本的声誉。谢谢!
我稍微修改了您的 Swing 沙箱代码。这是我想出的。
图片变形了,因为我让它适合 400 x 400 的绘图面板。您应该缩小图像并保持纵横比。
这是我所做的更改。
我添加了对 SwingUtilities invokeLater 方法的调用,以将 Swing 组件放在事件调度线程上。
我将绘图面板设为 class,这样我就可以设置首选大小。您设置绘图面板的大小,而不是 JFrame。谁在乎 JFrame 的大小?
我按正确的顺序调用了 JFrame 方法。
这是代码。
import java.awt.Dimension;
import java.awt.Graphics;
import java.awt.image.BufferedImage;
import java.io.File;
import java.io.IOException;
import javax.imageio.ImageIO;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.SwingUtilities;
import javax.swing.WindowConstants;
public class SwingSandbox implements Runnable {
public static void main(String[] args) throws IOException {
SwingUtilities.invokeLater(new SwingSandbox());
}
private BufferedImage image;
public SwingSandbox() {
try {
image = ImageIO.read(new File("C:\Users\Owner\OneDrive\Pictures\Saved Pictures\StockMarketGame.png"));
} catch (IOException e) {
e.printStackTrace();
}
}
@Override
public void run() {
JFrame frame = new JFrame("Image Display");
frame.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);
DrawingPanel panel = new DrawingPanel(image);
frame.add(panel);
frame.pack();
frame.setVisible(true);
}
public class DrawingPanel extends JPanel {
private static final long serialVersionUID = 1L;
private BufferedImage image;
public DrawingPanel(BufferedImage image) {
this.image = image;
this.setPreferredSize(new Dimension(400, 400));
}
@Override
protected void paintComponent(Graphics g) {
super.paintComponent(g);
g.drawImage(image, 0, 0, 400, 400, null);
}
}
}
在下面的 java 代码中,图像没有被限制在直接区域。我希望 java 图像完整显示在 400 宽 x 400 高 图像中。我试图通过 frame.setSize(400, 400);
做到这一点,但它不起作用。我的代码包括 drawImage,这是我被告知必须放入代码才能使其工作的内容。我不知道接下来要做什么。
import javax.imageio.ImageIO;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.WindowConstants;
import java.awt.Graphics;
import java.awt.image.BufferedImage;
import java.io.File;
import java.io.IOException;
public class SwingSandbox {
public static void main(String[] args) throws IOException {
JFrame frame = buildFrame();
final BufferedImage image = ImageIO.read(new File("/Users/johnzalubski/Desktop/c.jpg"));
JPanel pane = new JPanel() {
@Override
protected void paintComponent(Graphics g) {
super.paintComponent(g);
g.drawImage(image, 0, 0, null);
}
};
frame.add(pane);
}
private static JFrame buildFrame() {
JFrame frame = new JFrame();
frame.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);
frame.setSize(400, 400);
frame.setVisible(true);
return frame;
}
}
您正在更改框架的大小。你应该使用这样的东西:g.drawImage(image, 0, 0, 400, 400, null);
如果这对你有帮助,请给我投票。我是新来的,想拥有一些基本的声誉。谢谢!
我稍微修改了您的 Swing 沙箱代码。这是我想出的。
图片变形了,因为我让它适合 400 x 400 的绘图面板。您应该缩小图像并保持纵横比。
这是我所做的更改。
我添加了对 SwingUtilities invokeLater 方法的调用,以将 Swing 组件放在事件调度线程上。
我将绘图面板设为 class,这样我就可以设置首选大小。您设置绘图面板的大小,而不是 JFrame。谁在乎 JFrame 的大小?
我按正确的顺序调用了 JFrame 方法。
这是代码。
import java.awt.Dimension;
import java.awt.Graphics;
import java.awt.image.BufferedImage;
import java.io.File;
import java.io.IOException;
import javax.imageio.ImageIO;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.SwingUtilities;
import javax.swing.WindowConstants;
public class SwingSandbox implements Runnable {
public static void main(String[] args) throws IOException {
SwingUtilities.invokeLater(new SwingSandbox());
}
private BufferedImage image;
public SwingSandbox() {
try {
image = ImageIO.read(new File("C:\Users\Owner\OneDrive\Pictures\Saved Pictures\StockMarketGame.png"));
} catch (IOException e) {
e.printStackTrace();
}
}
@Override
public void run() {
JFrame frame = new JFrame("Image Display");
frame.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);
DrawingPanel panel = new DrawingPanel(image);
frame.add(panel);
frame.pack();
frame.setVisible(true);
}
public class DrawingPanel extends JPanel {
private static final long serialVersionUID = 1L;
private BufferedImage image;
public DrawingPanel(BufferedImage image) {
this.image = image;
this.setPreferredSize(new Dimension(400, 400));
}
@Override
protected void paintComponent(Graphics g) {
super.paintComponent(g);
g.drawImage(image, 0, 0, 400, 400, null);
}
}
}