Приношу извинения, если это уже было рассмотрено, но все остальные темы, которые я отфильтровал / просмотрел, относятся только к 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);
}
}