输出中的 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);
其他建议:
不要使用 AWT。而是使用 Swing。 Swing 组件以“J”开头。有关 Swing 基础知识,请参阅 Swing Tutorial。您在那里找到的演示代码将比您当前拥有的代码质量更好。
不要使用空布局。 Swing(和 AWT)旨在与布局管理器一起使用。
我在练习时遇到了一个没有完美解释解决方案的问题。 ''' 包裹 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);
其他建议:
不要使用 AWT。而是使用 Swing。 Swing 组件以“J”开头。有关 Swing 基础知识,请参阅 Swing Tutorial。您在那里找到的演示代码将比您当前拥有的代码质量更好。
不要使用空布局。 Swing(和 AWT)旨在与布局管理器一起使用。