简体   繁体   English

在另一个组件内绘制组件

[英]Painting component inside another component

I've got a task to display painted 'eyes' with menu buttons to change their colors, and background color. 我有一个任务是用菜单按钮显示画出的“眼睛”,以改变它们的颜色和背景颜色。 Next animate them. 接下来动画他们。 But currently I'm stuck at painting, sinc in my JFrame I've Created JPanel containing panels with drawn eyes and buttons. 但是目前我仍然坚持绘画,在我的JFrame中使用sinc我创建了包含带有绘制眼睛和按钮的面板的JPanel。 Buttons are rendered properly but my eyes canvas is not shown. 按钮被正确渲染但我的眼睛画布没有显示。 I've tried changing paint to paintComponent, setting contentPane differently but still nothing works. 我已经尝试将paint更改为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);
    }
}

This is what I should get : alt text http://img175.imageshack.us/img175/6420/eyes1.jpg This is what I have : alt text http://img132.imageshack.us/img132/827/eyes2i.jpg 这就是我应该得到的: alt text http://img175.imageshack.us/img175/6420/eyes1.jpg这就是我所拥有的: alt text http://img132.imageshack.us/img132/827/eyes2i。 JPG

When I've tried painting it directly in JFrame it works almost perfect, apart of background not being set. 当我尝试在JFrame中直接绘制它时,它的工作几乎完美,除了背景没有被设置。 Why setBackgroundColor doesn't influence my drawing in any way ? 为什么setBackgroundColor不会以任何方式影响我的绘图?

Eyes class is already a panel. Eyes类已经是一个小组。 You don't need this additional panel: JPanel eyes = new JPanel(); 你不需要这个额外的面板: JPanel eyes = new JPanel();

Make it like this: 像这样:

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);

You could also make it work with your additional panel. 您还可以使用其他面板。 Just set the preferred size of the e panel. 只需设置e面板的首选大小即可。

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

The painting code in your Eyes panel is incorrect: “眼睛”面板中的绘画代码不正确:

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

should be: 应该:

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

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM