2013-07-12 2 views
0

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

import java.awt.*; 
import java.awt.event.*; 
import java.awt.geom.Rectangle2D; 
import java.io.File; 
import java.io.IOException; 
import java.util.ArrayList; 
import javax.imageio.ImageIO; 
import javax.swing.*; 

public class Frame { 

    JFrame frame; 
    MyPanel p; 
    Timer t; 
    Icon icon; 

    //contructor 
    public Frame() { 
     frame = new JFrame("Painting"); 

     frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
     initComponents(); 
     frame.add(p); 
     frame.pack(); 
     frame.setVisible(true); 
     t.start(); 

    } 

    private void initComponents() { 

     final ActionListener action = new ActionListener() { 

      @Override 
      public void actionPerformed(ActionEvent evt) { 

       p.repaint(); 
      } 
     }; 
     t = new Timer(50, action); 
     p = new MyPanel(); 

     p.addMouseListener(new MouseAdapter() { 

      @Override 
      public void mouseClicked(MouseEvent e) { 
       p.addEntity(e.getX(), e.getY(), 10, 10, Color.BLACK); 
       System.out.println("clicked"); 
      } 
     }); 

     icon = new ImageIcon("flower.gif"); 
     JLabel label = new JLabel(icon); 
     JScrollPane scrollPane = new JScrollPane(label); 
     p.add(scrollPane, BorderLayout.WEST); 

     p.setBackground(Color.WHITE); 
    } 
} 

class MyPanel extends JPanel { 

    int width = 300, height = 300; 
    ArrayList<MyCircle> entities = new ArrayList<MyCircle>(); 

    void addEntity(int x, int y, int w, int h, Color c) { 
     entities.add(new MyCircle(x, y, w, h, c)); 
    } 

    @Override 
    protected void paintComponent(Graphics grphcs) { 
     super.paintComponent(grphcs); 
     Graphics2D g2d = (Graphics2D) grphcs; 

     g2d.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON); 

     for (MyCircle entity : entities) { 
      g2d.setColor(entity.getColor()); 
      g2d.fillOval((int) entity.x, (int) entity.y, (int) entity.width, (int) entity.height); 
     } 
    } 

    //frame dimesion 
    @Override 
    public Dimension getPreferredSize() { 
     return new Dimension(width, height); 
    } 
} 

//create the circle 
class MyCircle extends Rectangle2D.Double { 

    Color color; 

    public MyCircle(double x, double y, double w, double h, Color c) { 
     super(x, y, w, h); 
     color = c; 

    } 

    public void setColor(Color color) { 
     this.color = color; 
    } 

    public Color getColor() { 
     return color; 
    } 
} 
+0

1) Для лучшей помощи раньше, опубликовать [SSCCE] (http://sscce.org/). 2) * «Можете ли вы, пожалуйста, помогите мне». * Добавьте вопросительный знак к вопросам и сделайте их конкретными. Я до сих пор не знаю, с чем вам нужна помощь. –

+0

Я хочу нарисовать изображение, доступное в JFrame, не на фактическом фоне. и благодарю вас за помощь. – user2489592

ответ

0

The MouseListener используется в вопросе не зарегистрирован для JLabel. Вместо попытку создать дубликат пользовательской логику краски для для JLabel, вы можете просто прочитать Image при запуске и включить его в существующей логике пользовательских краски:

Например

public MyPanel(Image image) { 
    this.image = image; 
} 

@Override 
protected void paintComponent(Graphics grphcs) { 
    super.paintComponent(grphcs); 
    grphcs.drawImage(image, 0, 0, this); 
    ... 
} 
Смежные вопросы