Как рисовать в границах JPanel и JFrame? - PullRequest
1 голос
/ 03 декабря 2011

У меня есть код, предполагающий рисование кольца в произвольной позиции внутри 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);
    }

}


Спасибо, этот подход сработал!

Мне нужно нарисовать кольцо и квадрат, но не перекрывать друг друга. В чем проблема? Кажется, мой код не работает (хотя кажется, что он правильный):

@Override
public void actionPerformed(ActionEvent 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()));

while( (xSquare>=xRing && xSquare<=ringSize) && (ySquare>=yRing && ySquare<=ringSize)  ){
xSquare = (int)((getWidth() -squareSize)* (Math.random()));
ySquare = (int)((getHeight()-squareSize)*(Math.random()));
               } 
setParamsRing(xRing, yRing, ringSize);
setParamsSquare(xSquare, ySquare, squareSize);
repaint();

 }

1 Ответ

2 голосов
/ 03 декабря 2011

Проблема в вашем коде в том, что панель, на которой вы рисуете, имеет размеры не frameWidth x frameHeight, а меньше.Границы фрейма установлены на эти значения, но вы должны учитывать строку заголовка и границу, которая делает вашу фактическую панель немного меньше этой.

Вместо этого вы можете использовать ширину и высоту панели:

xRing = (int) ((getWidth() - ringSize) * Math.random());
yRing = (int) ((getHeight() - ringSize) * Math.random());
setParamsRing(xRing, yRing, ringSize);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...