2012-04-13 4 views
2

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

если вы раскомментируете //frame.getContentPane().add(rect); // Рисуем если его в кадре и comment frame.getContentPane(). Add (panel); // но не в панели прямоугольник будет рисовать.

Спасибо за помощь.

import java.awt.Color; 
import java.awt.Dimension; 
import java.awt.Graphics; 
import java.awt.Graphics2D; 

import javax.swing.JComponent; 
import javax.swing.JFrame; 
import javax.swing.JPanel; 

public class DrawingRect{ 

    public static void main(String[] args) { 
     DrawingRect d = new DrawingRect(); 
    } 

    public DrawingRect(){ 

    JFrame frame = new JFrame("Drawing a rect"); 
    frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
    frame.setPreferredSize(new Dimension (500,500)); 

    Rect rect = new Rect(); 

    JPanel panel = new JPanel(); 
    panel.setPreferredSize(new Dimension (500,500)); 
    panel.setVisible(true); 

    panel.add(rect); 

    //frame.getContentPane().add(rect); //Will draw if its in the frame 
    frame.getContentPane().add(panel); // but not in the panel 


    frame.pack(); 
    frame.setVisible(true); 



    panel.repaint(); 
    frame.repaint(); 



    } 

    public class Rect extends JComponent{ 

    private static final long serialVersionUID = 1L; 

     public void paint(Graphics g) 
     { 
      g.setColor(Color.black); 
      g.drawRoundRect(10, 10, 100, 100, 20, 20); 
     } 
    } 

} 
+0

Попробуйте поместить его в 'paintComponent' вместо' paint', а может быть, и не попытаться сделать все в конструкторе ... –

ответ

4

Ваш Rect рисует хорошо, но он очень маленький! Для того, чтобы увидеть, что я имею в виду, показать ее размер после того, как оно было вынесено:

Rect rect = new Rect(); 
    rect.setBorder(BorderFactory.createTitledBorder("rect")); 

    JPanel panel = new JPanel(); 
    panel.setPreferredSize(new Dimension(500, 500)); 
    panel.setVisible(true); 

    panel.add(rect); 

    // frame.getContentPane().add(rect); //Will draw if its in the frame 
    frame.getContentPane().add(panel); // but not in the panel 

    frame.pack(); 
    frame.setVisible(true); 

    System.out.println(rect.getSize()); 

Вы получите что-то вроде:

java.awt.Dimension[width=1,height=1] 

Значение это только 1 пиксель на 1 пиксель - слишком мал, чтобы видеть.

Решение состоит в том, чтобы использовать правильные макеты и придать ему предпочтительный размер, чтобы он отображался. например,

public class Rect extends JComponent { 

     private static final long serialVersionUID = 1L; 
     private static final int PREF_W = 150; 
     private static final int PREF_H = 150; 

     @Override 
     // public void paint(Graphics g) { 
     protected void paintComponent(Graphics g) { 
     super.paintComponent(g); 
     g.setColor(Color.black); 
     g.drawRoundRect(10, 10, 100, 100, 20, 20); 
     } 

     @Override 
     public Dimension getPreferredSize() { 
     return new Dimension(PREF_W, PREF_H); 
     } 
    } 

Также нарисуйте с помощью метода paintComponent от JComponent, а не с его методом рисования.

+1

Я как раз собирался опубликовать это, избил меня. +1 – Jeffrey

+0

@jeffrey: Упс, и извините! –

+0

спасибо! :) его единственная крошечная часть моей диссертации, но вы спасли меня много времени/проблем/сна. ect – Andrew

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