2015-10-18 5 views
0

У меня есть панель, которая содержит пользовательские компоненты, которые были добавлены к ней. Он красится правильно, за исключением тех случаев, когда компоненты (которые имеют собственные мультилисты) тянутся, он начинает странно рисовать.Родительская панель неправильно перекрашивается

Интересно, если я немного изменить размер родительской панели она теперь будет писать так, как задумано. Я знаю, что родительская панель перерисовки через

super.paintComponent(g); 

и оператор печати внутри панелей

paintComponent(Graphics g): 

метод. Я попытался переустановить, когда компонент перетаскивается (поскольку компонент имеет свои границы повторно), он становится недействительным. Тем не менее у меня нет успеха, и мне было интересно, сможет ли кто-нибудь помочь.

Есть ли место, где я не перекрашиваю правильно, что может вызвать такое поведение?

Также в качестве добавления у меня есть слушатель мыши на панели и ее компонентах, есть ли способ, чтобы при щелчке компонента слушатель панели панели также отвечал (не возвращаясь к родительскому классу из компонент)

Вот рабочий пример вопроса, имеющего я

import java.awt.*; 
import java.awt.event.*; 
import java.awt.geom.Line2D; 
import javax.swing.*; 

public class testHome { 

    private JFrame frame; 

    /** 
    * Launch the application. 
    */ 
    public static void main(String[] args) { 
     EventQueue.invokeLater(new Runnable() { 
      public void run() { 
       try { 
        testHome window = new testHome(); 
        window.frame.setVisible(true); 
       } catch (Exception e) { 
        e.printStackTrace(); 
       } 
      } 
     }); 
    } 

    /** 
    * Create the application. 
    */ 
    public testHome() { 
     initialize(); 
    } 

    /** 
    * Initialize the contents of the frame. 
    */ 
    private void initialize() { 
     frame = new JFrame(); 
     frame.setBounds(100, 100, 450, 300); 
     frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 

     JPanel panel = new myPanel(); 
     frame.getContentPane().add(panel, BorderLayout.CENTER); 
    } 
} 

class myPanel extends JPanel { 

    MyComponent comp; 

    public myPanel() { 
     super(null); 
     comp = new MyComponent(5, 5); 
     this.add(comp); 
     revalidate(); 
    } 

    public void paintComponent(Graphics g) { 
     super.paintComponent(g); 
     Graphics2D g2d = (Graphics2D) g; 
     Line2D.Double line = new Line2D.Double(10, 10, comp.getX(), comp.getY()); 
     System.out.println(comp.getX() + " " + comp.getY()); 
     g2d.draw(line); 
    } 
} 

class MyComponent extends JComponent implements MouseListener, MouseMotionListener { 

    int x; 
    int y; 

    int mx; 
    int my; 

    public MyComponent(int x, int y) { 
     this.setVisible(true); 
     this.setBounds(x, y, 15, 15); 
     this.x = x; 
     this.y = y; 
     addMouseMotionListener(this); 
    } 

    public void paintComponent(Graphics g) { 
     super.paintComponent(g); 
     Graphics2D g2d = (Graphics2D) g; 
     g2d.setColor(Color.black); 
     g2d.fillRect(this.x, this.y, 15, 15); 
    } 

    @Override 
    public void mouseDragged(MouseEvent e) { 
     // TODO Auto-generated method stub 
     System.out.println("dragging"); 
     int dx = e.getX() - mx; 
     int dy = e.getY() - my; 
     this.setBounds(this.getX() + dx, this.getY() + dy, 15, 15); 
    } 

    @Override 
    public void mousePressed(MouseEvent e) { 
     mx = e.getX(); 
     my = e.getY(); 
    } 

    @Override 
    public void mouseMoved(MouseEvent e) {} 

    @Override 
    public void mouseClicked(MouseEvent e) {} 

    @Override 
    public void mouseEntered(MouseEvent e) {} 

    @Override 
    public void mouseExited(MouseEvent e) {} 

    @Override 
    public void mouseReleased(MouseEvent e) {} 
} 
+0

Чтобы лучше помочь, опубликуйте [MCVE] или [Short, Self Contained, Correct Example] (http://www.sscce.org/). –

+0

BTW - если в этой загрузке слов есть вопрос, можете ли вы добавить '?' До конца? –

+0

done & done @AndrewThompson – user3466639

ответ

2

родитель панель фактически не получают автоматически полностью перекрасить. paintComponent() называется, но если вы проверяете вырезку, например:

System.out.println(g.getClipBounds()); 

вы увидите, что только область ниже меньшего компонента окрашивается. (Компонент не является непрозрачным, поэтому родительский компонент должен рисовать область под ним). Вы должны вызвать repaint() явно для родительской панели:

getParent().repaint(); 

(Или используя repaint() варианты, которые определяют область, если родительский компонент является дорогостоящим, чтобы сделать и оптимизировать частичное ничьи).

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

  • Нет связанных вопросов^_^