JFrame Back Ground Изображение, что другие кнопки не появляются на рамке, когда задано фоновое изображение? [Дубликат]

1

Я хочу добавить фоновое изображение в свой кадр. Но когда я добавляю изображение в свой кадр, он был добавлен успешно, но другие вещи, такие как j ярлык и кнопки, добавленные в рамки, не отображаются во фрейме. Я сохранил изображение на рабочем столе. ниже мой код

package UI;

import java.awt.BorderLayout;
import java.awt.EventQueue;

import java.awt.Color;
import java.io.File;

import javax.imageio.ImageIO;
import javax.swing.ImageIcon;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.border.EmptyBorder;
import java.awt.GridBagLayout;
import java.awt.GridBagConstraints;
import java.awt.Font;
import javax.swing.JButton;
import java.awt.Insets;

public class EditTeamInterface extends JFrame {

    private JPanel contentPane;

    /**
     * Launch the application.
     */
    public static void main(String[] args) {
        EventQueue.invokeLater(new Runnable() {
            public void run() {
                try {
                    EditTeamInterface frame = new EditTeamInterface();
                    frame.setExtendedState(JFrame.MAXIMIZED_BOTH);

                    //frame.getContentPane().setBackground(Color.white);
                    frame.setContentPane(new JLabel(new ImageIcon(ImageIO.read(new File("C:/Users/Abdullah/Desktop/cricketBackGround1.jpg")))));
                    frame.pack();
                    frame.setVisible(true);
                } catch (Exception e) {
                    e.printStackTrace();
                }
            }
        });
    }

    /**
     * Create the frame.
     */
    public EditTeamInterface() {
        setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        setBounds(100, 100, 624, 356);
        contentPane = new JPanel();
        contentPane.setBorder(new EmptyBorder(5, 5, 5, 5));
        setContentPane(contentPane);
        GridBagLayout gbl_contentPane = new GridBagLayout();
        gbl_contentPane.columnWidths = new int[]{0, 0, 0, 0, 0, 0, 0};
        gbl_contentPane.rowHeights = new int[]{0, 0, 0, 0, 0, 0, 0};
        gbl_contentPane.columnWeights = new double[]{0.0, 0.0, 0.0, 0.0, 0.0, 0.0, Double.MIN_VALUE};
        gbl_contentPane.rowWeights = new double[]{0.0, 0.0, 0.0, 0.0, 0.0, 0.0, Double.MIN_VALUE};
        contentPane.setLayout(gbl_contentPane);

        JLabel lblNewLabel = new JLabel("EDIT OPTIONS");
        lblNewLabel.setFont(new Font("SketchFlow Print", Font.BOLD, 18));
        GridBagConstraints gbc_lblNewLabel = new GridBagConstraints();
        gbc_lblNewLabel.insets = new Insets(0, 0, 5, 5);
        gbc_lblNewLabel.gridx = 0;
        gbc_lblNewLabel.gridy = 0;
        contentPane.add(lblNewLabel, gbc_lblNewLabel);

        JButton btnNewButton = new JButton("New button");
        GridBagConstraints gbc_btnNewButton = new GridBagConstraints();
        gbc_btnNewButton.gridx = 5;
        gbc_btnNewButton.gridy = 5;
        contentPane.add(btnNewButton, gbc_btnNewButton);
    }

}
  • 0
    Размер изображения соответствует размеру экрана моего ноутбука: 1337 по горизонтали и 670 по вертикали.
Теги:
background-image
user-interface
swing
jframe

1 ответ

1

В конструкторе EditTeamInterface вы устанавливаете область содержимого для фрейма с помощью setContentPane(contentPane); , но в static void main вы заменяете ее

frame.setContentPane(new JLabel(new ImageIcon(ImageIO.read(new File("C:/Users/Abdullah/Desktop/cricketBackGround1.jpg")))));

Это отбрасывает все, что вы делали раньше, для этого нового контента...

Вместо EditTeamInterface простирающегося от JFrame, измените его так, чтобы он простирался от JPanel

Создайте новый экземпляр JFrame, установите панель содержимого на свою метку, а затем добавьте EditTeamInterface в фрейм.

Поскольку по умолчанию у JLabel нет менеджера компоновки, вы должны вызвать setLayout(new BorderLayout()) в кадре после того, как вы установите его на панель содержимого на ярлык

Хотя, используя JLabel, этот способ будет работать, JLabel НЕ будет вычислять предпочтительный размер на основе потребностей его содержимого, а скорее зависит от свойств icon и text. Это не делает его подходящим для этой задачи.

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

Что-то вроде этого, например

Ещё вопросы

Сообщество Overcoder
Наверх
Меню