在框架中绘制字符串。
Draw a String in a Frame.
我正在研究如何在 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 );
}
}
好的,我会指出错误的。
您必须始终通过调用 SwingUtilities invokeLater 方法来启动 Swing 应用程序。这确保了在 Event Dispatch thread (EDT).
上创建和更新 Swing 组件
Class 名称以大写字母开头。这允许您和我们从方法名称或变量名称中分辨出 class 名称。
正如其他人所说,必须按特定顺序调用 JFrame 方法。我重新安排了您的 JFrame 方法调用。
您使用 Swing 组件。你不会扩展 Swing 组件,除非你重写其中一个组件方法,就像我们在 Lamina class 中所做的那样。我使用了 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);
}
}
}
我正在研究如何在 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 );
}
}
好的,我会指出错误的。
您必须始终通过调用 SwingUtilities invokeLater 方法来启动 Swing 应用程序。这确保了在 Event Dispatch thread (EDT).
上创建和更新 Swing 组件
Class 名称以大写字母开头。这允许您和我们从方法名称或变量名称中分辨出 class 名称。
正如其他人所说,必须按特定顺序调用 JFrame 方法。我重新安排了您的 JFrame 方法调用。
您使用 Swing 组件。你不会扩展 Swing 组件,除非你重写其中一个组件方法,就像我们在 Lamina class 中所做的那样。我使用了 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);
}
}
}