Java JFrame中的JPanel没有出现?

Java JFrame中的JPanel没有出现?,java,swing,jframe,Java,Swing,Jframe,我目前正在开发2D游戏,因此我没有使用布局管理器: Main.java 我设计了自己的JPanel,因为我还没有找到一种简单的方法来绘制每个像素的组件(Area也是我的一个类): PixelPanel.java 把它们放在我的游戏中: Main.java 但是,JFrame是深灰色的,但PixelPanel没有显示…您有几个问题: 您永远不会在Swing组件上使用getGraphics()和paintComponent()。Swing将确定何时需要绘制组件,并将适当的图形对象传递给绘制方法。您所

我目前正在开发2D游戏,因此我没有使用布局管理器:

Main.java

我设计了自己的JPanel,因为我还没有找到一种简单的方法来绘制每个像素的组件(Area也是我的一个类):

PixelPanel.java

把它们放在我的游戏中:

Main.java


但是,JFrame是深灰色的,但PixelPanel没有显示…

您有几个问题:

  • 您永远不会在Swing组件上使用getGraphics()和paintComponent()。Swing将确定何时需要绘制组件,并将适当的图形对象传递给绘制方法。您所能做的就是建议使用repaint()方法重新绘制组件

  • 组件的大小为(0,0),因此无需绘制任何内容

  • 要解决这些问题,您需要重新设计代码。你需要更好地理解绘画的基础知识。我建议您首先阅读Swing教程中关于的部分,以获得更多信息和工作示例,从而开始学习

    一旦您更好地理解了自定义绘画的工作原理,您就可以决定使用这两种方法中的哪一种

    您可以使用
    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);