【问题标题】:Java isn't displaying rectangle?Java不显示矩形?
【发布时间】:2013-03-29 03:13:00
【问题描述】:

我正在尝试在指定位置显示一个矩形,但它没有显示出来。背景是洋红色,但矩形不存在。

另外:除了“颜色。(在此处插入很少的选项)”之外,我如何访问更多颜色

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


class Screensaver {
    private final static int FRAME_HEIGHT = 600;
    private final static int FRAME_WIDTH = 600;
    public static void main(String[] args){
        JFrame win;
        Container contentPane;
        Graphics g;


        win = new JFrame();
        win.setSize(FRAME_WIDTH, FRAME_HEIGHT);
        win.setVisible(true);
        contentPane = win.getContentPane();
        contentPane.setBackground(Color.MAGENTA);
        g = contentPane.getGraphics();
        g.setColor(Color.BLACK);
        g.fillRect(80, 350, 400, 250);

    }
}

【问题讨论】:

  • g = contentPane.getGraphics(); 永远不要那样做,而是在请求绘画时绘画。

标签: java swing graphics awt paint


【解决方案1】:

你不应该在 main();最好扩展 JPanel,更改paintComponent(),并将面板添加到 JFrame。

public class PaintPanel extends JPanel {

    public PaintPanel() {
        setBackground(Color.MAGENTA);
    }

    protected void paintComponent(Graphics g) {
        super.paintComponent(g); // This paints the background

        g.setColor(Color.BLACK);
        g.fillRect(80, 350, 400, 250);
    }
}

在 main() 中:

public static void main(String[] args) {
    JFrame frame = new JFrame();
    frame.add(new PaintPanel());
    frame.setVisible(true);
}

如果要制作自己的颜色,可以使用 new Color(int red, int green, int blue) 构造函数。

【讨论】:

    【解决方案2】:

    如果您要绘制东西,请创建一个继承自 Swing 容器、JComponent、JPanel 等的类并覆盖paint(Graphics g) 方法。如果您看到洋红色背景,则必须添加 contentPane。可能发生的是它在矩形上绘制洋红色背景,但这只是一个猜测。试试这个...

    public class ContentPane extends JComponent {
         public ContentPane() {
    
         }
    
         @Override
         public void paint(Graphics g) {
              g.setColor(Color.MAGENTA);
              g.fillRect(0, 0, getWidth(), getHeight());
    
              g.setColor(Color.BLACK);
              g.fillRect(80, 350, 400, 250);
    
         }
    }
    

    然后在您的主类中实例化 ContentPane 类的一个对象并将其添加到您的 JFrame。调用 repaint() 可能是不必要的,但这将确保它被绘制。您也可以尝试使用 paintComponent(Graphics g) 方法,两者之间存在差异,我相信这是从 update 方法调用它们的顺序,但我可能错了,但这应该可以解决您的问题问题。

    关于颜色,请查阅 API。您可以将 RGB 值传递给 Color 构造函数以创建各种颜色。颜色颜色 = 新颜色(int red,int green,int blue)。我认为这是创建自定义颜色的最简单方法,但就像我在 API 中所说的那样。希望这会有所帮助。

    【讨论】:

    • 执行自定义绘画的推荐方法是paintComponent。你应该调用 super.paint 并且你不应该在任何paint方法中调用 repaint 永远
    • 正确,我只是把它扔在那里以确保一切都被绘制,但你是对的,它应该从另一个线程调用。我马上修改。
    • 应该在 EDT 的上下文中调用重绘,而不是在任何绘制方法中
    • 如果你给super.paint打电话就好了。如果您要从 JComponent 扩展,这是非常重要的,因为它默认是透明的,paints 的一部分工作是正确准备 Graphics 上下文以进行绘画。如果你不这样做,你最终会得到讨厌的油漆副作用
    • 如果我在原始代码中使用 setBackground() 方法设置了 JComponent 的背景颜色,这将是必要的,但您会注意到在我的示例中,我首先在颜料中绘制了自己的背景() 方法,因为对于这样的事情,我更喜欢自己绘制整个组件,而不是使用默认方法,这也是为什么我更喜欢 JComponent 而不是 JPanel 的原因,但这是一个偏好问题,你的方式可能是出于您提到的原因,正确的方法虽然我个人没有遇到过这样的情况。
    【解决方案3】:

    试试这个:

    import javax.swing.*;
    import java.awt.*;
    
    class Screensaver {
    
        private final static int FRAME_HEIGHT = 600;
        private final static int FRAME_WIDTH = 600;
    
        public static void main(String[] args) {
            JFrame win;
            Container contentPane;
            win = new JFrame();
            win.setSize(FRAME_WIDTH, FRAME_HEIGHT);
            win.setVisible(true);
            Component comp = new Component();
            contentPane = (Container) win.getContentPane().add(comp);
    
    
        }
        }
    
        class Component extends JComponent {
    
        @Override
       public void paintComponent(Graphics g) {
        super.paintComponent(g);
            g.setColor(Color.magenta);
            g.fillRect(0, 0, getWidth(), getHeight());
            g.setColor(Color.BLACK);
            g.fillRect(80, 350, 400, 250);
        }
    }
    

    关于颜色,您可以创建新颜色并根据需要设置红色、绿色、蓝色,试试这个:

    g.setColor(new Color(red, green, blue));
    

    【讨论】:

    • 执行自定义绘画的推荐方法是paintComponent。您还应该调用 super.paint/pantComponent
    • 不知道paint方法有什么问题??我运行它,它没问题,所以请告诉我错误在哪里?
    • 通读Performing Custom Painting,推荐的自定义绘画方法是paintComponent。 paint 负责调用paintConent、paintBreder 和paintComponents 等,它对简单的规避起到了很大作用。此外,您可能会在任何子组件上进行绘画
    • 我编辑了我的答案,但在这种情况下,这两种方法没有区别,不是吗?
    【解决方案4】:

    矩形只绘制一次,但每次调用 JFrames repaint() 方法时都会将其擦除并绘制基本组件。要在 JFrames 中添加自定义绘图,您必须重写 paint 方法。在这里,我稍微改进了你的代码,让你开始走这条路。如您所见,您想在 Paint 方法中绘制框。我制作了一个 Container 元素来完成您的绘图并删除了背景颜色,并将其添加到 paint 方法中。

    试试这个

    import javax.swing.*;
    import java.awt.*;
    
    public class JavaApplication10 {
        private final static int FRAME_HEIGHT = 600;
        private final static int FRAME_WIDTH = 600;
        public static void main(String[] args){
            JFrame win = new JFrame();
            win.setContentPane(new MyBoxContainer());
            win.setSize(FRAME_WIDTH, FRAME_HEIGHT);
            win.setVisible(true);
        }
    
        private static class MyBoxContainer extends Container {
            @Override
            public void paint(Graphics g) {
                super.paint(g);
                g.setColor(Color.MAGENTA);
                g.fillRect(0, 0, getWidth(), getHeight());
                g.setColor(Color.BLACK);
                g.fillRect(80, 350, 400, 250);
            }
        }
    }
    

    【讨论】:

    • 1- 当 OP 使用 Swing 时,想要从 AWT 组件扩展 2- 自定义绘画的推荐方法是 JComponent#paintComponent
    猜你喜欢
    • 2015-06-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-02-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多