ProsteRysowanie= dziura w panelu.

0

To raczej zabawowy program. Przy przytrzymaniu myszki maluje dany kształt, taki prosty pędzel mozna rzec. Ale trafiłem na taką małą przeszkodę, mianowicie po wstawienu panelu do ramki metodą setBounds w panelu powstaje "dziura" z lewej i gornej strony panelu , po ktorej nie mozna "rysowac" a panel na oko jest większy niz zadeklarowany(400,400). Tak na oko to grubosc tej dziury jest taka, jaka jest odlegosc panelu od gornego i lewegu brzegu ramki.

import javax.swing.*;
import java.awt.*;
import java.awt.event.*;
import java.util.*;


public class Main {

   
    public static void main(String[] args) {

      SwingUtilities.invokeLater(new Runnable(){
          public void run(){
              createAndShowGUI();
          }
      });
    }
    public static void createAndShowGUI(){
        JFrame f = new JFrame("Oval");
        f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        f.setSize(500,500);
        f.setBackground(Color.gray);
        f.setLocationRelativeTo(null);
        f.setVisible(true);
        MyPanel panel = new MyPanel();
        f.setLayout(null);
        f.add(panel);
        f.setResizable(true);
        

    }

}
class MyPanel extends JPanel{
    ArrayList<Rectangle> ovals = new ArrayList<Rectangle>();
    Rectangle current = null;
    public MyPanel(){
       
       setBackground(Color.WHITE);
       this.setBounds(50,50, 400,400);
        setBorder(BorderFactory.createLineBorder(Color.BLACK, 1));

        addMouseListener(new MouseAdapter(){
            @Override
            public void mousePressed(MouseEvent e){
                addRect(e.getX(),e.getY());
            }
        });
           addMouseMotionListener(new MouseAdapter(){
            @Override
            public void mouseDragged(MouseEvent e){
                addRect(e.getX(),e.getY());
            }
        });

    }
         
         
       @Override
    public void paintComponent(Graphics g){
        super.paintComponent(g);
        
           for (Rectangle r : ovals)
            r.paintOval(g);
         
}
       public void addRect(int x, int y){

             int offset = 1;
             current = new Rectangle();
             current.setX(x);
             current.setY(y);
            ovals.add(current);
             repaint(getX(),getY(),getWidth()+offset, getHeight()+offset);

}

}
class Rectangle{
    private int px;
    private int py;
    private int width=20;
    private int height=20;
    public int getX(){
        return px;
    }
    public int getY(){
        return py;
    }
    public void setX( int px){
        this.px=px;
    }
     public void setY( int py){
        this.py=py;
    }
    public int Width(){
        return width;
    }
    public int Height(){
        return height;
    }

    public void paintOval(Graphics g){
        g.setColor(Color.MAGENTA);
        g.fillOval(px,py,width,height);
        g.setColor(Color.MAGENTA);
        g.drawOval(px, py, width, height);

    }


    }

Wdzięczny byłbym za podpowiedź, czemu tak się dzieje :p.

0
zergburger napisał(a)
             repaint(getX(),getY(),getWidth()+offset, getHeight()+offset);

Wdzięczny byłbym za podpowiedź, czemu tak się dzieje :p.

Z tym repaintem spieprzyłeś..

             repaint(current.getX(),current.getY(),current.getWidth(), current.getHeight());
0

szczerze to nie wiem , czemu :(

może spróbuj w inny sposób :). Za pomocą klasy NewJFrame dziedziczącej po JFrame. W zakładce *Design * są komponenty wybierz sobie :
jDesktopPane1 i wykonaj obsługę zdarzenia MouseMoved.

Kod przedstawia się w następujący sposób:


import java.awt.Color;



public class NewJFrame extends javax.swing.JFrame {

    private java.awt.Graphics rysuj;

    public NewJFrame() {
        initComponents();
    }

    @SuppressWarnings("unchecked")
    // <editor-fold defaultstate="collapsed" desc="Generated Code">
    private void initComponents() {
/* 
 ciało adnotacji ,wygenerowana się przez wybranie JFrame Form
*/
        pack();
    }// </editor-fold>

    private void jDesktopPane1MouseMoved(java.awt.event.MouseEvent evt) {
     
        rysuj = (java.awt.Graphics) jDesktopPane1.getGraphics();  // poinformowanie , że będziesz rysował na jDesktopPane1

        Color kolor = java.awt.Color.red; //wybór koloru
        rysuj.setColor(kolor); //wstawienie koloru
        rysuj.fillOval(evt.getX(), evt.getY(), 10, 10);  // rysowanie 
    }

 
    public static void main(String args[]) {
        java.awt.EventQueue.invokeLater(new Runnable() {

            public void run() {
                new NewJFrame().setVisible(true);
            }
        });
    }
    private javax.swing.JDesktopPane jDesktopPane1;
   
}
0

Ok, dzięki Kerai, faktycznie , przeoczyłem :)

1 użytkowników online, w tym zalogowanych: 0, gości: 1