Java JFrame不在窗口中绘制线条

时间:2018-05-20 15:38:40

标签: java windows eclipse 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视频,看看是否有人遇到过类似的问题,但是我发现的一切似乎都无法解决问题。

当我在主要部分设置背景颜色时,它会起作用,位于绘画中,它似乎没有做任何事情并将其留空。

它是黑色背景上的白线,所以我应该很容易看到它。

2 个答案:

答案 0 :(得分:1)

不可否认,我对Swing知之甚少(我更喜欢JavaFX)。但是,很明显,你的Main类一个JFrame,所以你不应该在其中创建一个新类。您在display上调用的所有方法都是在当前类中构建的。基本上,在你的JFrame中你创建了一个新的JFrame。但是,您在父JFrame上调用了paint方法,这种方法从未显示过。这解决了您的问题(您可能需要全屏显示窗口):

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

}

答案 1 :(得分:0)

您正在使用

创建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(),因为它不依赖于传递给Graphics的{​​{1}}实例。这也避免了每个渲染的另一个函数调用的开销。

  2. paintComponent()中,我致电paintComponent()。这允许super.panitComponent()清除要绘制的区域和任何其他必要的初始化。