2015-05-18 2 views
1

Я пытаюсь научиться рисовать овал в java, но paintComponent, который я сделал, никем не вызывается, и попытка вызвать его вызывает больше проблем.Java: paintComponent() Oval не отображается в Netbeans

Программа работает успешно, но изображение, которое я хочу отображать, не отображается.

import java.awt.*; 
import javax.swing.*; 


public class TEST2{ 
public void paintComponent(Graphics g){ 
    g.drawOval(70, 70, 100, 100); 
} 
public static void main(String[] args) { 
    TEST2 gui = new TEST2(); 
    gui.setUpFrame(); 
} 
public void setUpFrame(){ 
    JFrame frame = new JFrame(); 
    frame.setTitle("Images should be in this program"); 
    frame.setSize(600,300); 
    frame.setVisible(true); 
    frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
}  

} 

ответ

0

Метод paintComponent() - это метод, который вы переопределяет, и к нему следует обращаться внутри класса, который расширяет JPanel. Вы можете создать новый класс, который расширяет JPanel и отменяет метод paintComponent(), чтобы нарисовать ваш овал. Вам также нужно будет добавить новый JPanel к вашему JFrame для его отображения. Я изменил ваш код ниже, он должен отображать овал сейчас. Поскольку Madprogrammer отметил, что вы, вероятно, должны создать свой графический интерфейс в контексте edt, чтобы избежать проблем с параллелизмом, но я опускаю это для простоты.

import java.awt.*; 
import javax.swing.*; 

public class Test { 

    public static void main(String[] args) { 
     Test gui = new Test(); 
     gui.setUpFrame(); 
    } 

    public void setUpFrame() { 
     JFrame frame = new JFrame(); 
     frame.setTitle("Images should be in this program"); 
     frame.setSize(600, 300); 
     JPanel oval = new oval(); 
     frame.setContentPane(oval); 
     frame.setVisible(true); 
     frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
    } 
    public class oval extends JPanel{ 
     @Override 
     public void paintComponent(Graphics g) { 
      super.paintComponent(g); 
      g.drawOval(70, 70, 100, 100); 
     } 
    } 

} 
+2

1- вызов 'super.paintComponent', прежде чем он начнет рисовать всевозможные странные и замечательные артефакты по всему вам; 2- Рассмотрите возможность использования аннотации '@ Override' при переопределении методов; 3- 'paintComponent' никогда не должен быть« публичным »; 4- Вы действительно должны создать свой пользовательский интерфейс из контекста EDT – MadProgrammer

1

Начните с взглянуть на Painting in AWT and Swing и Performing Custom Painting

Для того, чтобы иметь возможность выполнить собственную картину в свинге, вы должны ...

  1. Наследовать от компонента свинга основы (например JComponent или JPanel)
  2. Затем вы должны переопределить его метод paintComponent и выполнить обычную покраску в этом методе.
  3. Добавить этот компонент к чему-то отображаемая (как JFrame)

Вы должны убедиться в том, чтобы позвонить super.paintComponent, прежде чем делать какие-либо пользовательские картины

Чтобы убедиться, что вы не делаете какой-либо (общий) ошибки, вы должны использовать @Override аннотацию

в качестве примера ...

import java.awt.Dimension; 
import java.awt.EventQueue; 
import java.awt.Graphics; 
import javax.swing.JFrame; 
import javax.swing.JPanel; 
import javax.swing.UIManager; 
import javax.swing.UnsupportedLookAndFeelException; 

public class Test2 extends JPanel { 

    @Override 
    protected void paintComponent(Graphics g) { 
     super.paintComponent(g); 
     g.drawOval(70, 70, 100, 100); 
    } 

    @Override 
    public Dimension getPreferredSize() { 
     return new Dimension(200, 200); 
    } 

    public static void main(String[] args) { 
     EventQueue.invokeLater(new Runnable() { 
      @Override 
      public void run() { 
       try { 
        UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName()); 
       } catch (ClassNotFoundException | InstantiationException | IllegalAccessException | UnsupportedLookAndFeelException ex) { 
        ex.printStackTrace(); 
       } 

       JFrame frame = new JFrame(); 
       frame.setTitle("Images should be in this program"); 
       frame.add(new Test2()); 
       frame.pack(); 
       frame.setVisible(true); 
       frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
      } 
     }); 
    } 

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