2016-08-05 3 views
2

Я пытаюсь создать программу, которая рисует круг в центре JFrame и рисует круг с помощью paintComponent. Моя цель состоит в том, чтобы окружность была сосредоточена в кадре, даже если размер JFrame изменен. Я пытался и искал разные вещи, но ничего не сработало, но я предполагаю, что я должен использовать repaint() и таймеры, но не знаю, как именно. Мой код ниже.Сохранение круга по центру при изменении размера рамки

import java.awt.Graphics; 
import javax.swing.JFrame; 
import javax.swing.JPanel; 

public class ImageFrame extends JFrame { 
    private static final long serialVersionUID = 1L; 

    int width = 40; 
    int height = 40; 
    int x; 
    int y; 

    JPanel panel = new JPanel() { 
     private static final long serialVersionUID = 2L; 
     public void paintComponent(Graphics g) { 
      super.paintComponents(g); 
      g.drawOval(x, y, width, height); 
     } 
    }; 

    public ImageFrame() { 
     add(panel); 
     setDefaultCloseOperation(EXIT_ON_CLOSE); 
     setSize(400, 300); 
     x = (getWidth()/2) - (width/2)-20; 
     y = (getHeight()/2) - (height/2)-40; 
     setLocationRelativeTo(null); 
     setVisible(true); 
    } 
} 

Update

Я добавил метод TrashGod, но он говорит, чтобы удалить @Override, а затем, если RAN, фрейм открывается, но без круга. Код ниже, и я отредактировал paintComponent из моего старого кода.

import java.awt.Color; 
import java.awt.Dimension; 
import java.awt.Graphics; 
import java.awt.Graphics2D; 
import java.awt.RenderingHints; 
import javax.swing.JFrame; 
import javax.swing.JPanel; 

public class ImageFrame extends JFrame implements { 
    private static final long serialVersionUID = 1L; 

    public ImageFrame() { 
     addMouseListener(this); 
     setDefaultCloseOperation(EXIT_ON_CLOSE); 
     setSize(400, 300); 
     setLocationRelativeTo(null); 
     setVisible(true); 
} 

@Override 
public void paintComponent(Graphics g) { 
    super.paintComponent(g); 
    Graphics2D g2d = (Graphics2D) g; 
    g2d.setRenderingHint(RenderingHints.KEY_ANTIALIASING, 
     RenderingHints.VALUE_ANTIALIAS_ON); 
    Dimension size = this.getSize(); 
    int d = 200; 
    int x = (size.width - d)/2; 
    int y = (size.height - d)/2; 
    g.fillOval(x, y, d, d); 
    g.setColor(Color.blue); 
    g.drawOval(x, y, d, d); 
} 
+1

Этот [пример] (http://stackoverflow.com/a/3538279/230513) центров круг и регулирует размер, чтобы меньшего размера, но вы можете сделать константу 'd'. – trashgod

+0

Знаете ли вы что-нибудь о том, чтобы держать круг по центру, если размер рамки изменяется? Это похоже на легкую задачу, но я не знаю, как это сделать. – LAD

+0

Я разработал [ниже] (http://stackoverflow.com/a/38780788/230513). – trashgod

ответ

2

Это example центры круга и регулирует размер до меньшего размера, но вы можете сделать d константу. Существенным шагом является визуализация относительно текущего размера панели. Измените размер рамки, чтобы увидеть эффект. Добавление RenderingHints, видно here, делает рисунок более удручающим.

@Override 
    public void paintComponent(Graphics g) { 
     super.paintComponent(g); 
     Graphics2D g2d = (Graphics2D) g; 
     g2d.setRenderingHint(RenderingHints.KEY_ANTIALIASING, 
      RenderingHints.VALUE_ANTIALIAS_ON); 
     Dimension size = this.getSize(); 
     int d = 200; 
     int x = (size.width - d)/2; 
     int y = (size.height - d)/2; 
     g.fillOval(x, y, d, d); 
     g.setColor(Color.blue); 
     g.drawOval(x, y, d, d); 
    } 

image

Изменения в example:

$ diff OldSwingPaint.java SwingPaint.java 
38a39,41 
>    Graphics2D g2d = (Graphics2D) g; 
>    g2d.setRenderingHint(RenderingHints.KEY_ANTIALIASING, 
>     RenderingHints.VALUE_ANTIALIAS_ON); 
40c43 
<    int d = Math.min(size.width, size.height) - 10; 
--- 
>    int d = 200; 
+0

Как я могу реализовать это в своем коде? И сохраняет ли этот код круг одинакового размера при изменении размера рамки? – LAD

+0

Попробуйте. Это однострочное изменение на [пример цитируется] (http://stackoverflow.com/a/3538279/230513), установка 'int d = 200'. – trashgod

+0

Когда я попытался использовать его, он сказал, что с paintComponent произошла ошибка. – LAD

Смежные вопросы