Java JFrame中的JPanel没有出现?
我目前正在开发2D游戏,因此我没有使用布局管理器: Main.java 我设计了自己的JPanel,因为我还没有找到一种简单的方法来绘制每个像素的组件(Area也是我的一个类): PixelPanel.java 把它们放在我的游戏中: Main.javaJava JFrame中的JPanel没有出现?,java,swing,jframe,Java,Swing,Jframe,我目前正在开发2D游戏,因此我没有使用布局管理器: Main.java 我设计了自己的JPanel,因为我还没有找到一种简单的方法来绘制每个像素的组件(Area也是我的一个类): PixelPanel.java 把它们放在我的游戏中: Main.java 但是,JFrame是深灰色的,但PixelPanel没有显示…您有几个问题: 您永远不会在Swing组件上使用getGraphics()和paintComponent()。Swing将确定何时需要绘制组件,并将适当的图形对象传递给绘制方法。您所
但是,JFrame是深灰色的,但PixelPanel没有显示…您有几个问题:
buffereImage
创建自定义“角色”添加到游戏中。您只需要一个图像来表示每个唯一的字符。下一步是决定你想对你的角色做什么。也就是说,您需要在面板上绘制角色。所以问题是你想怎么做
你可以:
使用buffereImage
创建ImageIcon
,然后将ImageIcon
添加到JLabel
并将标签添加到面板中。使用这种方法,您需要管理标签的大小/位置。尺寸将是标签的首选尺寸,位置将根据游戏规则而变化
这种方法利用了Swing组件,您只需提供要绘制的图像。您可以创建任意多个JLabel,使用相同或不同的图像来表示您的角色
或者您可以:
在面板上的特定位置手动管理角色的绘制。您需要覆盖面板的paintComponent(…)
方法来绘制每个角色对象
使用这种方法,可以保留要绘制的对象的ArrayList。此对象将包含至少两条数据:
paintComponent()
方法中的逻辑简单地迭代ArrayList并绘制每个对象。因此,您显然还需要一种方法,允许您将角色对象添加到ArrayList
您可以查看中的
Draw On Component
示例,以了解这种方法的示例。1)Java GUI必须在不同的操作系统、屏幕大小、屏幕分辨率等方面工作,在不同的地区使用不同的PLAF。因此,它们不利于像素完美布局。而是使用布局管理器,或与布局填充和边框一起使用。2) 为了更快地得到更好的帮助,发布一个or。每次我和裁员经理做了一些事情,结果都失败得很惨,因为他们似乎对我不感兴趣。。。另外,在我的例子中,我只想每像素绘制一个像素,并将这些画作放置在特定的x y位置,我不想要任何LayoutManager+它不必在每个操作系统和屏幕上工作2)我已经删除了我认为不必理解我所做的一切…你试过pChar.setVisible(true)了吗;在你的主要方法中?@MarceloTataje不,那也没有做任何事情我使用了paintComponent方式
-这将是更有效的方法,因为你可以自己管理绘画,而不是通过创建Swing组件来进行绘画,从而产生额外的开销。
public class Main {
static JFrame mainframe = new JFrame();
private static JPanel pchar;
public static void main(String[] args) {
mainframe.getContentPane().setBackground(Color.DARK_GRAY);
mainframe.setLayout(null);
pchar = Characters.basiccharacter();
}
}
public class PixelPanel extends JPanel {
private BufferedImage img;
private int scale;
public PixelPanel(Dimension d, int scale) {
this.setLayout(null);
img = new BufferedImage(d.width * scale, d.height * scale, BufferedImage.TYPE_INT_ARGB);
this.scale = scale;
drawImage();
}
// this will draw the pixel(s) according to the set scale
public void drawPixel(int x, int y, int rgb) {
drawArea(new Area(x * scale, (x + 1) * scale, y, (y + 1) * scale), rgb);
}
public void drawArea(Area a, int rgb) {
for(int x = a.x1(); x < a.x2(); x++) {
for(int y = a.y1(); y < a.y2(); y++) {
drawTruePixel(x, y, rgb);
}
}
drawImage();
}
// this will only draw the one pixel at x : y
private void drawTruePixel(int x, int y, int rgb) {
img.setRGB(x, y, rgb);
}
private void drawImage() {
this.paintComponent(img.getGraphics());
}
}
public class Characters {
static int w = 10;
static int h = 12;
static int scale = 4;
public static JPanel basiccharacter() {
PixelPanel pchar = new PixelPanel(new Dimension(w, h), scale);
pchar.drawPixel(1, 2, 000);
// drawing some more pixels
return pchar;
}
}
mainframe.add(pchar);