在 JFrame 上画一条线

2022-01-24 00:00:00 java swing graphics2d jframe

我正在尝试使用 Graphics 2D 绘制一条线,但随后这条线出现在所有JFrame 中的其他组件,从而使它们不可见.我该如何解决这个问题?

I am trying to draw a line using the Graphics 2D but then the line appears over all the other components in the JFrame thus making them invisible. How do I correct this problem?

代码如下:

import javax.swing.*;
import java.awt.*;
import java.awt.geom.*;

class Success extends JFrame{

    public Success(){
        JPanel panel=new JPanel();
        getContentPane().add(panel);
        setSize(450,450);

        JButton button =new JButton("press");
        panel.add(button);
    }

    public void paint(Graphics g) {
        Graphics2D g2 = (Graphics2D) g;
        Line2D lin = new Line2D.Float(100, 100, 250, 260);
        g2.draw(lin);
    }

    public static void main(String []args){
        Success s=new Success();
        s.setVisible(true);
    }
}

推荐答案

import javax.swing.*;
import java.awt.*;
import java.awt.geom.*;

class Success extends JFrame{

    public Success(){
        JPanel panel=new JPanel();
        getContentPane().add(panel);
        setSize(450,450);

        JButton button =new JButton("press");
        panel.add(button);
    }

    public void paint(Graphics g) {
        super.paint(g);  // fixes the immediate problem.
        Graphics2D g2 = (Graphics2D) g;
        Line2D lin = new Line2D.Float(100, 100, 250, 260);
        g2.draw(lin);
    }

    public static void main(String []args){
        Success s=new Success();
        s.setVisible(true);
    }
}

更多提示

  1. 在 EDT 上创建 GUI.有关详细信息,请参阅 Swing 中的并发.
  2. 按照@nIcEcOw 的建议使用JPanel,覆盖paintComponent(Graphics) 而不是paint().再次,首先调用 super 方法.
  3. 不要扩展框架,只使用一个实例.使用pack()根据组件所需空间设置大小.
  1. Create the GUI on the EDT. See Concurrency in Swing for more details.
  2. Use a JPanel as suggested by @nIcEcOw, override paintComponent(Graphics) instead of paint(). Again, call the super method first.
  3. Don't extend frame, just use an instance of one. Set the size according to the space required for the components using pack().

相关文章