2016-10-27 9 views
0

Je travaille sur un travail de devoirs où je suis censé faire un programme qui te permet de peindre des formes et des lignes faites sur commande, et les déplace autour de l'écran. À l'origine, j'utilisais la peinture de vide publique (g) pour peindre, mais les formes scintillaient lorsque j'appelais repeindre. À cause de cela, je suis passé à paintComponent (g) à cause de cela. Cependant quand j'essaye de peindre une forme rien ne se montre. Je crois que c'est parce qu'il ne peint pas sur mon Jpanel.PaintComponent ne peignant pas sur JPanel [Homework]

mon cadre a 3 Jpanels dans un borderLayout à 3 rangées.

[Bouton JPanel]

[Draw Box JPanel]

[Coordinate JPanel]

Le panneau, je voudrais attirer sur est le tirage Box JPanel naturellement.

Voici le code que j'ai actuellement

import java.awt.BorderLayout; 
import java.awt.Color; 
import java.awt.Dimension; 
import java.awt.Graphics; 
import java.awt.GridLayout; 
import java.awt.event.ActionEvent; 
import java.awt.event.ActionListener; 
import java.awt.event.MouseEvent; 
import java.awt.event.MouseListener; 
import java.awt.event.MouseMotionListener; 

import javax.swing.JButton; 
import javax.swing.JCheckBox; 
import javax.swing.JComboBox; 
import javax.swing.JFrame; 
import javax.swing.JLabel; 
import javax.swing.JMenuBar; 
import javax.swing.JPanel; 

public class Main extends JPanel implements ActionListener, MouseListener, MouseMotionListener { 

private String colors[] = { "Black", "Red", "Orange", "Yellow", "Green", "Blue" }; 
private String shapes[] = { "Ellipse", "Line", "Rectangle" }; 
private JMenuBar toolBar; // flow layout? OR box layout x-Axis 
private JPanel drawBox; 
private JPanel coordBox; 
private JLabel coords; 
private JButton undo = new JButton("Undo"); 
private JButton clear = new JButton("Clear"); 
private JComboBox color = new JComboBox(colors); 
private JComboBox shape = new JComboBox(shapes); 
private JCheckBox fill = new JCheckBox("Filled"); 

public Main() { 
JFrame frame = new JFrame("Paint"); 
frame.setSize(400, 600); 
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
frame.setLocationRelativeTo(null); 
frame.setVisible(true); 
frame.setLayout(new BorderLayout()); 

/* 
* SETUP TOOLBAR 
*/ 
toolBar = new JMenuBar(); 
toolBar.setLayout(new GridLayout(1, 5)); 
toolBar.add(undo); 
toolBar.add(clear); 
toolBar.add(color); 
toolBar.add(shape); 
toolBar.add(fill); 

/* 
* ADD ACTION LISTENERS TO BUTTONS 
*/ 
undo.addActionListener(this); 
clear.addActionListener(this); 
color.addActionListener(this); 
shape.addActionListener(this); 
fill.addActionListener(this); 

/* 
* SETUP DRAW BOX 
*/ 
drawBox = new JPanel(); 
drawBox.setOpaque(true); 
drawBox.setPreferredSize(new Dimension(600, 400)); 
drawBox.addMouseListener(this); 
drawBox.addMouseMotionListener(this); 

/* 
* SETUP COORDINATES 
*/ 
coords = new JLabel(); 
coordBox = new JPanel(); 

coordBox.setBackground(new Color(211, 211, 211)); 
coordBox.setPreferredSize(new Dimension(drawBox.getWidth(), 25)); 

coords.setText("Coords: [0,0]"); 
coords.addMouseMotionListener(this); 

coordBox.add(coords); 

/* 
* ADD TO FRAME 
*/ 

frame.add(toolBar, BorderLayout.NORTH); 
frame.add(drawBox, BorderLayout.CENTER); 
frame.add(coordBox, BorderLayout.SOUTH); 

frame.pack(); 

} 

public static void main(String[] args) { 
Main m = new Main(); 
} 

public void paintComponent(Graphics g) { 
// super.paintComponent(g); 
g.setColor(Color.BLACK); 
g.fillRect(300, 300, 100, 100); 

} 

@Override 
public void actionPerformed(ActionEvent e) { 
if (e.getSource() == undo) { 
    System.out.println("Undo Last"); 
} 

if (e.getSource() == clear) { 
    System.out.println("clearing screen"); 
} 
// COLOR DROP DOWN BOX 
if (e.getSource() == color) { 
    JComboBox cb = (JComboBox) e.getSource(); 
    String selected = (String) cb.getSelectedItem(); 
    switch (selected) { 

    case "Red": 
    System.out.println("switching to color red"); 
    //ellipse.setColor(Color.RED); 

    break; 

    case "Orange": 
    System.out.println("switch to coor orange"); 
    //ellipse.setColor(Color.ORANGE); 
    break; 
    case "Yellow": 
    System.out.println("switching to color yellow"); 
    break; 
    case "Green": 
    System.out.println("Switching to green"); 
    //ellipse.setColor(Color.GREEN); 

    break; 
    case "Blue": 
    System.out.println("Switching to blue"); 
    break; 
    default: 
    System.out.println("NOthing selected"); 
    break; 
    } 
} 
// SHAPE DROP DOWN BOX 
if (e.getSource() == shape) { 
    JComboBox cb = (JComboBox) e.getSource(); 
    String selected = (String) cb.getSelectedItem(); 
    switch (selected) { 
    case "Ellipse": 
    System.out.println("switching to ellipse"); 
    break; 
    case "Line": 
    System.out.println("switch to line"); 
    break; 
    case "Rectangle": 
    System.out.println("switching to rectangle"); 
    break; 

    default: 
    System.out.println("NOthing selected"); 
    break; 
    } 
} 

if (e.getSource() == fill) { 
    JCheckBox cb = (JCheckBox) e.getSource(); 
    if (cb.isSelected()) { 
    System.out.println("Fill shape"); 
    //ellipse.setFilled(true); 
    } else { 
    System.out.println("Empty shape"); 
    //ellipse.setFilled(false); 
    } 
} 

} 

@Override 
public void mouseClicked(MouseEvent arg0) { 
// System.out.println("Mouse clicked"); 

} 

@Override 
public void mouseEntered(MouseEvent e) { 
System.out.println("Mouse entered"); 
} 

@Override 
public void mouseExited(MouseEvent arg0) { 
coords.setText("Coords: N/A"); 

} 

@Override 
public void mousePressed(MouseEvent arg0) { 
System.out.println("Mouse pressed"); 

} 

@Override 
public void mouseReleased(MouseEvent arg0) { 
System.out.println("Mouse Released"); 

} 

@Override 
public void mouseDragged(MouseEvent e) { 
coords.setText("Coords: [" + e.getX() + "," + e.getY() + "]"); 
} 

@Override 
public void mouseMoved(MouseEvent e) { 
coords.setText("Coords: [" + e.getX() + "," + e.getY() + "]"); 
// repaint(); 
// revalidate(); 

} 

}

Répondre

4

Votre classe principale étend JPanel, a une méthode paintComponent - mais vous n'ajoutez une instance de principal à l'interface graphique, au lieu vous ajoutez un JPanel plain-vanilla, drawBox à l'interface graphique, et bien sûr paintComponent ne sera jamais appelé.

Solution: ajoutez Main ou this à l'interface graphique, pas un simple JPanel.

+0

Merci, cela a semblé fonctionner. Je me suis débarrassé du drawBox JPanel tous ensemble et j'ai ajouté 'ceci' au cadre à la place. – GreenFerret95

2

Le panneau sur lequel je voudrais dessiner est le Draw Box JPanel naturellement.

drawBox = new JPanel(); 

Eh bien, vous n'avez pas modifié la méthode paintComponent(...) de votre panneau « drawBox » donc pas de peinture se produira. De plus, chaque fois que vous avez besoin d'invoquer super.paintComponent (...) au début de votre méthode paintComponent (...).

Consultez Custom Painting Approaches pour des exemples pratiques des deux méthodes courantes de peinture personnalisée.