Java JFrame不在窗口中绘制线条


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);
}
}

笔记:

  1. 我在构造函数中调用setBackground(),因为它不依赖于传递给paintComponent()Graphics实例。这也避免了为每个渲染调用另一个函数的开销。

  2. paintComponent(),我称之为super.panitComponent()。这允许JPanel清除要绘制的区域以及任何其他必要的初始化。

最新更新