JPanel не будет отображать изображение?
Я пытаюсь отобразить изображение с помощью JPanel. У меня есть этот код:
package training;
import javax.swing.JOptionPane;
import javax.swing.*;
import java.io.*;
import java.awt.*;
import java.awt.image.*;
import javax.imageio.*;
import javax.swing.plaf.SliderUI;
public class Training extends JPanel {
public static BufferedImage image;
double maxw, maxh;
double w, h, ratio;
public Training () {
super();
try {
image = ImageIO.read(new File("src/training/P.jpg"));
}
catch (IOException e)
{
//Not handled.
}
maxw = 750;
maxh = 600;
w = image.getWidth();
h = image.getHeight();
if (w > h) {
if (w > maxw) {
ratio = maxw / w;
h = h * ratio; // Reset height to match scaled image
w = w * ratio;
}
}
if (w <= h) {
if (h > maxh) {
ratio = maxh / h;
w = w * ratio; // Reset height to match scaled image
h = h * ratio;
}
}
}
public void paintComponent(Graphics g)
{
Image i = image.getScaledInstance((int)w, (int)h,Image.SCALE_SMOOTH);
g.drawImage(i, 0, 0, null);
repaint();
}
public static void main(String[] args) {
System.out.println("User dir: " + System.getProperty("user.dir"));
JPanel p = new JPanel();
JFrame f = new JFrame("Window");
f.setSize(1000, 600);
f.add(p);
p.add(new Training());
p.setSize(750, 600);
f.setVisible(true);
p.setVisible(true);
}
}
Ранее, это работает, когда я рисую прямо в кадр, используя f.add(new Training()); без создания JPanel в первую очередь. Оконная рама отображала изображение тогда.
Как сделать так, чтобы JPanel правильно отображал мое изображение?
1 ответ
Хитрость заключается в том, чтобы загрузить свою фотографию в JLabel. Вы не можете поместить изображение непосредственно на "JPanel":
import javax.swing.*;
import java.io.*;
import java.awt.*;
import java.awt.image.*;
import javax.imageio.*;
public class Main extends JPanel {
public static BufferedImage image;
double maxw, maxh;
double w, h, ratio;
public Main () {
super();
try {
image = ImageIO.read(new File("src/training/P.jpg"));;
JLabel l = new JLabel(new ImageIcon(image));
add(l);
}
catch (IOException e)
{
//Not handled.
}
maxw = 750;
maxh = 600;
w = image.getWidth();
h = image.getHeight();
if (w > h) {
if (w > maxw) {
ratio = maxw / w;
h = h * ratio; // Reset height to match scaled image
w = w * ratio;
}
}
if (w <= h) {
if (h > maxh) {
ratio = maxh / h;
w = w * ratio; // Reset height to match scaled image
h = h * ratio;
}
}
}
public void paintComponent(Graphics g)
{
Image i = image.getScaledInstance((int)w, (int)h,Image.SCALE_SMOOTH);
g.drawImage(i, 0, 0, null);
repaint();
}
public static void main(String[] args) {
System.out.println("User dir: " + System.getProperty("user.dir"));
JFrame f = new JFrame("Window");
JPanel p = new Main();
f.setSize(1000, 600);
p.setSize(750, 600);
f.add(p);
f.setVisible(true);
}
}