2013-12-09 3 views
2

Я запрограммировал небольшое приложение для рисования с помощью JMenu, JToolBar и JPanel, проблема в том, что когда я начинаю рисовать на панели, JMenu и JToolBar рисуются на одной панели, а иногда фон панели становится серым, а не белый, вот как это выглядит: java errorpaintComponent() краски jMenu и JToolBar

вот мой код: JFrame код:

public class ArdoiseF extends JFrame { 

private JMenuBar menu = new JMenuBar(); 
private JToolBar toolbar = new JToolBar(); 
private JMenu file = new JMenu("Fichier"); 
private JMenu edit = new JMenu("Edition"); 
private JMenu about = new JMenu("About"); 
private JMenu shape = new JMenu("Forme du curseur"); 
private JMenu color = new JMenu("Couleur du curseur"); 
private JMenuItem clear = new JMenuItem("Effacer"); 
private JMenuItem quit = new JMenuItem("Quitter"); 
private JMenuItem rond = new JMenuItem("Rond"); 
private JMenuItem carre = new JMenuItem("Carre"); 
private JMenuItem rouge = new JMenuItem("Rouge"); 
private JMenuItem bleu = new JMenuItem("Bleu"); 
private JMenuItem noir = new JMenuItem("Noir"); 

private JButton rougeButton = new JButton(new ImageIcon("rouge.jpg")); 
private JButton bleuButton = new JButton(new ImageIcon("bleu.jpg")); 
private JButton noirButton = new JButton(new ImageIcon("noir.jpg")); 
private JButton formecarreeButton = new JButton(new ImageIcon("formecarree.png")); 
private JButton formerondeButton = new JButton(new ImageIcon("formeronde.png")); 

private JPanel container = new JPanel(); 
private PanneauF pan = new PanneauF(); 
private ColorListener cListener = new ColorListener(); 
private ShapeListener shapeListener = new ShapeListener(); 


public ArdoiseF(){ 

    this.setTitle("Paint -_-"); 
    this.setSize(700,500); 
    this.setDefaultCloseOperation(EXIT_ON_CLOSE); 
    this.setLocationRelativeTo(null); 
    initComposants(); 
    this.setVisible(true); 
} 

private void initComposants(){ 
    file.add(clear); 
    file.addSeparator(); 
    file.add(quit); 
    file.setMnemonic('F'); 
     clear.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_N,KeyEvent.CTRL_DOWN_MASK)); 
     quit.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_W,KeyEvent.CTRL_DOWN_MASK)); 

    shape.add(rond); 
    shape.add(carre); 
    color.add(rouge); 
    color.add(bleu); 
    color.add(noir); 

    edit.add(shape); 
    edit.add(color); 
    edit.setMnemonic('E'); 

    menu.add(file); 
    menu.add(edit); 


    toolbar.add(formecarreeButton); 
    toolbar.add(formerondeButton); 
    toolbar.addSeparator(); 
    toolbar.add(noirButton); 
    toolbar.add(rougeButton); 
    toolbar.add(bleuButton); 

    clear.addActionListener(new ClearListener()); 
    rougeButton.addActionListener(cListener); 
    bleuButton.addActionListener(cListener); 
    noirButton.addActionListener(cListener); 
    rouge.addActionListener(cListener); 
    bleu.addActionListener(cListener); 
    noir.addActionListener(cListener); 
    formecarreeButton.addActionListener(shapeListener); 
    formerondeButton.addActionListener(shapeListener); 
    carre.addActionListener(shapeListener); 
    rond.addActionListener(shapeListener); 

    container.setLayout(new BorderLayout()); 
    container.add(toolbar,BorderLayout.NORTH); 
    container.add(pan,BorderLayout.CENTER); 
    this.setContentPane(container); 

    this.setJMenuBar(menu); 

} 


class ClearListener implements ActionListener{ 

    public void actionPerformed(ActionEvent e) { 
     pan.setClean(true); 
     pan.repaint(); 
    } 

} 
class ColorListener implements ActionListener{ 
    public void actionPerformed(ActionEvent e) { 
     if(e.getSource() == rougeButton || e.getSource() == rouge) 
      pan.setColor(Color.red); 
     if(e.getSource() == bleuButton || e.getSource() == bleu) 
      pan.setColor(Color.blue); 
     if(e.getSource() == noirButton || e.getSource() == noir) 
      pan.setColor(Color.black); 
    } 
} 
class ShapeListener implements ActionListener{ 
    public void actionPerformed(ActionEvent e) { 
     if(e.getSource() == formecarreeButton || e.getSource()== carre) 
      pan.setShape("carre"); 
     if(e.getSource() == formerondeButton || e.getSource()== rond) 
      pan.setShape("rond"); 
    } 

} 

} 

JPanel код:

public class PanneauF extends JPanel{ 
private int i=0; 
private int mousex=0,mousey=0; 
private boolean clean=true;; 
private Color color= Color.black; 
private String shape = "rond"; 
ArrayList<Point> points = new ArrayList<Point>(); 


public PanneauF(){ 
    this.addMouseMotionListener(new MouseMotionListener(){ 

     public void mouseDragged(MouseEvent e) { 
      points.add(new Point(e.getX()-7,e.getY()-7,15,color,shape)); 
      repaint(); 

     } 

     public void mouseMoved(MouseEvent arg0) { 

     }  
    }); 
    this.addMouseListener(new MouseListener(){ 

     public void mouseClicked(MouseEvent e) { 

     } 

     public void mouseEntered(MouseEvent e) { 

     } 

     public void mouseExited(MouseEvent e) { 

     } 

     public void mousePressed(MouseEvent e) { 
      points.add(new Point(e.getX()-7,e.getY()-7,15,color,shape)); 
      repaint(); 

     } 

     public void mouseReleased(MouseEvent e) { 

     } 
    }); 
} 
public void paintComponent(Graphics g){ 
    draw(g); 
    if(clean){ 
     g.setColor(Color.white); 
     g.fillRect(0, 0, this.getWidth(), this.getHeight()); 
     clean=false; 
     points = new ArrayList<Point>(); 
    } 
} 

private void draw(Graphics g){ 
    for (Point p: this.points){ 
     g.setColor(p.getColor()); 
     if(p.getType()=="rond") 
      g.fillOval(p.getPosx(), p.getPosy(), 10, 10); 

     else{ 
       g.fillRect(p.getPosx(), p.getPosy(), 10, 10); 
     } 
    } 
} 
public void setClean(boolean c){ 
    this.clean = c; 
} 
public void setColor(Color c){ 
    this.color = c; 
} 
public void setShape(String S){ 
    this.shape=S; 
} 


} 
+0

Чтобы лучше помочь, опубликуйте [SSCCE] (http://sscce.org/). –

+0

панель нарушает контракт с непрозрачностью: либо вызовите super в pointComponent, либо установите ее непрозрачность на false. Для получения дополнительной информации см. Статью о живописи в качелях (ссылка на вики wing) – kleopatra

ответ

1

При перерисовке панели вы действительно должны перерисовать все. Начните с очистки, а затем перейдите и добавьте все свои очки.

Прямо сейчас, кажется странным, так как вы рисуете все точки, а потом иногда, но иногда иногда это очищаете?

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

+0

Проблема решена, мне просто нужно было очистить панель и перерисовать мои очки, спасибо! – FrankelStein

0

У меня была та же проблема. Поместите JMenuBar в JFrame. Используйте JPanel только для рисования. Надеюсь, это поможет.

3

Просто введите super.paintComponent(g); в начале вашего метода public void paintComponent(Graphics g) в ваш PanneauF.

Подробнее о customPaintings.

+0

Спасибо! он работает, но все же фон становится серым, когда я что-то рисую. – FrankelStein

+0

Добро пожаловать, я не могу получить проблемы с серым bachground (. – alex2410

+0

Обычно фон белый, он становится серым, когда я рисую точку на нем, я делал то, что запросил Тим Б, и он работает :), у меня есть один больше вопрос, почему рисунок медленно? например, когда я рисую линию, это явно сделано точками, далекими друг от друга, мне нужно рисовать медленно, чтобы он выглядел как настоящая строка, это не похоже на краску окон, фотошоп или любой другой инструмент рисования – FrankelStein

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