如果你想使用
JLayeredPane
这样,您将需要对其应用合适的布局管理器,例如。。。
import java.awt.BorderLayout;
import java.awt.CardLayout;
import java.awt.Dimension;
import java.awt.EventQueue;
import java.awt.Graphics;
import java.awt.GridBagConstraints;
import java.awt.GridBagLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.image.BufferedImage;
import java.io.IOException;
import javax.imageio.ImageIO;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JLayeredPane;
import javax.swing.JPanel;
import javax.swing.border.EmptyBorder;
public class Main {
public static void main(String[] args) {
new Main();
}
public Main() {
EventQueue.invokeLater(new Runnable() {
@Override
public void run() {
JFrame frame = new JFrame();
frame.add(new MainPane());
frame.pack();
frame.setLocationRelativeTo(null);
frame.setVisible(true);
}
});
}
public interface Navigatable {
enum View {
MENU, CONTENT;
}
public void show(View view);
}
public class MainPane extends JPanel implements Navigatable {
private JLayeredPane layeredPane;
private JPanel contentPane;
private CardLayout cardLayout;
private MenuPane menuPane;
public MainPane() {
setLayout(new BorderLayout());
layeredPane = new JLayeredPane();
add(layeredPane);
layeredPane.setLayout(new GridBagLayout());
GridBagConstraints gbc = new GridBagConstraints();
gbc.gridx = 0;
gbc.gridy = 0;
gbc.weightx = 1;
gbc.weighty = 1;
gbc.fill = GridBagConstraints.BOTH;
BackgroundPane backgroundPane = new BackgroundPane();
layeredPane.add(backgroundPane, gbc);
layeredPane.setLayer(backgroundPane, Integer.valueOf(0));
cardLayout = new CardLayout();
contentPane = new JPanel(cardLayout);
contentPane.setOpaque(false);
layeredPane.add(contentPane, gbc);
layeredPane.setLayer(contentPane, Integer.valueOf(1));
contentPane.add(new MenuPane(this), Navigatable.View.MENU.name());
JLabel label = new JLabel("This is the content");
label.setHorizontalAlignment(JLabel.CENTER);
contentPane.add(label, Navigatable.View.CONTENT.name());
}
@Override
public void show(View view) {
cardLayout.show(contentPane, view.name());
}
}
public class MenuPane extends JPanel {
public MenuPane(Navigatable navigatable) {
setOpaque(false);
setLayout(new GridBagLayout());
setBorder(new EmptyBorder(32, 32, 32, 32));
JButton btn = new JButton("Show me the content");
add(btn);
btn.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
navigatable.show(Navigatable.View.CONTENT);
}
});
}
}
public class BackgroundPane extends JPanel {
private BufferedImage bgImage;
public BackgroundPane() {
try {
bgImage = ImageIO.read(getClass().getResource("/images/Mando01-50.png"));
} catch (IOException ex) {
ex.printStackTrace();
}
}
@Override
public Dimension getPreferredSize() {
if (bgImage != null) {
return new Dimension(bgImage.getWidth(), bgImage.getHeight());
}
return new Dimension(200, 200);
}
@Override
protected void paintComponent(Graphics g) {
super.paintComponent(g);
if (bgImage == null) {
return;
}
int x = (getWidth() - bgImage.getWidth()) / 2;
int y = (getHeight() - bgImage.getHeight()) / 2;
g.drawImage(bgImage, x, y, this);
}
}
}
但是,一个通常更好的解决方案可能是直接使用背景窗格,例如。。。
import java.awt.BorderLayout;
import java.awt.CardLayout;
import java.awt.Dimension;
import java.awt.EventQueue;
import java.awt.Graphics;
import java.awt.GridBagLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.image.BufferedImage;
import java.io.IOException;
import javax.imageio.ImageIO;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.border.EmptyBorder;
public class Main {
public static void main(String[] args) {
new Main();
}
public Main() {
EventQueue.invokeLater(new Runnable() {
@Override
public void run() {
JFrame frame = new JFrame();
frame.add(new MainPane());
frame.pack();
frame.setLocationRelativeTo(null);
frame.setVisible(true);
}
});
}
public interface Navigatable {
enum View {
MENU, CONTENT;
}
public void show(View view);
}
public class MainPane extends JPanel implements Navigatable {
private BackgroundPane backgroundPane;
private CardLayout cardLayout;
private MenuPane menuPane;
public MainPane() {
setLayout(new BorderLayout());
cardLayout = new CardLayout();
backgroundPane = new BackgroundPane();
backgroundPane.setLayout(cardLayout);
add(backgroundPane);
backgroundPane.add(new MenuPane(this), Navigatable.View.MENU.name());
JLabel label = new JLabel("This is the content");
label.setHorizontalAlignment(JLabel.CENTER);
backgroundPane.add(label, Navigatable.View.CONTENT.name());
}
@Override
public void show(View view) {
cardLayout.show(backgroundPane, view.name());
}
}
public class MenuPane extends JPanel {
public MenuPane(Navigatable navigatable) {
setOpaque(false);
setLayout(new GridBagLayout());
setBorder(new EmptyBorder(32, 32, 32, 32));
JButton btn = new JButton("Show me the content");
add(btn);
btn.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
navigatable.show(Navigatable.View.CONTENT);
}
});
}
}
public class BackgroundPane extends JPanel {
private BufferedImage bgImage;
public BackgroundPane() {
try {
bgImage = ImageIO.read(getClass().getResource("/images/Mando01-50.png"));
} catch (IOException ex) {
ex.printStackTrace();
}
}
@Override
public Dimension getPreferredSize() {
if (bgImage != null) {
return new Dimension(bgImage.getWidth(), bgImage.getHeight());
}
return new Dimension(200, 200);
}
@Override
protected void paintComponent(Graphics g) {
super.paintComponent(g);
if (bgImage == null) {
return;
}
int x = (getWidth() - bgImage.getWidth()) / 2;
int y = (getHeight() - bgImage.getHeight()) / 2;
g.drawImage(bgImage, x, y, this);
}
}
}