输出中的 Java AWT 画布覆盖其自己的图形内容

Posted

技术标签:

【中文标题】输出中的 Java AWT 画布覆盖其自己的图形内容【英文标题】:Java AWT canvas in the output is overiding it's own graphic contents 【发布时间】:2021-06-26 02:17:17 【问题描述】:

我在练习时遇到了一个没有完美解释解决方案的问题。 ''' 包 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);
        
    

''' 输出如图所示:

我确实发现图形内容隐藏在框架中的画布后面。请解释造成这种输出的原因。

【问题讨论】:

【参考方案1】:
setBounds(250,40,100,100);
 
...

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

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

试试:

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

其他建议:

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

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

【讨论】:

非常感谢兄弟的帮助和建议。我很遗憾地错过了查看画布区域。但是,我无法弄清楚你的第二个建议,“空布局”。您是要我通过创建 Frame 对象来使用框架吗? 不要硬编码组件的位置。这是其他语言可能工作的方式,但 Swing/AWT 旨在与布局管理器一起使用,以管理面板上组件的位置/大小。阅读Layout Managers 上的 Swing 教程以获取更多信息和示例。

以上是关于输出中的 Java AWT 画布覆盖其自己的图形内容的主要内容,如果未能解决你的问题,请参考以下文章

Java AWT 图形界面编程使用鼠标滚轮放大缩小 Canvas 画布 ( 鼠标滚轮事件监听器 MouseWheelListener )

如何在Java图形界面上输出数组数据

awt中的画布类

通过按钮将矩形绘制到画布上

Java AWT 图形界面编程Canvas 组件中使用 Graphics 绘图 ② ( AWT 绘图步骤 | Graphics 绘图常用 API )

Java AWT 图形界面编程Canvas 组件中使用 Graphics 绘图 ② ( AWT 绘图步骤 | Graphics 绘图常用 API )