尝试在 Java 中的 JFrame 中使用 paint 方法时出错



我正在尝试在一个扩展JFrame类的类中使用paint()方法来绘制随机掷骰子。尝试执行此代码时,将显示错误,并且不会显示任何输出。

有人可以告诉我如何在 JFrame 中以正确的方式实现此方法 paint()?

这是我的代码:

import java.awt.*;
import java.awt.event.*;
import javax.swing.event.*;
import javax.swing.*;
import java.util.Random;
public class Background extends JFrame { 
    private Random ran;
    private int value;
    private JButton b;
    public Background () {
        super("the title");
        setLayout(new FlowLayout());
        ran = new Random();
        value = nextValue() ;
        b=new JButton("ROLL THE DICES");
        b.setForeground(Color.WHITE);//ndryshon ngjyren e shkrimit
        b.setBackground(Color.YELLOW);
        b.setBounds(20, 30, 20, 70);
        add("South",b);
        thehandler hand=new thehandler();
        b.addActionListener(hand);
    }
    private int nextValue() {
        return Math.abs(ran.nextInt()) % 6 + 1 ;
    }
    public void roll() {
        value = nextValue();
        repaint();
    }
    public int getValue() {
        return value;
    }
    public void paint(Graphics g) {
        g.setColor(Color.BLACK);
        g.draw3DRect(40, 40, 60, 60,true);
        /*
        g.drawLine(40,40,40,100);
        g.drawLine(40,100,100,100);
        g.drawLine(100,100,100,40);
        g.drawLine(100,40,40,40);
        */
        g.setColor(Color.RED);
        if (value == 1 || value == 3 || value == 5) g.fillOval(68,68,4,4);
        if (value != 1) { g.fillOval(53,83,4,4) ; g.fillOval(83,53,4,4) ;}
        if (value == 4 || value == 5 || value == 6)
        { g.fillOval(53,53,4,4) ; g.fillOval(83,83,4,4) ;}
        if (value == 6) { g.fillOval(68,53,4,4) ;g.fillOval(68,83,4,4) ;}
    }
    private class thehandler implements ActionListener{
        private Background m;
        thehandler(Background thisone){
            m=thisone;
        }
        public void actionPerformed(ActionEvent event) {
            m.roll();
        }
    }
    public static void main(String[] args) {
        ("Center",d);
        // f.add("South",b = new Button("Roll"));
        // b.addActionListener(new Doit(d));
        d.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        d.getContentPane().setBackground(Color.GREEN);
        f.setSize(400,300);
        f.pack() ;
        f.setVisible(true); Frame f = new Frame("Dice");
        // Button b;
        Background  d = new Background();
        // f.addWindowListener(new MyListener());
        //f.add 
    }
}

所以,你的基本问题就在这里...

thehandler hand = new thehandler();

thehandler的构造函数需要一个Background ...

private class thehandler implements ActionListener {
    //...
    thehandler(Background thisone) {

所以,它实际上应该是...

thehandler hand = new thehandler(this);

这样可以消除编译器错误。

它没有涂任何东西的原因是因为你通过覆盖JFramepaint和未能调用super.paint来破坏油漆链。

有关绘画工作原理的更多详细信息,请参阅在 AWT 中绘制和摆动和执行自定义绘画

一般的答案是不要这样做,有很多原因为什么你不应该覆盖paint JFrame

  • paintComponent() vs paint() 和 JPanel vs Canvas 在画笔类型的 GUI 中
  • 如何在中间设置?
  • Java JFrame .setSize(x, y) 不工作?
  • 如何获得屏幕的精确中间,即使重新调整大小
  • 标题栏中的图形呈现

这只是其中的另一个。

相反,创建一个单独的组件(例如从JPanel扩展)并覆盖它paintComponent方法并执行自定义绘制(首先调用super.paintComponent

看看JFrame显示为灰色,空白以获得更详细的示例

相关内容

  • 没有找到相关文章

最新更新