我有一个带有JFrame的JPanel,只有当我调整窗口大小时才会显示(使它变小仍然会显示所有的东西,所以不合适不是问题)。我试着在添加所有内容之后调用revalidate()和after (),并确保在添加所有内容之后设置setVisible(true),但是这似乎没有任何作用。
这是我的JFrame代码(这是一个垄断游戏):
public class BoardWindow extends JFrame
{
/** Constructor
*
*/
Board board;
public BoardWindow(Player[] players)
{
super("MONOPOLY GameBoard");
setLayout(new FlowLayout());
board = new Board(players);
add(board);
add(new JButton("Refresh"));
setSize(900, 900);
//setDefaultCloseOperation(EXIT_ON_CLOSE);
setVisible(true);
}
}这是我的JFrame代码
class Board extends JPanel {
public Player players[];
Board(Player[] players)
{
this.players = players;
setVisible(true)
}
@Override
public void paintComponent(Graphics g)
{
super.paintComponent(g);
setPreferredSize(new Dimension(800, 800));
ImageIcon boardPic = new ImageIcon("images/board.png");
boardPic.paintIcon(this, g, 0, 0);
setBackground(Color.WHITE);
int x = 0;
int y = 0;
for(Player i: this.players)
{
g.setColor(i.getColor());
int position = i.getGamePosition();
if(position == 0)
{
x = 25;
y = 700;
}
else if (position > 0 && position < 9)
{
x = 25;
y = ((10-position)*63)+31;
}
else if (position == 9)
{
x = 25;
y = 25;
}
else if (position > 9 && position < 18)
{
y = 25;
x = ((position-9)*63)+98;
}
else if(position == 18)
{
x = 750;
y = 10;
}
else if(position > 18 && position < 27)
{
x = 745;
y = ((position-18)*63)+95;
}
else if (position == 27)
{
x = 750;
y = 660;
}
else if(position > 27)
{
x = ((20-position)*63)+1105;
y= 700;
}
g.fillRect(x, y, 40, 40);
}
}
}发布于 2016-02-14 23:20:09
您在paintComponent中做的太多了。不要在那里读取图像,而是在开始时立即读取它们,例如在类的构造函数中。也不要在此方法中设置preferredSize或设置背景。否则,你就有可能削弱你的方法覆盖。此方法只适用于绘图和绘图,而不适用于其他任何操作。
例如,
class Board extends JPanel {
public Player players[];
private BufferedImage boardPic; // use a BufferedImage
Board(Player[] players) {
this.players = players;
setPreferredSize(new Dimension(800, 800));
setBackground(Color.WHITE);
// much better to use resources and not files
// you'll need to handle an exception here.
boardPic = new ImageIO.read(new File("images/board.png"));
}
@Override
public void paintComponent(Graphics g) {
super.paintComponent(g);
g.drawImage(boardPic, 0, 0, this);
int x = 0;
int y = 0;
for(Player i: this.players) {
g.setColor(i.getColor());
int position = i.getGamePosition();
if(position == 0) {
x = 25;
y = 700;
} else if (position > 0 && position < 9) {
x = 25;
y = ((10-position)*63)+31;
} else if (position == 9) {
x = 25;
y = 25;
} else if (position > 9 && position < 18) {
y = 25;
x = ((position-9)*63)+98;
} else if(position == 18) {
x = 750;
y = 10;
} else if(position > 18 && position < 27) {
x = 745;
y = ((position-18)*63)+95;
} else if (position == 27) {
x = 750;
y = 660;
} else if(position > 27) {
x = ((20-position)*63)+1105;
y= 700;
}
g.fillRect(x, y, 40, 40);
}
}
}更多信息:
我会用类似于这样的东西来读图片:
import java.awt.Dimension;
import java.awt.Graphics;
import java.awt.image.BufferedImage;
import java.io.IOException;
import java.net.URL;
import javax.imageio.ImageIO;
import javax.swing.*;
public class MyMonopoly extends JPanel {
private static final String IMG_PATH = "http://dl.gamesradar.com/photos/gameopoly/monopoly_original.jpg";
private static final int PREF_W = 900;
private static final int PREF_H = PREF_W;
private BufferedImage board = null;
public MyMonopoly() throws IOException {
URL url = new URL(IMG_PATH);
board = ImageIO.read(url);
}
@Override
protected void paintComponent(Graphics g) {
super.paintComponent(g);
if (board != null) {
g.drawImage(board, 0, 0, getWidth(), getHeight(), this);
}
}
@Override
public Dimension getPreferredSize() {
if (isPreferredSizeSet()) {
return super.getPreferredSize();
}
return new Dimension(PREF_W, PREF_H);
}
private static void createAndShowGui() {
MyMonopoly mainPanel = null;
try {
mainPanel = new MyMonopoly();
} catch (IOException e) {
e.printStackTrace();
System.exit(-1);
}
JFrame frame = new JFrame("My Monopoly");
frame.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);
frame.getContentPane().add(mainPanel);
frame.pack();
frame.setLocationByPlatform(true);
frame.setVisible(true);
}
public static void main(String[] args) {
SwingUtilities.invokeLater(() -> {
createAndShowGui();
});
}
}只有我会把它作为一个资源在我的JAR文件中。
我还会为JPanel创建一个自定义布局,然后将我的片段精灵放置到ImageIcons中,将它们放入JLabels中,然后通过它的自定义布局将它们移动到我的JPanel中。
https://stackoverflow.com/questions/35399237
复制相似问题