Компонент рисования внутри другого компонента - PullRequest
3 голосов
/ 30 мая 2010

У меня есть задача отобразить нарисованные «глаза» с помощью кнопок меню, чтобы изменить их цвет и цвет фона. Далее оживите их. Но в настоящее время я застрял в рисовании, потому что в моем 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);
    }
}

Вот что я должен получить: альтернативный текст http://img175.imageshack.us/img175/6420/eyes1.jpg Вот что у меня есть: альтернативный текст http://img132.imageshack.us/img132/827/eyes2i.jpg

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

Ответы [ 2 ]

3 голосов
/ 30 мая 2010

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));
1 голос
/ 30 мая 2010

Код рисования на вашей панели Eyes неверен:

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

должно быть:

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