我正在研究如何用Java编程。目前我在Swing的一章。我正在尝试使用下一个代码在框架中绘制一个字符串。
有人可以告诉我哪里出错了吗?
package paquete_swing;
import javax.swing.*;
import java.awt.*;
public class graficos {
public static void main(String[] args) {
MarcoConTexto primer_texto = new MarcoConTexto();
primer_texto.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
}
}
class MarcoConTexto extends JFrame {
public MarcoConTexto (){
setVisible(true);
//setBounds(400, 200, 600, 450);
setSize(600,450);
setLocation(400, 200);
setTitle("Primer Texto");
lamina milamina= new lamina();
add(milamina);
}
}
class lamina extends JPanel{
public void paintComponents(Graphics g) {
super.paintComponents(g);
g.drawString("Mi primer texto en una lamina de java",100 ,100 );
}
}
答案 0 :(得分:2)
当然,我会指出错误。
您必须始终通过调用SwingUtilities invokeLater方法启动Swing应用程序。这可确保在Event Dispatch thread (EDT)上创建和更新Swing组件。
班级名称以大写字母开头。这允许您和我们从方法名称或变量名称中告诉类名称。
正如其他人所说,必须按特定顺序调用JFrame方法。我重新安排了你的JFrame方法调用。
您使用Swing组件。除非要覆盖其中一个组件方法,否则不要扩展Swing组件,就像我们在Lamina类中一样。我使用了JFrame。
我指定尺寸的唯一地方是Lamina绘制JPanel。您可以使用Swing layouts将Swing组件放在JFrame或JPanel中。
您覆盖了paintComponents方法而不是paintComponent方法。这是一个容易犯的错误。
这是带有更正的可运行代码。
package paquete_swing;
import java.awt.Dimension;
import java.awt.Graphics;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.SwingUtilities;
public class Graficos implements Runnable {
public static void main(String[] args) {
SwingUtilities.invokeLater(new Graficos());
}
@Override
public void run() {
JFrame frame = new JFrame();
frame.setTitle("Primer Texto");
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
Lamina milamina = new Lamina();
frame.add(milamina);
frame.setLocationByPlatform(true);
frame.pack();
frame.setVisible(true);
}
public class Lamina extends JPanel {
private static final long serialVersionUID = 4553173187556864421L;
public Lamina() {
this.setPreferredSize(new Dimension(400, 200));
}
@Override
public void paintComponent(Graphics g) {
super.paintComponent(g);
g.drawString("Mi primer texto en una lamina de java", 100, 100);
}
}
}