2010-01-01 5 views
4

Как я могу указать метод рисования для рисования фона только на JPanel, а не на всем JFrame. Размер моего JFrame больше, чем JPanel. Когда я пытаюсь рисовать фон сетки для JPanel, сетка, кажется, нарисована по всему JFrame, а не только JPanel.Paint background of JPanel

Вот часть кода:

public class Drawing extends JFrame { 
    JPanel drawingPanel; 
    ........... 
    public Drawing(){ 
    drawingPanel = new JPanel(); 
    drawingPanel.setPreferredSize(new Dimension(600,600)); 
    } 


public void paint(Graphics g) 
{ 
    super.paintComponents(g); 
    Graphics2D g2 = (Graphics2D) g; 
    g2.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON); 

    paintBackground(g2); //call a METHOD to paint the for JPANEL 
} 


private void paintBackground(Graphics2D g2) 
{ 
    g2.setPaint(Color.GRAY); 
    for (int i = 0; i < drawingPanel.getSize().width; i += 300) 
    { 
    Shape line = new Line2D.Float(i, 0, i, drawingPanel.getSize().height); 
    g2.draw(line); 
    } 

    for (int i = 0; i < drawingPanel.getSize().height; i += 300) 
    { 
    Shape line = new Line2D.Float(0, i, drawingPanel.getSize().width, i); 
    g2.draw(line); 
    }  
} //END private void paintBackground(Graphics2D g2) 

} 
+1

Я дал вам правильный ответ, но вы его не принимаете. Полезно знать о будущем. – camickr

ответ

3

camickr правильный. Таким образом:

public class Drawing extends JFrame { 
    JPanel drawingPanel; 
    ........... 
    public Drawing(){ 
    drawingPanel = new MyPanel(); 
    drawingPanel.setPreferredSize(new Dimension(600,600)); 
    add(drawingPanel); 
    } 
} 

public class MyPanel extends JPanel { 
    public void paintComponent(Graphics g) { 
    super.paintComponent(g); 
    Graphics2D g2 = (Graphics2D) g; 
    g2.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON); 

    myBackgroundRoutine(g2); 
    } 
} 

Необходимо строго отделить рисунок от разных компонентов. Swing уже управляет подкомпонентами, поэтому нет абсолютно никакой необходимости реализовывать чертежи в вашей панели в кадре (вызов paintComponents() является серьезной ошибкой). И вы никогда не должны переопределять paint(), потому что в Swing используется только paintComponent() . Не смешивайте оба, пока вы не узнаете, что делаете.

+0

Спасибо Thorsten. – Jessy

0
super.paintComponents(g); 

Я хотел бы предложить в качестве первой точки исследования.

+0

спасибо, я пробовал это, однако, поскольку моя программа включала рисование с помощью перетаскивания мышью, мне нужно, чтобы super.paintComponents (ы) удалили след предыдущего рисунка, когда я перетаскиваю мой чертеж в новое место. – Jessy

5

Если вы хотите сделать рисование на JPanel, тогда переопределите JPanel, а не JFrame.

Вы должны переопределить метод paintComponent() JPanel. Прочтите раздел из учебника Swing по Custom Painting для рабочего примера.

+0

Спасибо за ссылку – Jessy

0

Код, который вы отправили, не является полным, его не хватает, как панель добавляется в JFrame и какой LayoutManager используется.
Правильность кодовых швов. Вы уверены, что JPanel не занимает весь JFrame? Добавьте System.out.println(drawingPanel.getSize()), чтобы проверить это.
Если вы используете BorderLayout, по умолчанию для JFrame, и только что добавили панель без каких-либо ограничений, панель будет использовать всю площадь. Предпочтительный размер игнорируется.
Попробуйте это, только для тестирования:

public Drawing(){ 
    drawingPanel = new JPanel(); 
    drawingPanel.setPreferredSize(new Dimension(600,600)); // ignored 
    drawingPanel.setBounds(0, 0, 600, 600); // location and size 
    setLayout(null); 
    add(drawingPanel); 
} 

но ИМО это не самый лучший и правильный способ сделать это. Я предпочел бы переопределить метод paintComponent() от JPanel, как это было предложено Торстеном и камикром.
Но он по-прежнему будет использовать всю область JFrame, пока не будет добавлен другой компонент в JFrame или LayoutManager.

0

Вы должны переопределить JPanel, а не JFrame для рисования. Вы можете переопределить метод paintComponent() JPanel