2015-05-13 2 views
2

В настоящее время я все еще изучаю Java GUI и преуменьшаю эту проблему. Я просто задаюсь вопросом, почему я не могу загрузить его где-нибудь, кроме центра, и как загрузить изображение в другом месте?Почему мое изображение не загружается на contentPane, кроме CENTER?

import java.awt.*; 

import javax.swing.*; 

public class GUI { 

    public static void main(String[] args) { 
     GUI gui = new GUI(); 
     gui.go(); 
    } 

    public void go() { 
     JFrame frame = new JFrame(); 
     JPanel panel = new JPanel(); 
     Player player = new Player(); 
     panel.setBackground(Color.darkGray); 

     JButton button = new JButton("shock me"); 

     panel.add(button); 

     frame.getContentPane().add(BorderLayout.EAST, panel); 
     frame.getContentPane().add(BorderLayout.NORTH, player); 


     //frame.getContentPane().add(BorderLayout.CENTER, player); 

     frame.setSize(200,200); 
     frame.setVisible(true); 
    } 
} 

Вот мой плеер класса

import java.awt.Color; 
import java.awt.Graphics; 
import java.awt.Image; 
import java.util.Random; 
import javax.swing.*; 

public class Player extends JPanel{ 

    public void paintComponent(Graphics g) { 
     Image image = new ImageIcon("Source/hero.jpg").getImage(); 
     g.drawImage(image, 3, 4 , this); 
    } 
} 
+1

'Image image = new ImageIcon (" Source/hero.jpg "). GetImage();' 1) Потенциально длительные операции должны быть исключены из любого метода рисования. Вместо этого объявите его как атрибут класса и загрузите изображение один раз при создании экземпляра. 2) Этот способ загрузки изображения предполагает путь «Файл», но это не будет работать для развертывания, лучше начать работу с «URL» прямо сейчас. 3) 'ImageIcon' не будет возвращать ошибки, если он не находит/не может загрузить изображение. Лучше использовать 'ImageIO', который генерирует информативное исключение, если есть проблема. –

+0

4) 'public void paintComponent (Графика g) {..' должна быть' public void paintComponent (Graphics g) {super.paintComponent (g); ..'. Всегда сначала вызывайте метод 'super'. –

+0

хорошо, спасибо за советы. –

ответ

1

Player не отменяет getPreferredSize() возвращать значение. Поскольку он этого не делает, BorderLayout не будет присваивать ему какую-либо высоту в ограничениях PAGE_START или PAGE_END, а не ширины в ограниченияхи LINE_END. Компонент добавлен, он просто не имеет ширины/высоты.

CENTER будет растягивать как ширину и высоту компонента, так и доступное пространство, поэтому оно видно.

Смежные вопросы