package Main;
import java.awt.Color;
import java.awt.Graphics;
import javax.swing.JFrame;
public class Main extends JFrame{
public static void main(String[] args) {
int width = 800;
int height = 600;
String title = "Test";
JFrame display = new JFrame();
display.setTitle(title);
display.setSize(width, height);
display.setVisible(true);
display.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
}
public void paint(Graphics g) {
g.setColor(Color.white);
g.drawLine(0, 100, 800, 300);
getContentPane().setBackground(Color.black);
}
}
我正在使用Java的JFrame。所以这不是识别绘画方法,也无法弄清楚原因。我一直在看YouTube视频,看看是否有人遇到过类似的问题,但是我发现的一切似乎都无济于事。
当我在主要部分设置背景颜色时,它可以工作,有点油漆,它似乎什么也没做,把它留空。
它是黑色背景上的一条白线,所以我应该很容易看到它。
诚然,我对Swing了解不多(我更喜欢JavaFX(。但是,很明显,您的 Main 类是一个JFrame,因此您不应该在其中创建一个新类。您调用display
的所有方法都是在当前类中构建的。基本上,在你的JFrame中,你做了一个新的JFrame。但是,您的paint
方法正在父 JFrame 上调用,您从未使其可见。这解决了您的问题(您可能需要全屏显示窗口(:
import java.awt.Color;
import java.awt.Graphics;
import javax.swing.JFrame;
public class Main extends JFrame{
public static void main(String[] args) {
new Main();
}
public Main() {
int width = 800;
int height = 600;
String title = "Test";
setTitle(title);
setSize(width, height);
setVisible(true);
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
}
public void paint(Graphics g) {
super.paint(g);
g.setColor(Color.WHITE);
g.drawLine(100, 100, 800, 300);
getContentPane().setBackground(Color.black);
}
}
您正在创建JFrame
的实例
JFrame display = new JFrame();
但是JFrame
类没有逻辑在黑色背景上画一条白线。该逻辑位于您的自定义类Main
中。因此,您应该创建一个Main
实例:
JFrame display = new Main();
但是,这种更改仍然无法解决问题,因为您正在设置"内容窗格"的背景颜色,但尝试直接在JFrame
本身上绘制。此处的首选解决方案是扩展JPanel
而不是JFrame
并覆盖其paintComponent()
方法。然后创建新类的实例以用作内容痛点:
import java.awt.Color;
import java.awt.Graphics;
import javax.swing.JFrame;
import javax.swing.JPanel;
public class MainPanel extends JPanel{
public static void main(String[] args) {
int width = 800;
int height = 600;
String title = "Test";
JFrame display = new JFrame();
display.setTitle(title);
display.setSize(width, height);
display.setVisible(true);
display.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
display.setContentPane(new MainPanel());
}
public MainPanel() {
setBackground(Color.black);
}
@Override
public void paintComponent(Graphics g) {
super.paintComponent(g);
g.setColor(Color.white);
g.drawLine(0, 100, 800, 300);
}
}
笔记:
我在构造函数中调用
setBackground()
,因为它不依赖于传递给paintComponent()
的Graphics
实例。这也避免了为每个渲染调用另一个函数的开销。在
paintComponent()
,我称之为super.panitComponent()
。这允许JPanel
清除要绘制的区域以及任何其他必要的初始化。