【问题标题】:Paint method not being called未调用绘画方法
【发布时间】:2013-12-30 09:24:13
【问题描述】:

我正在尝试简化一些基本代码,但遇到了一个小问题。我的印象是paint方法是自动调用的,并且我基于我编写的所有其他基本程序。我没有得到任何错误,只是代码不起作用,我也不能调用 repaint()。 代码:

public class Dynamic_Bg_Color{

JFrame frame;

public Dynamic_Bg_Color(){
    frame = new JFrame("BG Color Changer");

}

public void paint(Graphics g1){
    Graphics g = (Graphics)g1;

    g.setColor(Color.pink);
    g.fillRect(20,20,frame.getWidth()-20,100);
}

public static void main(String[] args){
    Dynamic_Bg_Color d = new Dynamic_Bg_Color();
    Dimension size = new Dimension(500,400);
    d.frame.setPreferredSize(new Dimension(size));
    d.frame.setMinimumSize(new Dimension(size));
    d.frame.setMaximumSize(new Dimension(size));
    d.frame.setLocationRelativeTo(null);

    d.frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    d.frame.setLayout(new FlowLayout());
    d.frame.setVisible(true);
    d.frame.getContentPane().setBackground(Color.cyan);
}

}

【问题讨论】:

    标签: java swing colors jframe paint


    【解决方案1】:

    paint 方法只有在被覆盖时才会被调用,并且该类扩展了另一个具有该 paint 方法意义的类。你的类不这样做,所以你的paint方法没有意义。

    话虽如此,我还是建议您不要重载paint,而是在扩展JComponent 或其子之一的类中使用paintComponent(...)。最重要的是,使用 Swing 教程阅读绘画。请开始here

    顺便说一句,将 Graphics 对象转换为 Graphics 对象没有任何意义。也许您错误地复制了代码并打算将其转换为 Graphics2D 类型?

    【讨论】:

    • 我使类扩展了 JComponent,并添加了覆盖,但没有任何改变。我从之前的代码中删除的主要内容是扩展 JFrame,但我发现这是不必要的,因为我正在创建新的 JFrame。
    【解决方案2】:

    我使类扩展了 JComponent,并添加了覆盖,但没有任何改变。

    1. 我看不到您将组件添加到框架的哪个位置。
    2. 即使您确实将组件添加到框架中,也不会绘制,因为组件的默认大小为 (0, 0),因此无需绘制任何内容。

    您还需要重组代码。 JFrame 变量不属于您进行自定义绘制的组件。我建议您阅读 Custom Painting 上的 Swing 教程中的部分。它会告诉你:

    1. 如何进行自定义绘制,包括如何为组件指定首选尺寸
    2. 如何更好地构建程序,包括在事件调度线程上执行代码

    【讨论】:

      【解决方案3】:

      只需对工作代码进行少量更改:

      import javax.swing.*;
      import java.awt.*;
      
      public class Dynamic_Bg_Color extends JPanel{
      
      JFrame frame;
      
      public Dynamic_Bg_Color(){
      frame = new JFrame("BG Color Changer");
      }
      
      public void paint(Graphics g1){
      Graphics g = (Graphics2D)g1;
      
      g.setColor(Color.pink);
      g.fillRect(20,20,frame.getWidth()-20,100);
      }
      
      public static void main(String[] args){
      Dynamic_Bg_Color d = new Dynamic_Bg_Color();
      Dimension size = new Dimension(500,400);
      d.setPreferredSize(new Dimension(size));
      d.setMinimumSize(new Dimension(size));
      d.setMaximumSize(new Dimension(size));
      
      d.frame.add(d);
      d.frame.setLocationRelativeTo(null);
      d.frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
      d.frame.setLayout(new FlowLayout());
      d.frame.pack();
      d.frame.setVisible(true);
      d.frame.getContentPane().setBackground(Color.cyan);
      }
      
      }
      

      但是,正如其他人所说,我不建议您使用它,因为它的程序结构非常非常糟糕。并阅读关于绘画的教程,即使我认为关于这方面的 Oracles 教程很糟糕(frame.pack() 只是将 JFrame 窗口的大小设置为可以容纳它包含的组件)。

      【讨论】:

        【解决方案4】:

        这是最终的工作代码。一些更改是扩展 JPanel、设置 JPanel 的大小以及将面板添加到 JFrame。是的,我知道正如大家所说,这不是这样做的最佳方式,但就目前而言,它有效。

        import java.awt.Color;
        import java.awt.Dimension;
        import java.awt.EventQueue;
        import java.awt.FlowLayout;
        import java.awt.Graphics;
        import java.awt.event.MouseAdapter;
        import java.awt.event.MouseEvent;
        import java.awt.event.MouseListener;
        
        import javax.swing.JFrame;
        import javax.swing.JPanel;
        import javax.swing.UIManager;
        import javax.swing.UnsupportedLookAndFeelException;
        
        public class Dynamic_Bg_Color extends JPanel{
        
        private static final long serialVersionUID = 1L;
        
        static Dimension size = new Dimension(500,400);
        
        static JFrame frame;
        
        public Dynamic_Bg_Color(){
        
            setPreferredSize(size);
            setBackground(Color.cyan);
            addMouseListener(new Handler());
        
        }
        
        @Override
        public void paintComponent(Graphics g){
        
            System.out.println("Click");
        
            super.paintComponent(g);
        
            g.setColor(Color.blue);
            g.fillRect(20,20,getWidth()-40,100);
        
            g.setColor(Color.green);
            g.fillRect(20,140,getWidth()-40,100);
        
            g.setColor(Color.orange);
            g.fillRect(20,260,getWidth()-40,100);
        }
        
        public static void main(String[] args){     
        
        
            Dynamic_Bg_Color d = new Dynamic_Bg_Color();
        
            frame = new JFrame("BG Color Changer");
        
            frame.setPreferredSize(new Dimension(size));
            frame.setMinimumSize(new Dimension(size));
            frame.setMaximumSize(new Dimension(size));
            frame.setLayout(new FlowLayout());
            frame.setLocationRelativeTo(null);
            frame.add(d);
            frame.pack();
            frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
            frame.getContentPane().setBackground(Color.cyan);
            frame.setVisible(true);
        
            }
        
        public class Handler extends MouseAdapter{
        
            public void mousePressed(MouseEvent e) {
        
                int x = e.getX();
                int y = e.getY();
        
                if(x>= 20 && x<=getWidth()-40 && y>=20 && y<= 120){
                    frame.getContentPane().setBackground(Color.blue);
                    setBackground(Color.blue);
                    frame.setTitle("Blue");
                }
                if(x>= 20 && x<=getWidth()-40 && y>=140 && y<= 240){
                    frame.getContentPane().setBackground(Color.green);
                    setBackground(Color.green);
                    frame.setTitle("Green");    
                    }
                if(x>= 20 && x<=getWidth()-40 && y>=260 && y<= 360){
                    frame.getContentPane().setBackground(Color.orange);
                    setBackground(Color.orange);
                    frame.setTitle("Orange");
                    }
            }
        
        
        
        }
        
        }
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多