输出中的 Java ST canvas 覆盖了它自己的图形内容

Java AWT canvas in the output is overiding it's own graphic contents

我在练习时遇到了一个没有完美解释解决方案的问题。 ''' 包裹 com.company;

    import java.awt.*;
    import java.awt.event.ActionEvent;
    import java.awt.event.ActionListener;
    import java.awt.event.WindowAdapter;
    import java.awt.event.WindowEvent;
    
    public class Main extends Frame {
    
        public Main() {
    
            Button bt = new Button("Click me");
            bt.setBounds(20,40,80,30);
            bt.setBackground(Color.green);
            bt.setForeground(Color.blue);
    
            Label l1 = new Label("This is label");
            l1.setBounds(20,90,80,30);
    
            TextField tf1 = new TextField();
            tf1.setBounds(20,120,150,30);
    
            TextArea ta = new TextArea();
            ta.setBounds(20,170,350,100);
    
            Checkbox cb1 = new Checkbox("cb1");
            cb1.setBounds(200,40,40,40);
            Checkbox cb2 = new Checkbox("cb2");
            cb2.setBounds(200,65,40,40);
    
            MyCanvas cv = new MyCanvas();
    
    
            add(bt);
            add(l1);
            add(tf1);
            add(ta);
            add(cb1);
            add(cb2);
            add(cv);
    
            setSize(400,300);
            setLayout(null);
            setVisible(true);
            addWindowListener(new WindowAdapter() {
                @Override
                public void windowClosing(WindowEvent e) {
                    Frame frame = (Frame)e.getSource();
                    frame.dispose();
                }
            });
    
            bt.addActionListener(new ActionListener() {
                @Override
                public void actionPerformed(ActionEvent e) {
                    l1.setText("button click...");
                }
            });
    
        }
    
        public static void main(String[] args) {
        // write your code here
            Main m = new Main();
        }
    }
    
    class MyCanvas extends Canvas{
        public MyCanvas(){
            setBackground(Color.cyan);
            setBounds(250,40,100,100);
        }
    
        public void paint(Graphics g){
            g.setColor(Color.red);
            g.drawOval(240,42,70,50);
            g.drawString("JAVA is best",252,94);
        }
    }

''' 输出如图所示:

我确实发现图形内容被隐藏在框架中的 canvas 后面。请解释导致此类输出的原因。

setBounds(250,40,100,100);
 
...

g.drawString("JAVA is best",252,94);

图形是相对于组件绘制的。您的组件的宽度只有 100,因此尝试在 252 处绘制超出了组件的范围。

尝试:

g.drawString("JAVA is best",52,94);

其他建议:

  1. 不要使用 AWT。而是使用 Swing。 Swing 组件以“J”开头。有关 Swing 基础知识,请参阅 Swing Tutorial。您在那里找到的演示代码将比您当前拥有的代码质量更好。

  2. 不要使用空布局。 Swing(和 AWT)旨在与布局管理器一起使用。