【问题标题】:Painting Components on Nested JPanels (Java)在嵌套的 JPanel 上绘制组件 (Java)
【发布时间】:2012-03-15 17:33:37
【问题描述】:

有人知道如何在 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) ] 但拒绝任何子面板时,代码有效。

【问题讨论】:

    标签: java swing jpanel


    【解决方案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);
            }
        }
    }
    

    【讨论】:

    • 非常感谢。我永远不会猜到。
    • @MustafaHussain:非常感谢,保持微笑 :-) 很高兴答案在某种程度上有所帮助 :-)
    【解决方案2】:

    扩展JComponent时要写不少方法。

    如果您扩展 JPanel 并覆盖 paintComponent 方法,您将有更好的运气让您的 Circle 类与其他 Swing 组件很好地配合使用。

    【讨论】:

      猜你喜欢
      • 2013-10-29
      • 2012-06-19
      • 2023-03-21
      • 1970-01-01
      • 2014-12-29
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多