Когда задан фон jpanel, его компоненты не будут отображаться

#java #swing #background #jpanel #paintcomponent

Вопрос:

Я попытался установить фоновое изображение в свою JPanel, в котором содержатся некоторые другие компоненты,такие как Jlabel,JCheckBox, JTextField.Я добавил фон, создав другой класс и расширив JPanel , и поэтому переопределил paintComponent().изображение настроено идеально, но эти метки и…, не будут отображаться.отображаются только кнопки, и это происходит, когда я наводю на них курсор мыши(флажки тоже, но когда они отображаются, они содержат свой собственный фон, который мешает изображению).

Мой код:

 public class ImagePanel extends JPanel {

private Image image;

ImagePanel(String path){
    
    this(new ImageIcon(path).getImage());
    
}

ImagePanel(Image image){
    
    this.image=image;
    
    Dimension size=new Dimension(796, 481);
    setSize(size);
    setLayout(null);
    
}
@Override
public void paintComponent(Graphics g) {
    //numbers are the size of the main JPanel
    g.drawImage(image,0,0,796,481, this);
    
}
 

}

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

заранее спасибо.

Ответ найден, спасибо всем вам за участие.ответ содержится в комментариях.

Комментарии:

1. public void paintComponent(Graphics g) { .. должно быть public void paintComponent(Graphics g) { super.paintComponent(g); ..

2. Далее 1) g.drawImage(image,0,0,796,481, null); должно быть g.drawImage(image,0,0,796,481, this); (каждый JComponent является ImageObserver ) 2) @Override Обозначение должно быть добавлено к любому переопределенному методу. 3) Dimension size=new Dimension(796, 481); setSize(size); ничего не добьется. Для определенного размера переопределите getPreferredSize() метод. Большинство менеджеров по верстке будут уважать это, а pack() также рамку вокруг нее для аккуратной подгонки. 4) Проблему, которую следует устранить, см. в разделе Обнаружение/исправление подвешенной скобки блока кода .

3. 5) new ImageIcon(path).getImage() это очень хрупкий способ загрузки изображения. Используйте ImageIO.read(URL) для полезного вывода, когда изображение не найдено. Также обратите внимание, что фоновое изображение для панели, очевидно, является ресурсом приложения, поэтому его необходимо загружать по URL-адресу, а не по файлу. .. Действительно, этот код следует выбросить и начать все сначала. В этом больше неправильного, чем правильного.

4. @AndrewThompson Какие это может иметь значение?не могли бы вы объяснить, пожалуйста? (для добавления компонента super.paint (g))

5. Вы должны добавить свои компоненты Swing в ту же JPanel, на которой вы неправильно нарисовали свое изображение. Поскольку вам нужны объяснения для всего, пройдите учебник Oracle, Создав графический интерфейс с помощью JFC/Swing . Пропустите раздел Netbeans, изучите все остальные разделы. Наконец, начните с создания простых графических интерфейсов Swing, которые работают, а затем позаботьтесь о том, чтобы сделать их «красивыми» с помощью фоновых изображений.