2014-01-09 2 views
1

Во время моих первых дней работы с Java и Swing я столкнулся с одной проблемой, которую я не понимаю. Вот мой код ниже.Displaiyng Объекты JComponent - Java

импорт javax.swing. *;

import java.awt.Color; 
import java.awt.Dimension; 
import java.awt.EventQueue; 
import java.awt.Font; 
import java.awt.Graphics; 
import java.awt.SystemColor; 
import java.awt.Toolkit; 

public class MyFrame 
{ 
    public static void main(String [] args) 
    { 
     EventQueue.invokeLater(new Runnable() 
     { 
       @Override 
       public void run() 
       { 
        Frame f = new Frame(); 
        f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
       } 
      }); 

    } 
} 

class Frame extends JFrame{ 
    Frame() 
    { 
     Toolkit kit = Toolkit.getDefaultToolkit(); 
     Dimension size = kit.getScreenSize(); 
     int screenwidth = size.width/4; 
     int screenheight= size.height/4; 
     setSize(screenwidth,screenheight); 
     setLocationByPlatform(true); 

     World panel = new World(); 
     panel.setForeground(Color.BLUE); 
     add(panel); 


     setVisible(true); 

    } 
} 

class World extends JComponent{ 
    public void paintComponent(Graphics g) 
    { 
     g.drawString("String1", 70,70); 

    } 

    public void paint(Graphics c) 
    { 
     Font font = new Font("Arial",Font.BOLD,16); 
     c.setFont(font); 
     c.drawString("String2", 30, 40); 
    } 
} 

Я не понимаю действия моего второго класса под названием «Мир». Я ожидал, что у меня есть как String1, так и String2, но в моем окне я вижу только String2. Какова причина ?

+0

По этой причине вы должны избегать «крашения». Вы нарушили цепочку лакокрасочных покрытий, чтобы не вызывать «paintComponent». Также помните, что 'JComponent' прозрачен по умолчанию, поэтому вызывать вызовы' super.paintComponent' не вызовет проблем. Взгляните на [Выполнение пользовательской живописи] (http://docs.oracle.com/javase/tutorial/uiswing/painting/) и [Живопись в AWT и Swing] (http://www.oracle.com/technetwork/ java/painting-140037.html) для получения дополнительной информации ... – MadProgrammer

ответ

2

Возможно, потому, что метод paint() родительского класса обычно вызывает метод paintComponent(). Поскольку вы переопределяете метод paint() и не вызываете super.paint(), он больше не достигает кода, который вызывает paintComponent().

Есть другие вещи в методе paint(), с которыми вам не следует вставлять, так что обычно рекомендуется переопределять paintComponent().

+0

И даже тогда вызовите 'super.paintComponent()' – Sinkingpoint

+2

+1, см. раздел из учебника Swing по [Более внимательному взгляду на механизм рисования] (http: //docs.oracle.com/javase/tutorial/uiswing/painting/closer.html). Прочтите весь раздел, чтобы привести примеры правильного способа создания пользовательской картины. – camickr

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