Как сделать единое фоновое изображение, которое будет отображаться на всех макетах сетки (Java GUI)? - PullRequest
1 голос
/ 21 июня 2020

Приношу извинения, если это уже было рассмотрено, но все остальные темы, которые я отфильтровал / просмотрел, относятся только к XAML, а не к Java.

Итак, я пытаюсь создать приложение для ресторана и использую GridBagLayout, GridBagConstraints и c для моей начальной страницы. Я могу расположить сетки по своему вкусу, но проблема, с которой я сталкиваюсь, связана с фоновым изображением. Он проникает только в одну из сеток, когда я изменяю значения c .gridx и c .gridy. Единственное решение, которое я могу найти, - это то, что мне нужно вставить разные фоновые изображения для каждого макета сетки / Jpanel (пока у меня их 3). Есть ли способ использовать один ImageIcon (или любой метод), который бы отображал мое фоновое изображение на всех сетках?

Спасибо.

Вот мои коды ниже:

package BeginnerAppPractice;

import java.util.*;

import java.awt.*;
import java.awt.event.*;

import javax.swing.*;
import javax.swing.border.*;

public class StartPage extends JFrame {
    
    Container mainPanel;
        
    public StartPage() {
        super("The Dark Worlds");
        mainPanel = new Container();
        mainPanel.setLayout(new GridBagLayout());
        
        
        
        //For editing our grids
        GridBagConstraints c = new GridBagConstraints(); 
        
        //Title Pane content and settings
        JLabel titleContent = new JLabel("Restaurant Name", SwingConstants.CENTER);
        Font fonttitle = new Font("TimesRoman",Font.BOLD,60);
        titleContent.setForeground(Color.RED);
        titleContent.setFont(fonttitle);
        
        //Title Pane settings
        JPanel title = new JPanel();
        
        title.setLayout(new GridLayout(1,1));
        title.setBorder(new EmptyBorder(20,20,20,20));
        title.setLayout(new GridLayout(1,1));
        title.setBorder(new LineBorder(Color.BLACK, 4));
        title.setMinimumSize(new Dimension(600,100));
        title.setMaximumSize(new Dimension(600,100));
        title.setPreferredSize(new Dimension(600,100));
        
        
        //Title Pane Grid Settings
        c.gridx = 0;
        c.gridy = 0;
        c.fill = GridBagConstraints.VERTICAL;
        c.weightx = 1;
        c.weighty = 1;
        mainPanel.add(title.add(titleContent), c);
        
       
        //For Portfolio
        JLabel optionsStartContent = new JLabel("Food Portfolio", SwingConstants.CENTER);
        
        Font fontoptionsStart = new Font("TimesRoman",Font.PLAIN,20);
        optionsStartContent.setForeground(Color.RED);
        optionsStartContent.setFont(fontoptionsStart);
        
        JPanel optionsStart = new JPanel();
        optionsStart.setBorder(new EmptyBorder(20,20,20,20));
        optionsStart.setLayout(new GridLayout(1,1));
        optionsStart.setBorder(new LineBorder(Color.BLACK, 4));
        optionsStart.setMinimumSize(new Dimension(600,50));
        optionsStart.setMaximumSize(new Dimension(600,50));
        optionsStart.setPreferredSize(new Dimension(600,50));
                
        c.gridx = 0;
        c.gridy = 1;
        c.fill = GridBagConstraints.VERTICAL;
        c.weightx = 1;
        c.weighty = 1;
        mainPanel.add(optionsStart.add(optionsStartContent), c);
        
        //For Exit
        JLabel optionsExitContent = new JLabel("Exit App", SwingConstants.CENTER);
        
        Font fontoptionsExit = new Font("TimesRoman",Font.PLAIN,20);
        optionsExitContent.setForeground(Color.RED);
        optionsExitContent.setFont(fontoptionsExit);
        
        JPanel optionsExit = new JPanel();
        optionsExit.setBorder(new EmptyBorder(20,20,20,20));
        optionsExit.setLayout(new GridLayout(1,1));
        optionsExit.setBorder(new LineBorder(Color.BLACK, 4));
        optionsExit.setMinimumSize(new Dimension(600,50));
        optionsExit.setMaximumSize(new Dimension(600,50));
        optionsExit.setPreferredSize(new Dimension(600,50));
                
        c.gridx = 0;
        c.gridy = 2;
        c.fill = GridBagConstraints.VERTICAL;
        c.weightx = 1;
        c.weighty = 1;
        mainPanel.add(optionsExit.add(optionsExitContent), c);
         
        //Background Image that would fill the container
        ImageIcon background=new ImageIcon("C:\\Users\\User\\Documents\\RoastedDuck.png");
        Image img=background.getImage();
        Image temp=img.getScaledInstance(600,200,Image.SCALE_SMOOTH);
        background=new ImageIcon(temp);
        JLabel back=new JLabel(background);
        back.setLayout(new GridLayout(1,1));
        back.setBounds(0, 0, 600, 200);
        
        c.gridx = 0;
        c.gridy = 0;
        c.gridwidth = 1;
        c.gridheight = 1;
        c.fill = GridBagConstraints.HORIZONTAL;
        c.weightx = 1;
        c.weighty = 1;
        mainPanel.add(back, c);
        
    }
    
    
}

и

package BeginnerAppPractice;

import javax.swing.JFrame;

public class Main {
    public static void main(String[] args) {
        StartPage startpage = new StartPage();
        startpage.add(startpage.mainPanel);
        startpage.pack();
        startpage.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        startpage.setVisible(true);
        startpage.setLocationRelativeTo(null);
        startpage.setResizable(true);
        
    }
}

EDIT:

Благодаря этому ответу:

You could use your JLabel with the background image as your background panel and then just set a layout manager for the label, then add components to the label. Or you could do custom painting of a JPanel to paint the background image and then add your components to the panel. See: Background Panel for more information and a custom class you could use as the background panel. – camickr 4 hours ago

Я понял, что должен сделать это вместо:

package BeginnerAppProject;

import java.util.*;

import java.awt.*;
import java.awt.event.*;

import javax.swing.*;
import javax.swing.border.*;

public class StartPage extends JFrame {
    
    Container mainPanel;
        
    public StartPage() {
        super("The Dark Worlds Resto");
        mainPanel = new Container();
        mainPanel.setLayout(new GridBagLayout());
        //For editing our grids
        GridBagConstraints c = new GridBagConstraints(); 
        
        //Background Image
        
        ImageIcon background=new ImageIcon("C:\\Users\\User\\Documents\\RoastedDuck.png");
        Image img=background.getImage();
        Image temp=img.getScaledInstance(600,400,Image.SCALE_SMOOTH);
        background=new ImageIcon(temp);
        JLabel back=new JLabel(background);
        back.setLayout(new GridLayout(3,1));
        back.setBounds(0, 0, 600, 400);
        
        c.gridx = 0;
        c.gridy = 0;
        c.gridwidth = 1;
        c.gridheight = 1;
        c.fill = GridBagConstraints.HORIZONTAL;
        c.weightx = 1;
        c.weighty = 1;
        mainPanel.add(back, c);
       
        //Title Pane content and settings
        JLabel titleContent = new JLabel("Restaurant Name", SwingConstants.CENTER);
        Font fonttitle = new Font("TimesRoman",Font.BOLD,60);
        titleContent.setForeground(Color.RED);
        titleContent.setFont(fonttitle);
        
        //Title Pane settings
        JPanel title = new JPanel();
        
        title.setLayout(new GridLayout(1,1));
        title.setBorder(new EmptyBorder(20,20,20,20));
        title.setLayout(new GridLayout(1,1));
        title.setBorder(new LineBorder(Color.BLACK, 4));
        title.setMinimumSize(new Dimension(600,100));
        title.setMaximumSize(new Dimension(600,100));
        title.setPreferredSize(new Dimension(600,100));
        
        //Title Pane Grid Settings
        c.gridx = 0;
        c.gridy = 0;
        //c.fill = GridBagConstraints.VERTICAL;
        c.weightx = 1;
        c.weighty = 1;
        back.add(title.add(titleContent), c);
        
       //
        JLabel optionsStartContent = new JLabel("Food Portfolio", SwingConstants.CENTER);
        
        Font fontoptionsStart = new Font("TimesRoman",Font.PLAIN,20);
        optionsStartContent.setForeground(Color.RED);
        optionsStartContent.setFont(fontoptionsStart);
        
        JPanel optionsStart = new JPanel();
        optionsStart.setBorder(new EmptyBorder(20,20,20,20));
        optionsStart.setLayout(new GridLayout(1,1));
        optionsStart.setBorder(new LineBorder(Color.WHITE, 4));
        optionsStart.setMinimumSize(new Dimension(600,50));
        optionsStart.setMaximumSize(new Dimension(600,50));
        optionsStart.setPreferredSize(new Dimension(600,50));
        
        c.gridx = 0;
        c.gridy = 0;
        //c.fill = GridBagConstraints.VERTICAL;
        c.weightx = .5;
        c.weighty = .5;
        back.add(optionsStart.add(optionsStartContent), c);
        
        //
        JLabel optionsExitContent = new JLabel("Options", SwingConstants.CENTER);
        
        Font fontoptionsExit = new Font("TimesRoman",Font.PLAIN,20);
        optionsExitContent.setForeground(Color.RED);
        optionsExitContent.setFont(fontoptionsExit);
        
        JPanel optionsExit = new JPanel();
        optionsExit.setBorder(new EmptyBorder(20,20,20,20));
        optionsExit.setLayout(new GridLayout(1,1));
        optionsExit.setBorder(new LineBorder(Color.WHITE, 4));
        optionsExit.setMinimumSize(new Dimension(600,50));
        optionsExit.setMaximumSize(new Dimension(600,50));
        optionsExit.setPreferredSize(new Dimension(600,50));
        
        c.gridx = 0;
        c.gridy = 1;
        //c.fill = GridBagConstraints.VERTICAL;
        c.weightx = .5;
        c.weighty = .5;
        back.add(optionsExit.add(optionsExitContent), c);
        
    }
    
    
}

Но когда я редактировал код, было так много бесполезных строк, поэтому я просто упростил это:


package BeginnerAppProject;

import java.util.*;

import java.awt.*;
import java.awt.event.*;

import javax.swing.*;
import javax.swing.border.*;

public class StartPage extends JFrame {
    
    private static final long serialVersionUID = 1L;
    
    JLabel title, start, options, exit;
    JLabel spaces1, spaces2;
    JPanel container;
    GridBagConstraints c; 
        
    public StartPage() {
        
        setLayout(new GridBagLayout());
        c = new GridBagConstraints();
        
        container = new JPanel();
        
        ImageIcon background=new ImageIcon("C:\\Users\\User\\Documents\\RoastedDuck.png");
        Image img=background.getImage();
        Image temp=img.getScaledInstance(600,400,Image.SCALE_SMOOTH);
        background=new ImageIcon(temp);
        JLabel back=new JLabel(background);
        back.setLayout(new GridLayout(8,8));
        back.setBounds(0, 0, 600, 400);
        container.add(back);
        
        //Space
            spaces1 = new JLabel("");
            back.add(spaces1);
            
        //Title Settings
        title = new JLabel("Restaurant Name", SwingConstants.CENTER);
        
        Font fonttitle = new Font("TimesRoman",Font.BOLD,60);
        title.setForeground(Color.RED);
        title.setFont(fonttitle);
        
        back.add(title);
        
        //Space
        spaces2 = new JLabel("");
        back.add(spaces2);
        
        //Other Settings
        start = new JLabel("Food Portfolio", SwingConstants.CENTER);
        
        Font fontoptions = new Font("TimesRoman",Font.BOLD,15);
        start.setForeground(Color.RED);
        start.setFont(fontoptions);
        
        back.add(start);
        
        //Other Settings
        options = new JLabel("Bookings, Schedules, and Others", SwingConstants.CENTER);
        
        options.setForeground(Color.RED);
        options.setFont(fontoptions);
        
        back.add(options);
        
        //Other Settings
        exit = new JLabel("Exit", SwingConstants.CENTER);
        
        exit.setForeground(Color.RED);
        exit.setFont(fontoptions);
        
        back.add(exit);
        
    }
    
    
}

...