在java中为jframe添加不同的jcomponents

时间:2015-04-24 14:18:18

标签: java swing jframe paintcomponent jcomponent

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

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

(Model2与Model1类似,但paintComponent有点不同)

import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JPanel;

public class GuiModel{  
    public static void main(String[] args){         
        JFrame frame = new JFrame();        
        frame.setSize(600, 600);
        frame.setLocation(150, 150);
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        frame.setVisible(true);                 

        frame.getContentPane().add(new Model1(0,0));
        frame.getContentPane().add(new Model2(25,37,true));             

    }
}
import java.awt.Color;
import java.awt.Graphics;
import javax.swing.JComponent;    
public class Model1 extends JComponent {
    private int xPos, yPos;


    Model1 (int x, int y){
        this.xPos = x;
        this.yPos = y;
    }

    @Override
    protected void paintComponent(Graphics g) {     
        g.setColor(Color.BLACK);
        g.drawOval(xPos, yPos, 5, 5);                   
    }
}

3 个答案:

答案 0 :(得分:3)

进行自定义绘画时:

  1. 您需要覆盖组件的getPreferredSize()方法以返回组件的大小,以便布局管理器可以显示组件。现在你的组件的大小是(0,0)所以没有什么可画的。

  2. 组件的绘制是从(0,0)完成的,而不是(x,y)。然后,如果将组件放置在面板上的特定点,则使用setLocation(x,y)告诉Swing绘制组件的位置。

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

  4. 所以你的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);                   
        }
    }
    

答案 1 :(得分:2)

JFrame默认使用BorderLayout。在未指定约束的情况下添加组件时,每个组件都将放置在CENTER

指定约束,或者如果BorderLayout不适合你,请切换到另一个布局。

添加约束:

frame.add(new Model1(0,0), BorderLayout.NORTH);

我建议您阅读How to use BorderLayout以及guides on the other predefined layouts。此外,如果JDK提供的任何布局都不符合您的需求,请随时在线查看第三方布局。或者,如果没有符合您需求的布局,您可以创建自己的LayoutManager

我还建议您使用pack() 根据中的组件调整框架大小,而不是使用frame.setSize设置其大小。这可以确保您的框架紧紧包裹在其中的任何内部,不留空的空间。如果您想要空格,则应由布局管理器处理

答案 2 :(得分:-1)

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

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

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