опираясь на Jframe - PullRequest
       10

опираясь на Jframe

1 голос
/ 25 января 2010

Я не могу заставить этот овал рисовать на JFrame.

static JFrame frame = new JFrame("New Frame");
public static void main(String[] args) {
  makeframe();
  paint(10,10,30,30);
}

//make frame
public static void makeframe(){
  frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
  JLabel emptyLabel = new JLabel("");
  emptyLabel.setPreferredSize(new Dimension(375, 300));
  frame.getContentPane().add(emptyLabel , BorderLayout.CENTER);
  frame.pack();
  frame.setVisible(true); 
}

// draw oval 
public static void paint(int x,int y,int XSIZE,int YSIZE) {
  Graphics g = frame.getGraphics();
  g.setColor(Color.red);
  g.fillOval(x, y, XSIZE, YSIZE);
  g.dispose();
}

Рамка отображается, но в ней ничего не нарисовано. Что я тут не так делаю?

Ответы [ 4 ]

8 голосов
/ 25 января 2010

Вы создали статический метод, который не переопределяет метод рисования. Теперь другие уже отметили, что вам нужно переопределить paintComponent и т. Д. Но для быстрого исправления вам нужно сделать следующее:

public class MyFrame extends JFrame {  
   public MyFrame() {
        super("My Frame");

        // You can set the content pane of the frame to your custom class.
        setContentPane(new DrawPane());
        setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        setSize(400, 400);
        setVisible(true); 
   }

   // Create a component that you can actually draw on.
   class DrawPane extends JPanel {
        public void paintComponent(Graphics g) {
            g.fillRect(20, 20, 100, 200); // Draw on g here e.g.
        }
   }

   public static void main(String args[]){
        new MyFrame();
   }
}

Однако, как заметил кто-то еще ... рисовать на JFrame очень сложно. Лучше рисовать на JPanel.

1 голос
/ 25 января 2010

Несколько вещей приходят на ум:

  1. Никогда не переопределяйте paint (), вместо этого используйте paintComponent ()
  2. Почему вы рисуете непосредственно в JFrame?Почему бы не расширить JComponent (или JPanel) и использовать вместо этого?это обеспечивает большую гибкость
  3. Какова цель этого JLabel?Если он расположен поверх JFrame и покрывает всю вещь, то ваша картина будет скрыта за меткой.
  4. Код рисования не должен полагаться на значения x, y, переданные в paint (), чтобы определитьначальная точка рисования рутины.paint () используется для рисования раздела компонента.Нарисуйте овал на холсте там, где вы хотите.

Кроме того, вы не видите JLabel, потому что метод paint () отвечает за рисование как самого компонента, так и дочерних компонентов.Перекрывающая краска () - это зло =)

0 голосов
/ 08 июля 2015

Вам необходимо переопределить существующий метод рисования, который фактически обновляет ваш фрейм. В вашем случае вы только что создали свой новый метод, который не вызывается по умолчанию.

Так что измените свой метод на это:

public void paint(Graphics g){

}
0 голосов
/ 25 января 2010

Вы переопределяете неправильный метод paint (), вы должны переопределить метод с именем paintComponent следующим образом:

@Override 
public void paintComponent(Graphics g)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...