Вы определили image
дважды...
BufferedImage image = null;
public static void main(String args[]){
BufferedImage image = null;
По сути, это означает, что к тому времени, когда вы доберетесь до метода paint
, это будет null
, поскольку вы не инициализировали переменную экземпляра.
Другая проблема, с которой вы столкнетесь, заключается в том, что вы пытаетесь загрузить изображение из статической ссылки, но image
не объявлено как static
. Лучше перенести эту логику в конструктор или метод экземпляра.
Не используйте JApplet
в качестве контейнера при добавлении к JFrame
, лучше использовать что-то вроде JPanel
. Это поможет, когда дело доходит до добавления вещей в контейнер.
ВЫ ДОЛЖНЫ ВЫЗВАТЬ super.paint(g)
... на самом деле, НЕ переопределять метод paint
контейнеров верхнего уровня, таких как JFrame
или JApplet
. Используйте что-то вроде JPanel
и вместо этого переопределите метод paintComponent
. Контейнеры верхнего уровня не буферизуются дважды.
Методы paint
выполняют много важной работы, и JComponent#paintComponent
проще использовать... но не забудьте вызвать super.paintComponent
ОБНОВЛЕНО
Вам нужно определить image
в том контексте, в котором он будет использоваться.
Поскольку вы объявили image
полем экземпляра GraphicsMovement2
, вам потребуется экземпляр GraphicsMovement2
, чтобы ссылаться на него.
Однако в вашем методе main
, то есть static
, вы также объявили переменную с именем image
.
Метод paint
из GraphicsMovement2
не может видеть переменную, которую вы объявили в main
, только поле экземпляра (то есть null
).
Чтобы решить проблему, вам нужно переместить загрузку изображения в контекст экземпляра GraphicsMovement2
, это может быть лучше всего достигнуто (в вашем контексте), но перемещение загрузки изображения в конструктор GraphicsMovement2
public GraphicsMovement2() {
try {
File file = new File("C:\\Users/Jonheel/Google Drive/School/10th Grade/AP Computer Science/Junkbin/MegaLogo.png");
ImageInputStream imgInpt = new FileImageInputStream(file);
image = ImageIO.read(file);
}
catch(FileNotFoundException e) {
System.out.println("x");
}
catch(IOException e) {
System.out.println("y");
}
}
Два приведенных ниже примера дадут один и тот же результат...
![введите здесь описание изображения](https://i.stack.imgur.com/8OXOC.png)
Легкий способ
public class TestPaintImage {
public static void main(String[] args) {
new TestPaintImage();
}
public TestPaintImage() {
EventQueue.invokeLater(new Runnable() {
@Override
public void run() {
try {
UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName());
} catch (ClassNotFoundException ex) {
} catch (InstantiationException ex) {
} catch (IllegalAccessException ex) {
} catch (UnsupportedLookAndFeelException ex) {
}
JFrame frame = new JFrame();
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.setLayout(new BorderLayout());
frame.add(new ImagePane());
frame.pack();
frame.setLocationRelativeTo(null);
frame.setVisible(true);
}
});
}
public class ImagePane extends JPanel {
public ImagePane() {
setLayout(new BorderLayout());
ImageIcon icon = null;
try {
icon = new ImageIcon(ImageIO.read(new File("/path/to/your/image")));
} catch (Exception e) {
e.printStackTrace();
}
add(new JLabel(icon));
}
}
}
Трудный путь
public class TestPaintImage {
public static void main(String[] args) {
new TestPaintImage();
}
public TestPaintImage() {
EventQueue.invokeLater(new Runnable() {
@Override
public void run() {
try {
UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName());
} catch (ClassNotFoundException ex) {
} catch (InstantiationException ex) {
} catch (IllegalAccessException ex) {
} catch (UnsupportedLookAndFeelException ex) {
}
JFrame frame = new JFrame();
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.setLayout(new BorderLayout());
frame.add(new ImagePane());
frame.pack();
frame.setLocationRelativeTo(null);
frame.setVisible(true);
}
});
}
public class ImagePane extends JPanel {
private BufferedImage background;
public ImagePane() {
try {
background = ImageIO.read(new File("/path/to/your/image"));
} catch (Exception e) {
e.printStackTrace();
}
}
@Override
public Dimension getPreferredSize() {
return background == null ? super.getPreferredSize() : new Dimension(background.getWidth(), background.getHeight());
}
@Override
protected void paintComponent(Graphics g) {
super.paintComponent(g);
if (background != null) {
int x = (getWidth() - background.getWidth()) / 2;
int y = (getHeight() - background.getHeight()) / 2;
g.drawImage(background, x, y, this);
}
}
}
}
Потратьте время, чтобы прочитать учебники
person
MadProgrammer
schedule
02.11.2012