我正在通过Java GUI创建一个简单的游戏,但我在使用面板进行初始设计时遇到了一些问题。
我希望设计像这样(见图片)
但我认为我总是遇到尺码问题。
如果您有任何建议,这是我的代码。
public class GameProject extends JFrame {
ImagePanel gamePanel;
Image image = null;
public GameProject() {
setTitle("");
setSize(1100, 900);
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
setLocationRelativeTo(null);
ImageIcon image = new ImageIcon("logo.jpg");
JLabel label = new JLabel("", image, JLabel.CENTER);
JPanel leftPanel = new JPanel(new BorderLayout());
leftPanel.setBackground(Color.LIGHT_GRAY);
leftPanel.setBounds(300, 900, 180, 110);
leftPanel.add(label, BorderLayout.WEST);
add(leftPanel);
gamePanel = new ImagePanel("SnakesLadders2.jpg");
add(gamePanel, BorderLayout.CENTER);
setVisible(true);
}
class ImagePanel extends JPanel {
public ImagePanel() {
}
public ImagePanel(String filename) {
image = new ImageIcon(filename).getImage();
}
@Override
protected void paintComponent(Graphics g) {
super.paintComponent(g);
g.drawImage(image, 0, 0, image.getWidth(null), image.getHeight(null), null);
}
}
public static void main(String[] args) {
new GameProject();
}
}
答案 0 :(得分:3)
永远不要使用setBounds(...)
。对于一个布局,管理者的目标是尊重组件的首选大小,而不是其大小,另一方面,如果您硬编码大小和位置,您几乎可以保证GUI在除您自己之外的所有平台上都不能正常工作。对于您的问题,如果您在JLabel中将图像显示为ImageIcon,则JLabel将根据图像设置其首选大小。如果您需要在JPanel中显示图像,那么由您决定。我有时做类似的事情:
class ImagePanel extends JPanel {
private BufferedImage image;
public ImagePanel() {
}
public ImagePanel(String filename) {
// image = new ImageIcon(filename).getImage();
// don't get images this way.
// use ImageIO.read(URL url) and get the image as a resource
}
@Override
protected void paintComponent(Graphics g) {
super.paintComponent(g);
if (image != null) {
g.drawImage(image, 0, 0, this);
}
}
@Override
public Dimension getPreferredSize() {
if (image == null) {
return super.getPreferredSize();
} else {
int w = image.getWidth();
int h = image.getHeight();
return new Dimension(w, h);
}
}
}
另外,不要像正在做的那样获取图像。
更好ImageIO.read(...)
一个例子......
import java.awt.BorderLayout;
import java.awt.Dimension;
import java.awt.Graphics;
import java.awt.Image;
import java.io.IOException;
import java.net.URL;
import javax.imageio.ImageIO;
import javax.swing.*;
@SuppressWarnings("serial")
public class SnakesAndLaddersProgram extends JPanel {
public static final String GAME_BOARD_PATH = "http://www.righttoremain.org."
+ "uk/blog/wp-content/uploads/2015/11/snakesladders.jpg";
public static final String GAME_LOGO_PATH = "https://loteries.lotoquebec.com"
+ "/loteries/___W9a9e8ef6-0c97-4d1b-a4c3-2588fee936d3___.png";
private static final double BOARD_SCALE = 0.5; // online images too big
private static final double LOGO_SCALE = 0.3; // online images too big
private ImagePanel imagePanel = null;
public SnakesAndLaddersProgram() throws IOException {
URL gameBoardUrl = new URL(GAME_BOARD_PATH);
Image gameBoard = ImageIO.read(gameBoardUrl);
// scale to size:
int w = (int) (gameBoard.getWidth(this) * BOARD_SCALE);
int h = (int) (gameBoard.getHeight(this) * BOARD_SCALE);
gameBoard = gameBoard.getScaledInstance(w, h, Image.SCALE_DEFAULT);
imagePanel = new ImagePanel(gameBoard);
URL logoUrl = new URL(GAME_LOGO_PATH);
Image logo = ImageIO.read(logoUrl);
// scale to size:
w = (int) (logo.getWidth(this) * LOGO_SCALE);
h = (int) (logo.getHeight(this) * LOGO_SCALE);
Icon logoIcon = new ImageIcon(logo);
JLabel logoLabel = new JLabel(logoIcon);
JPanel westPanel = new JPanel();
westPanel.add(logoLabel);
setLayout(new BorderLayout());
add(imagePanel, BorderLayout.CENTER);
add(westPanel, BorderLayout.LINE_START);
}
private static void createAndShowGui() {
SnakesAndLaddersProgram mainPanel = null;
try {
mainPanel = new SnakesAndLaddersProgram();
} catch (IOException e) {
e.printStackTrace();
System.exit(-1);
}
JFrame frame = new JFrame("Snakes And Ladders");
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.getContentPane().add(mainPanel);
frame.pack();
frame.setLocationRelativeTo(null);
frame.setVisible(true);
}
public static void main(String[] args) {
SwingUtilities.invokeLater(() -> createAndShowGui());
}
}
@SuppressWarnings("serial")
class ImagePanel extends JPanel {
private Image image;
public ImagePanel() {
}
public ImagePanel(Image image) {
this.image = image;
}
@Override
protected void paintComponent(Graphics g) {
super.paintComponent(g);
if (image != null) {
g.drawImage(image, 0, 0, this);
}
}
@Override
public Dimension getPreferredSize() {
if (image == null) {
return super.getPreferredSize();
} else {
int w = image.getWidth(this);
int h = image.getHeight(this);
return new Dimension(w, h);
}
}
}