2010-05-30 4 views
3

У меня есть задача отобразить нарисованные «глаза» с помощью кнопок меню, чтобы изменить их цвета и цвет фона. Затем оживите их. Но в настоящее время я застрял в живописи, в моем JFrame, я создал JPanel, содержащий панели с нарисованными глазами и кнопками. Кнопки отображаются правильно, но мой холст не показан. Я пробовал менять краску на paintComponent, устанавливая contentPane по-другому, но все равно ничего не работает.Окрасочный компонент внутри другого компонента

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

public class Main extends JFrame { 

    public static void main(String[] args) { 
     final JFrame frame = new JFrame("Eyes"); 
     frame.setPreferredSize(new Dimension(600, 450)); 
     frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 

     JPanel players = new JPanel(new GridLayout(1, 3)); 
       players.add(new JButton("Eyes color")); 
       players.add(new JButton("Eye pupil")); 
       players.add(new JButton("Background color")); 

     JPanel eyes = new JPanel(); 
     Eyes e = new Eyes(); 
     eyes.add(e); 
     eyes.setPreferredSize(new Dimension(600, 400)); 

     JPanel content = new JPanel(); 
     content.setLayout(new BoxLayout(content, BoxLayout.Y_AXIS)); 
     frame.setContentPane(content); 
     content.add(players); 
     content.add(eyes); 

//  frame.getContentPane().add(content); 
     frame.pack(); 
    frame.setVisible(true); 

    } 
} 

class Eyes extends JPanel { 

    public Eyes(){  
    } 

    public void paint(Graphics g) { 
     super.paintComponent(g); 
     Graphics2D g2d = (Graphics2D) g; 
     g2d.setRenderingHint(RenderingHints.KEY_ANTIALIASING,RenderingHints.VALUE_ANTIALIAS_ON); 
     BasicStroke bs = new BasicStroke(3.0f); 
     g2d.setBackground(Color.green); 
     g2d.setStroke(bs); 
     g2d.setColor(Color.yellow); 
     g2d.fillOval(50, 150, 200, 200); 
     g2d.fillOval(350, 150, 200, 200); 
     g2d.setColor(Color.BLACK); 
     g2d.drawOval(49, 149, 201, 201); 
     g2d.drawOval(349, 149, 201, 201); 
     g2d.fillOval(125, 225, 50, 50); 
     g2d.fillOval(425, 225, 50, 50); 
    } 
} 

Это то, что я должен получить: alt text http://img175.imageshack.us/img175/6420/eyes1.jpg Это то, что у меня есть: alt text http://img132.imageshack.us/img132/827/eyes2i.jpg

Когда я попытался картины непосредственно в JFrame она работает почти идеально, кроме фона не установлен , Почему setBackgroundColor никак не влияет на мой рисунок?

ответ

3

Eyes класс - это уже панель. Вам не нужна эта дополнительная панель: JPanel eyes = new JPanel();

Сделать это следующим образом:

Eyes eyes = new Eyes(); 
eyes.setPreferredSize(new Dimension(600, 400)); 

JPanel content = new JPanel(); 
content.setLayout(new BoxLayout(content, BoxLayout.Y_AXIS)); 
frame.setContentPane(content); 
content.add(players); 
content.add(eyes); 

Вы также могли бы заставить его работать с дополнительной панелью. Просто установите предпочтительный размер панели e.

JPanel eyes = new JPanel(); 
Eyes e = new Eyes(); 
eyes.add(e); 
e.setPreferredSize(new Dimension(600, 400)); 
eyes.setPreferredSize(new Dimension(600, 400)); 
+0

и вы знаете, почему установка фона не работает? –

+0

ОК, нашел его сам в документах. –

+0

Из документа Java: «Установка цвета фона в контексте Graphics2D влияет только на последующие вызовы clearRect, а не на цвет фона компонента. Чтобы изменить фон Компонента, используйте соответствующие методы Компонента». –

1

Роспись код в панели Eyes неправилен:

public void paint(Graphics g) { 
     super.paintComponent(g); 

должно быть:

public void paintComponent(Graphics g) { 
     super.paintComponent(g); 
Смежные вопросы