在另一个组件内绘制组件

Posted

技术标签:

【中文标题】在另一个组件内绘制组件【英文标题】:Painting component inside another component 【发布时间】:2011-02-25 16:00:00 【问题描述】:

我的任务是用菜单按钮显示画过的“眼睛”,以更改它们的颜色和背景颜色。接下来为它们设置动画。但目前我被困在绘画中,在我的 JFrame 中,我创建了 JPanel,其中包含带有绘制的眼睛和按钮的面板。按钮已正确渲染,但未显示我的眼睛画布。我尝试将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);
    

这是我应该得到的: alt text http://img175.imageshack.us/img175/6420/eyes1.jpg 这就是我所拥有的: alt text http://img132.imageshack.us/img132/827/eyes2i.jpg

当我尝试直接在 JFrame 中绘制它时,它几乎可以完美运行,除了没有设置背景。为什么 setBackgroundColor 不会以任何方式影响我的绘图?

【问题讨论】:

【参考方案1】:

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

【讨论】:

来自 Java doc:“在 Graphics2D 上下文中设置背景颜色只会影响后续的 clearRect 调用,不会影响组件的背景颜色。要更改组件的背景,请使用组件的适当方法。”【参考方案2】:

您的眼睛面板中的绘画代码不正确:

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

应该是:

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

【讨论】:

以上是关于在另一个组件内绘制组件的主要内容,如果未能解决你的问题,请参考以下文章

将一个组件显示在另一个组件之上

Vue.js 在另一个组件中的一个组件中使用变量

Angular 2,RC5 路由器插座在另一个路由器插座内

在另一个组件中渲染一个组件

Angular - 在另一个组件中动态注入一个组件

Angular7 - 在另一个组件中注入组件