2010-04-15 4 views
3

Этот вопрос задан очень часто, но везде ответы не совпадают. Я могу получить JFrame, чтобы отобразить фоновое изображение только штрафом за счет расширения JPanel и первостепенную paintComponent, например так:Фоновое изображение в JFrame

class BackgroundPanel extends JPanel { 
    private ImageIcon imageIcon; 
    public BackgroundPanel() { 
     this.imageIcon = Icons.getIcon("foo"); 
    } 

    @Override 
    protected void paintComponent(Graphics g) { 
     super.paintComponent(g); 
     g.drawImage(imageIcon.getImage(), 0,0,imageIcon.getIconWidth(),imageIcon.getIconHeight(),this); 
    } 
} 

Но теперь, как вы добавляете компонент поверх этого фона? Когда я

JFrame w = new JFrame() ; 
Container cp = w.getContentPane(); 
cp.setLayout(null); 

BackgroundPanel bg = new BackgroundPanel(); 
cp.add(bg); 

JPanel b = new JPanel(); 
b.setSize(new Dimension(30, 40)); 
b.setBackground(Color.red); 
cp.add(b); 
w.pack() 
w.setVisible(true) 

Это показывает маленький красный квадрат (или любой другой компонент), а не фон, но когда я удалить cp.setLayout(null);, фон показывает вверх, но не мой другой компонент. Я предполагаю, что это как-то связано с тем, что paintComponent не вызывается нулевым LayoutManager, но я совсем не знаком с тем, как работают LayoutManagers (это проект для колледжа, и в задании конкретно говорится, что не использовать LayoutManager) ,

Когда я делаю изображение, фон должен отображать нуль (а значит, прозрачный (?)) Появляется красный квадрат, поэтому может быть, что фон действительно выше моих других компонентов.

У кого-нибудь есть идеи?

Благодаря

+0

Надеюсь, этот [поток] (http://stackoverflow.com/a/11428289/1057230) может также помочь, по теме :-) –

ответ

5

При использовании null раскладку (и вы почти никогда не должны) вы должны предоставить оценки для каждого компонента, в противном случае он по умолчанию (0 х, 0 у, 0 ширина, высота 0) и компонент не будет дисплей.

BackgroundPanel bg = new BackgroundPanel(); 
cp.add(bg); 

не дает никаких ограничений. Вам нужно сделать что-то вроде:

BackgroundPanel bg = new BackgroundPanel(); 
bg.setBounds(100, 100, 100, 100); 
cp.add(bg); 

Что бы сделать bg размер 100 х 100 и поместить его в 100 х 100, у на раме.

3

Посмотрите в документации по Root Pane для всей информации, что вам нужно. Обратите внимание на доступность слоистой панели и стекла, а также панели содержимого.

2

По умолчанию все компоненты имеют размер 0. Просто потому, что вы выполняете какую-либо покраску на компоненте, не придает компоненту размер. Вы по-прежнему несете ответственность за настройку размера. Вот почему вы всегда должны использовать диспетчер компоновки. Он заботится о всех вещах такого размера для вас, поэтому вам не нужно беспокоиться.

Я не знаю, почему новички всегда думают, что они не могут использовать диспетчер компоновки. Да, для изучения требуется еще несколько минут, но в долгосрочной перспективе это сэкономит вам много горя.

Background Panel показывает несколько подходов. Опять же они предполагают, что вы используете диспетчер компоновки, поэтому вам может потребоваться установить размер вручную.

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