Java 为什么repaint()方法在这里不起作用? 公共类Ova扩展JPanel实现ActionListener{ int x=0; 定时器=新定时器(100,本); int y=0,x1=5,y1=5; 公共静态void main(字符串[]ds) { Ova ss=新的Ova(); ss.nn(); } 私有void nn(){ JFrame=新JFrame(“fram”); 框架设置尺寸(1000600); JPanel as=新的JPanel(); 框架。添加(as); frame.add(新的Ova()); frame.setVisible(true); timer.start(); } 公共组件(图形g) { 超级组件(g); g、 牵引椭圆(x,y,50,50); } 已执行的公共无效操作(操作事件e){ 如果(x950){ x1=-x1; } 如果(y530) { y1=-y1; } x=x+x1; y=y+y1; 重新油漆(); } }
每当我将Java 为什么repaint()方法在这里不起作用? 公共类Ova扩展JPanel实现ActionListener{ int x=0; 定时器=新定时器(100,本); int y=0,x1=5,y1=5; 公共静态void main(字符串[]ds) { Ova ss=新的Ova(); ss.nn(); } 私有void nn(){ JFrame=新JFrame(“fram”); 框架设置尺寸(1000600); JPanel as=新的JPanel(); 框架。添加(as); frame.add(新的Ova()); frame.setVisible(true); timer.start(); } 公共组件(图形g) { 超级组件(g); g、 牵引椭圆(x,y,50,50); } 已执行的公共无效操作(操作事件e){ 如果(x950){ x1=-x1; } 如果(y530) { y1=-y1; } x=x+x1; y=y+y1; 重新油漆(); } },java,swing,timer,paintcomponent,repaint,Java,Swing,Timer,Paintcomponent,Repaint,每当我将timer.start()放入paintComponent()内部时,repaint()方法起作用,但如果我在paintComponent方法外部启动计时器,则repaint方法不起作用。请解释原因。谢谢。没问题 您有不匹配的参考问题 从这个片段开始 public class Ova extends JPanel implements ActionListener{ int x=0; Timer timer=new Timer(100,this); int y=0,x1=5,y1=5;
timer.start()
放入paintComponent()
内部时,repaint()
方法起作用,但如果我在paintComponent方法外部启动计时器,则repaint方法不起作用。请解释原因。谢谢。没问题
您有不匹配的参考问题
从这个片段开始
public class Ova extends JPanel implements ActionListener{
int x=0;
Timer timer=new Timer(100,this);
int y=0,x1=5,y1=5;
public static void main(String[] ds)
{
Ova ss=new Ova();
ss.nn();
}
private void nn() {
JFrame frame=new JFrame("fram");
frame.setSize(1000,600);
JPanel as=new JPanel();
frame.add(as);
frame.add(new Ova());
frame.setVisible(true);
timer.start();
}
public void paintComponent(Graphics g)
{
super.paintComponent(g);
g.drawOval(x, y, 50, 50);
}
public void actionPerformed(ActionEvent e) {
if (x<0 || x>950){
x1=-x1;
}
if (y<0 || y>530)
{
y1=-y1;
}
x=x+x1;
y=y+y1;
repaint();
}
}
首先,main
创建一个Ova
的实例,然后方法nn
创建一个Ova
的新实例,然后启动计时器
现在,您需要问的问题是,您启动了哪个Ova
stimer
…屏幕上的那个还是main
创建的那个
我可以看出,它是main
创建的,在屏幕上不可见
(可能的)解决办法
不要在JPanel
(或其他组件)内部创建JFrame
。我唯一一次会这样做是通过静态支持方法
public class Ova extends JPanel implements ActionListener {
int x = 0;
Timer timer = new Timer(100, this);
int y = 0, x1 = 5, y1 = 5;
public static void main(String[] ds) {
Ova ss = new Ova();
ss.nn();
}
private void nn() {
JFrame frame = new JFrame("fram");
frame.setSize(1000, 600);
JPanel as = new JPanel();
frame.add(as);
frame.add(new Ova());
frame.setVisible(true);
timer.start();
}
删除nn
方法,并将其替换为启动计时器的begin
(或类似的)方法
在main
方法中,创建Ova
的实例,将其添加到JFrame
的实例中,并调用Ova
的开始
方法
public class Ova extends JPanel implements ActionListener {
int x = 0;
Timer timer = new Timer(100, this);
int y = 0, x1 = 5, y1 = 5;
public static void main(String[] ds) {
Ova ss = new Ova();
ss.nn();
}
private void nn() {
JFrame frame = new JFrame("fram");
frame.setSize(1000, 600);
JPanel as = new JPanel();
frame.add(as);
frame.add(new Ova());
frame.setVisible(true);
timer.start();
}
导入java.awt.BorderLayout;
导入java.awt.Dimension;
导入java.awt.EventQueue;
导入java.awt.Graphics;
导入java.awt.event.ActionEvent;
导入java.awt.event.ActionListener;
导入javax.swing.JFrame;
导入javax.swing.JPanel;
导入javax.swing.Timer;
导入javax.swing.UIManager;
导入javax.swing.UnsupportedLookAndFeelException;
公共类Ova扩展JPanel实现ActionListener{
int x=0;
定时器=新定时器(100,本);
int y=0,x1=5,y1=5;
公共静态void main(字符串[]ds){
invokeLater(新的Runnable(){
@凌驾
公开募捐{
试一试{
UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName());
}catch(ClassNotFoundException |实例化Exception | IllegalacessException |不支持ookandfeelException ex){
}
Ova Ova=新的Ova();
JFrame=新JFrame(“测试”);
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.setLayout(新的BorderLayout());
帧。添加(ova);
frame.pack();
frame.setLocationRelativeTo(空);
frame.setVisible(true);
ova.begin();
}
});
}
@凌驾
公共维度getPreferredSize(){
返回新维度(600600);
}
私有void begin(){
timer.start();
}
@凌驾
受保护组件(图形g){
超级组件(g);
g、 牵引椭圆(x,y,50,50);
}
@凌驾
已执行的公共无效操作(操作事件e){
如果(x<0 | | x>950){
x1=-x1;
}
如果(y<0 | | y>530){
y1=-y1;
}
x=x+x1;
y=y+y1;
重新油漆();
}
}
避免对任何内容调用setSize
,相反,请覆盖组件的getPreferredSize
方法并返回首选大小,然后在JFrame
上使用pack
将框架环绕此大小。您将获得更好、更可靠的结果。问题
您有不匹配的参考问题
从这个片段开始
public class Ova extends JPanel implements ActionListener{
int x=0;
Timer timer=new Timer(100,this);
int y=0,x1=5,y1=5;
public static void main(String[] ds)
{
Ova ss=new Ova();
ss.nn();
}
private void nn() {
JFrame frame=new JFrame("fram");
frame.setSize(1000,600);
JPanel as=new JPanel();
frame.add(as);
frame.add(new Ova());
frame.setVisible(true);
timer.start();
}
public void paintComponent(Graphics g)
{
super.paintComponent(g);
g.drawOval(x, y, 50, 50);
}
public void actionPerformed(ActionEvent e) {
if (x<0 || x>950){
x1=-x1;
}
if (y<0 || y>530)
{
y1=-y1;
}
x=x+x1;
y=y+y1;
repaint();
}
}
首先,main
创建一个Ova
的实例,然后方法nn
创建一个Ova
的新实例,然后启动计时器
现在,您需要问的问题是,您启动了哪个Ova
stimer
…屏幕上的那个还是main
创建的那个
我可以看出,它是main
创建的,在屏幕上不可见
(可能的)解决办法
不要在JPanel
(或其他组件)内部创建JFrame
。我唯一一次会这样做是通过静态支持方法
public class Ova extends JPanel implements ActionListener {
int x = 0;
Timer timer = new Timer(100, this);
int y = 0, x1 = 5, y1 = 5;
public static void main(String[] ds) {
Ova ss = new Ova();
ss.nn();
}
private void nn() {
JFrame frame = new JFrame("fram");
frame.setSize(1000, 600);
JPanel as = new JPanel();
frame.add(as);
frame.add(new Ova());
frame.setVisible(true);
timer.start();
}
删除nn
方法,并将其替换为启动计时器的begin
(或类似的)方法
在main
方法中,创建Ova
的实例,将其添加到JFrame
的实例中,并调用Ova
的开始
方法
public class Ova extends JPanel implements ActionListener {
int x = 0;
Timer timer = new Timer(100, this);
int y = 0, x1 = 5, y1 = 5;
public static void main(String[] ds) {
Ova ss = new Ova();
ss.nn();
}
private void nn() {
JFrame frame = new JFrame("fram");
frame.setSize(1000, 600);
JPanel as = new JPanel();
frame.add(as);
frame.add(new Ova());
frame.setVisible(true);
timer.start();
}
导入java.awt.BorderLayout;
导入java.awt.Dimension;
导入java.awt.EventQueue;
导入java.awt.Graphics;
导入java.awt.event.ActionEvent;
导入java.awt.event.ActionListener;
导入javax.swing.JFrame;
导入javax.swing.JPanel;
导入javax.swing.Timer;
导入javax.swing.UIManager;
导入javax.swing.UnsupportedLookAndFeelException;
公共类Ova扩展JPanel实现ActionListener{
int x=0;
定时器=新定时器(100,本);
int y=0,x1=5,y1=5;
公共静态void main(字符串[]ds){
invokeLater(新的Runnable(){
@凌驾