Java 如何在JPanel和JFrame边界内绘制?

Java 如何在JPanel和JFrame边界内绘制?,java,swing,Java,Swing,我的代码假设在JPanel中的任意位置绘制环,但由于某些原因,我的环有时会超出此界限,例如,它出现在下半部分。 据我所知,我的JPanel位于JFrame内,为了在该边界内绘制,我的环应使用以下表达式绘制: xRing = (int)((frameWidth -ringSize)* (Math.random())); yRing = (int)((frameHeight-ringSize)*(Math.random())); setParamsRing(xRing, yRing, ringSiz

我的代码假设在JPanel中的任意位置绘制环,但由于某些原因,我的环有时会超出此界限,例如,它出现在下半部分。 据我所知,我的JPanel位于JFrame内,为了在该边界内绘制,我的环应使用以下表达式绘制:

xRing = (int)((frameWidth -ringSize)* (Math.random()));
yRing = (int)((frameHeight-ringSize)*(Math.random()));
setParamsRing(xRing, yRing, ringSize); 
有什么问题? 以下是所有代码:

public class mull extends JPanel implements ActionListener{

    private static JPanel p;
      Timer timer;
      ActionListener updateProBar;
      private double esize;
      private double maxSize = 0;
      private boolean initialize = true;
        private int squareX = 50;
        private int squareY = 50;
        private int squareSize = 200;  
        private int ringX = 50;
        private int ringY = 50;
        private int ringSize = 100;
        private static int frameWidth = 300;
        private static int frameHeight = 300;
        private int jPanelHeight;
        private int jPanelWidth;
        private int i = 0;

      public mull() {
            timer = new Timer(200, this);
            timer.setInitialDelay(200);
            timer.start();
          }
      int xRing;
      int yRing;
          @Override
          public void actionPerformed(ActionEvent e) {
               xRing = (int)((frameWidth -ringSize)* (Math.random()));
               yRing = (int)((frameHeight-ringSize)*(Math.random()));
              setParamsRing(xRing, yRing, ringSize);
              repaint();

          }
//  public void getJPanelSize(){
//      Rectangle r = p.getBounds();
//        jPanelHeight = r.height;
//        jPanelWidth = r.width;
//  }
    public void setParamsRing(int xpos, int ypos, int size){
        this.ringX = xpos;
        this.ringY = ypos;
        this.ringSize = size;
    }
    public void setParamsSquare(int xpos, int ypos, int size){
        this.squareX = xpos;
        this.squareY = ypos;
        this.squareSize = size; 
    }
    protected void paintComponent(Graphics g) {
        super.paintComponent(g);       
      g.setColor(Color.BLACK);
      g.drawOval(ringX, ringY, ringSize, ringSize);
      g.setColor(Color.BLUE );
      g.fillOval(ringX, ringY, ringSize, ringSize);

//        g.setColor(Color.BLACK);
//    g.drawRect(ringX, ringY, ringSize, ringSize);
//    g.setColor(Color.BLUE );
//    g.fillRect(ringX, ringY, ringSize, ringSize);

    } 



public static void main(String[] args) throws InterruptedException  {

        JFrame f = new JFrame("Swing Paint Demo");
        f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
        p = new JPanel();

        p.addMouseListener(new MouseAdapter() {
          public void mousePressed(MouseEvent e) {
//              moveSquare(e.getX(),e.getY());
          }
      });

        f.add(p);
        f.add(new mull());
        f.setSize(frameWidth, frameHeight);
        f.setLocationRelativeTo(null);
        f.setVisible(true);
    }
}


谢谢,这种方法奏效了! 我需要画圆环和正方形,但不能重叠。 问题是什么?我的代码似乎不起作用(尽管它似乎是正确的):

@覆盖
已执行的公共无效操作(操作事件e){
xRing=(int)((getWidth()-ringSize)*(Math.random());
yRing=(int)((getHeight()-ringSize)*(Math.random());
xSquare=(int)((getWidth()-squareSize)*(Math.random());
ySquare=(int)((getHeight()-squareSize)*(Math.random());

而(您的代码中的问题是,您正在画的面板不是维度<代码>框架宽度>代码> x>代码>框架高度但较小。框架的边界设置为这些值,但您必须考虑标题栏和边框,这使得实际面板比它小一点。

您可以改为使用面板的宽度和高度:

xRing = (int) ((getWidth() - ringSize) * Math.random());
yRing = (int) ((getHeight() - ringSize) * Math.random());
setParamsRing(xRing, yRing, ringSize);
xRing = (int) ((getWidth() - ringSize) * Math.random());
yRing = (int) ((getHeight() - ringSize) * Math.random());
setParamsRing(xRing, yRing, ringSize);