Я разрабатываю карточную игру, и я хочу нарисовать (нарисовать) карту на панели. Однако, когда я рисую, отображается только небольшая часть изображения. Вы можете сортировать видеть на этом скриншоте:Только рисование части bufferedimage
Я написал обертку класс (CardImage) для BufferedImage:
import java.awt.image.BufferedImage;
import java.io.File;
import javax.imageio.ImageIO;
public class CardImage {
BufferedImage img = null;
public CardImage() {
}
public BufferedImage setImage(Card c) {
try {
img = ImageIO.read(new File("/media/billy/HOME/workspace/Shithead/src/cards/" + toName(c)));
} catch(Exception e) {
System.out.println(e);
}
/*
int scale_factor = 8;
System.out.println(img.getHeight());
Image dimg = img.getScaledInstance((int)img.getWidth()/scale_factor, (int)img.getHeight()/scale_factor, Image.SCALE_SMOOTH);
Graphics g = img.createGraphics();
g.drawImage(dimg, 0, 0, null);
g.dispose();
*/
return img;
}
public String toName(Card c) {
String tmp = c.toString().replaceAll(" ", "_");
tmp = tmp.toLowerCase();
tmp = tmp + ".png";
return tmp;
}
}
и у меня есть HandPanel, который расширяет JPanel, в котором я хочу нарисовать CardImage BufferedImage:
import java.awt.Graphics;
import java.awt.image.BufferedImage;
import javax.swing.JPanel;
public class HandPanel extends JPanel {
public void paintComponent(Graphics g) {
super.paintComponent(g);
CardImage cardImage = new CardImage();
Card card = new Card(2,2);
BufferedImage img = cardImage.setImage(card);
System.out.println(img.getHeight(null) + " " + img.getWidth(null));
g.drawImage(img, 0, 0, null);
}
}
И у меня есть еще один класс, чтобы содержать HandPanel:
import java.awt.Dimension;
import javax.swing.JFrame;
import javax.swing.JPanel;
public class ShitGUI {
public static void main(String[] args) {
ShitGUI gui = new ShitGUI();
}
JFrame frame = new JFrame();
JPanel mainPanel = new JPanel();
public ShitGUI() {
mainPanel.setPreferredSize(new Dimension(500,500));
HandPanel pan = new HandPanel();
mainPanel.add(pan);
frame.add(mainPanel);
frame.pack();
frame.setVisible(true);
}
}
Изображения карт довольно большие (создание карты (2,2) - это всего лишь 2 Сердца, и я знаю, что я правильно понял путь).
Любая помощь приветствуется. Благодаря!
N.B. Когда я раскомментирую раздел, содержащий dimg, я получаю уменьшенную красную карточку (а не черно-белое, а не масштабированное изображение, которое я получал в противном случае). Я понимаю масштабирование, но я не понимаю, почему мой подход дает мне черно-белое изображение.
Вам не следует создавать новые экземпляры Card, CardImage или BufferedImage в вашем методе paintComponent(). Этот метод может быть вызван сотни раз - когда система думает, что она нуждается в обновлении. – FredK
Вероятная причина вашей непосредственной проблемы заключается в том, что HandPanel не возвращает достаточно подсказок с размерами, чтобы позволить менеджеру компоновки выложить его, его предпочтительный размер по умолчанию равен 0x0 – MadProgrammer
* Shithead/src/cards * - вы никогда не должны ссылаться на «src», , он не будет существовать, как только приложение будет построено, и вы не должны ссылаться на встроенные ресурсы, как с помощью файла – MadProgrammer