在java中向jframe添加不同的jcomponents

在java中向jframe添加不同的jcomponents,java,swing,jframe,paintcomponent,jcomponent,Java,Swing,Jframe,Paintcomponent,Jcomponent,我想在一个JPanel中绘制一些不同的JComponents。我使用不同的绘制方法创建了一些JComponents。然后在main中创建对象并将它们放到JFrame中。 我的问题是,窗口中只绘制了最后一个对象 如何在窗口中放置不同的JComponents,而不删除或重新绘制旧组件 (Model2的工作原理与Model1类似,但paintComponent有点不同) 默认情况下,JFrame使用BorderLayout。添加组件而不指定约束时,每个组件将放置在中心 指定约束条件,或者如果Borde

我想在一个JPanel中绘制一些不同的JComponents。我使用不同的绘制方法创建了一些JComponents。然后在main中创建对象并将它们放到JFrame中。 我的问题是,窗口中只绘制了最后一个对象

如何在窗口中放置不同的JComponents,而不删除或重新绘制旧组件

(Model2的工作原理与Model1类似,但paintComponent有点不同)


默认情况下,
JFrame
使用
BorderLayout
。添加组件而不指定约束时,每个组件将放置在
中心

指定约束条件,或者如果
BorderLayout
不适合您,请切换到其他布局

要添加约束,请执行以下操作:

frame.add(new Model1(0,0), BorderLayout.NORTH);
我建议阅读,也建议阅读。此外,如果通过JDK提供的任何布局都不符合您的需要,请随时在线查找第三方布局。如果没有适合您需要的布局,您也可以创建自己的
LayoutManager



我还建议使用
pack()
根据内部组件调整框架的大小,而不是使用
frame.setSize
设置框架的大小。这样可以确保你的框架紧紧地包裹住里面的任何东西,不会留下任何空白。如果需要空白,则应由布局管理器处理。

您可以指定组件的大小,或使用布局将对象放置在非一个位置。或者,您可以创建图形副本并在其中写入:

protected void paintComponent(Graphics g) {
    g = g.create();
    g.setColor(Color.BLACK);
    g.drawOval(xPos, yPos, 5, 5);
    g.dispose();
}

但最后一个变体效率不高:它在每次重新绘制时复制图形。

进行自定义绘制时:

  • 您需要重写组件的
    getPreferredSize()
    方法以返回组件的大小,这样布局管理器就可以显示组件。现在,组件的大小是(0,0),因此没有要绘制的内容

  • 零部件的绘制是从(0,0)开始的,而不是从(x,y)开始的。然后,如果将零部件放置在面板上的特定点上,则可以使用setLocation(x,y)告诉Swing在何处绘制零部件

  • 如果要在随机位置绘制组件,则还需要在面板上使用空布局,并且还必须设置组件的大小。要设置组件的大小,可以在构造函数中使用setSize(getPreferredSize())

  • 因此,您的Model1类看起来像:

    public class Model1 extends JComponent {
        //private int xPos, yPos;
    
        Model1 (int x, int y){
            //this.xPos = x;
            //this.yPos = y;
            setLocation(x, y);
            setSize( getPreferredSize() );
        }
    
        @Override
        public Dimension getPreferredSize()
        {
            return new Dimension(5, 5);
        }
        @Override
        protected void paintComponent(Graphics g) {     
            g.setColor(Color.BLACK);
            //g.drawOval(xPos, yPos, 5, 5);                   
            g.drawOval(0, 0, 5, 5);                   
        }
    }
    
    public class Model1 extends JComponent {
        //private int xPos, yPos;
    
        Model1 (int x, int y){
            //this.xPos = x;
            //this.yPos = y;
            setLocation(x, y);
            setSize( getPreferredSize() );
        }
    
        @Override
        public Dimension getPreferredSize()
        {
            return new Dimension(5, 5);
        }
        @Override
        protected void paintComponent(Graphics g) {     
            g.setColor(Color.BLACK);
            //g.drawOval(xPos, yPos, 5, 5);                   
            g.drawOval(0, 0, 5, 5);                   
        }
    }