在嵌套的JPanels上绘制组件(Java)

时间:2012-03-15 17:33:38

标签: java swing jpanel

任何人都知道如何在JPanel中的JPanel上画一个圆圈?

基本上我在另一个中有JPanel,我创建了一个扩展JComponent的新Circle类。然后我将其添加到其中一个面板并尝试重新绘制,但没有任何显示。有任何想法吗?继承我的代码:

      class Circle extends JComponent 
{       
    @Override     public void paintComponent(Graphics g)
{
        super.paintComponent(g);
        g.drawOval(10,10, 11, 11);
        g.setColor(Color.RED);
        g.fillOval(10,10, 11, 11);                  
  } 
}


public void drawTest()
{
    Circle circle = new Circle();
    circle.setOpaque(false);
    circle.setSize(22, 22);
    circle.setVisible(true);
    circle.setBounds(11,11,11,5);
    jpanel.add(circle); 
    jpanel.repaint();

}

当我将圆圈添加到主面板[add(circle)]但拒绝任何子面板时,代码有效。

2 个答案:

答案 0 :(得分:1)

在扩展JComponent时,您必须编写很多方法。

如果您延长JPanel并覆盖paintComponent方法,那么您可以更好地让Circle课程与其他Swing组件完美匹配。

答案 1 :(得分:1)

您需要覆盖getPreferredSize(...)方法,因为您使用paintComponent(...)方法进行操作,请将其设为:

public Dimension getPreferredSize()
{
    return (new Dimension(300, 300));
}

以下是一个示例程序,供您进一步寻求帮助:

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

public class TwoButtons
{
    private int x;
    private int y;
    private int count = 0;

    private Timer timer;

    private ActionListener actionTimer; 

    public static void main(String args[])
    {
        Runnable runnable = new Runnable()
        {
            public void run()
            {
                TwoButtons gui = new TwoButtons();
                gui.go();
            }
        };      
        SwingUtilities.invokeLater(runnable);
    }

    public void go()
    {
        JFrame frame = new JFrame();
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

        JPanel contentPane = new JPanel();

        /*
         * Class Name : 
         * Java Naming Convention says that class names 
         * should be in Pascal Case, i.e. the first
         * letter of the class name should be capitalized
         * and every new word must start with a capitalized 
         * Alphabet.
         * For Example : 
         * public class ClassName{...}
         * ----------------------------------------------------------
         * Variable Name : 
         * Java Naming Convention says that the variable name
         * should be in Camel Case, i.e. the first letter of 
         * the variable name should be small case or _ (underscore)
         * and every new word must start with a capitalized
         * Alphabet.
         * ---------------------------------------------------------
         */
        final MyDraw drawPanel = new MyDraw(70, 70);
        x = drawPanel.getXValue();
        y = drawPanel.getYValue();
        contentPane.add(drawPanel);

        actionTimer = new ActionListener()
        {
            public void actionPerformed(ActionEvent ae)
            {               
                x++;
                y++;
                if (count < 100)
                    drawPanel.setXYValues(x, y, count);
                else if (count == 100)
                    timer.stop();
                count++;
            }
        };

        frame.getContentPane().add(contentPane);
        frame.setSize(300,300);
        frame.setVisible(true);        

        timer = new Timer(40, actionTimer);
        timer.start();
    }
    class MyDraw extends JComponent
    {
        private int x;
        private int y;
        private int count = 0;
        private Timer timer;

        public MyDraw(int x, int y)
        {
            this.x = x;
            this.y = y;
        }

        public int getXValue()
        {
            return x;
        }

        public int getYValue()
        {
            return y;
        }

        public void setXYValues(int x, int y, int count)
        {
            this.x = x;
            this.y = y;
            this.count = count;
            repaint();
        }

        public Dimension getPreferredSize()
        {
            return (new Dimension(300, 300));
        }

        public void paintComponent(Graphics g)
        {
            g.setColor(Color.green);
            g.fillOval(x, y, 40, 40);
        }
    }
}