在 Java 中尝试在 JFrame 中使用 paint 方法时出错
Error when trying to use paint method inside JFrame in Java
我正在尝试在扩展 JFrame class 的 class 中使用方法 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);
这消除了编译器错误。
它不绘制任何东西的原因是因为您通过重写 JFrame
的 paint
和未能调用 super.paint
.
打破了绘制链
有关绘画工作原理的更多详细信息,请参阅Painting in AWT and Swing and Performing Custom Painting
一般的答案是不要这样做,有很多原因不应该覆盖 JFrame
:
的 paint
- paintComponent() vs paint() and JPanel vs Canvas in a paintbrush-type GUI
- How can I set in the midst?
- Java JFrame .setSize(x, y) not working?
- How to get the EXACT middle of a screen, even when re-sized
- Graphics rendering in title bar
这只是其中的一个。
相反,创建一个单独的组件(例如从 JPanel
扩展)并覆盖它的 paintComponent
方法并执行自定义绘制(首先调用 super.paintComponent
)
查看 JFrame shows up grey, blank 以获得更详细的示例
我正在尝试在扩展 JFrame class 的 class 中使用方法 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);
这消除了编译器错误。
它不绘制任何东西的原因是因为您通过重写 JFrame
的 paint
和未能调用 super.paint
.
有关绘画工作原理的更多详细信息,请参阅Painting in AWT and Swing and Performing Custom Painting
一般的答案是不要这样做,有很多原因不应该覆盖 JFrame
:
paint
- paintComponent() vs paint() and JPanel vs Canvas in a paintbrush-type GUI
- How can I set in the midst?
- Java JFrame .setSize(x, y) not working?
- How to get the EXACT middle of a screen, even when re-sized
- Graphics rendering in title bar
这只是其中的一个。
相反,创建一个单独的组件(例如从 JPanel
扩展)并覆盖它的 paintComponent
方法并执行自定义绘制(首先调用 super.paintComponent
)
查看 JFrame shows up grey, blank 以获得更详细的示例