输出中的 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 图形界面编程Canvas 组件中使用 Graphics 绘图 ② ( AWT 绘图步骤 | Graphics 绘图常用 API )
Java AWT 图形界面编程Canvas 组件中使用 Graphics 绘图 ② ( AWT 绘图步骤 | Graphics 绘图常用 API )