2015-11-23 4 views
0

Я пытаюсь запустить программу с выделенной шляпой jcheckbox и отображать прямоугольник, тогда прямоугольник исчезает, когда флажок не выбран и перерисовывается по мере выбора флажка. Когда я запускаю программу и устанавливаю флажок, появляется или появляется флажок напротив рамки.Панель не отображается в окне

import java.awt.Color; 
import java.awt.Graphics; 
import java.awt.event.ItemEvent; 
import java.awt.event.ItemListener; 
import javax.swing.*; 

public class Head extends JPanel { 

JCheckBox hat; 

public Head() { 
    hat = new JCheckBox("Hat"); 
    hat.setSelected(true); 
    hat.addItemListener(new CheckSelection()); 

    add(hat); 
} 

class CheckSelection implements ItemListener { 

    public void itemStateChanged(ItemEvent ie) { 
     repaint(); 
    } 
} 


public void paintComponent(Graphics g) { 

    setForeground(Color.RED); 
    g.drawOval(110, 100, 100, 100); 
    g.drawOval(130, 120, 20, 15); 
    g.drawOval(170, 120, 20, 15); 
    g.drawLine(160, 130, 160, 160); 
    g.drawOval(140, 170, 40, 15); 
    if (hat.isSelected()) { 
     g.drawRect(100, 90, 120, 10); 
    } 
    } 


public static void main(String[] args) { 
    Head head = new Head(); 
    JFrame f = new JFrame(); 
    f.add(head); 
    f.setSize(400, 400); 
    //f.setLayout(null); 
    f.setVisible(true); 
    f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
} 

}

ответ

2

Вы нарушили лакокрасочную цепь, не вызывая super метода paintComponent «s

@Override 
protected void paintComponent(Graphics g) { 
    super.paintComponent(g); 
    setForeground(Color.RED); 
    g.drawOval(110, 100, 100, 100); 
    g.drawOval(130, 120, 20, 15); 
    g.drawOval(170, 120, 20, 15); 
    g.drawLine(160, 130, 160, 160); 
    g.drawOval(140, 170, 40, 15); 
    if (hat.isSelected()) { 
     g.drawRect(100, 90, 120, 10); 
    } else { 
     setForeground(Color.RED); 
     g.drawOval(110, 100, 100, 100); 
     g.drawOval(130, 120, 20, 15); 
     g.drawOval(170, 120, 20, 15); 
     g.drawLine(160, 130, 160, 160); 
     g.drawOval(140, 170, 40, 15); 
    } 
} 

Graphics контекста представляет собой общий ресурс между компонентами, одна из задач paintComponent должен подготовить Graphics для окраски, как правило, заполняя его цветом фона компонента. Так не в состоянии назвать super.paintComponent означает, что когда-либо ранее окрашена в Graphics контексте все еще будет там

См Painting in AWT and Swing и Performing Custom Painting для получения более подробной информации о том, как покрасочные работы в свинг

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