Java 为什么不重新绘制JPanel中的按钮?

Java 为什么不重新绘制JPanel中的按钮?,java,swing,jframe,jpanel,repaint,Java,Swing,Jframe,Jpanel,Repaint,我不明白如何重新油漆();工作 我试图寻找一个教程,但没有找到任何东西和纳赛尔的'类似的问题'也没有真正的帮助 以下是我可以编写的最基本的代码,这些代码应该可以工作,但不能: 静态字符串done=“0”; 公共静态void main(字符串[]args){ JFrame=新JFrame(); frame.setresizeable(false); JPanel面板=新的JPanel(); 框架设置尺寸(800500); 帧设置位置(500400); frame.setDefaultCloseOp

我不明白如何重新油漆();工作

我试图寻找一个教程,但没有找到任何东西和纳赛尔的'类似的问题'也没有真正的帮助

以下是我可以编写的最基本的代码,这些代码应该可以工作,但不能:

静态字符串done=“0”;
公共静态void main(字符串[]args){
JFrame=新JFrame();
frame.setresizeable(false);
JPanel面板=新的JPanel();
框架设置尺寸(800500);
帧设置位置(500400);
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
JButton end=新JButton(完成);
end.addActionListener(新ActionListener(){
已执行的公共无效操作(操作事件e){
完成+=整数。值为(1);
panel.repaint();
}
});
面板。添加(ende);
框架。添加(面板);
frame.setVisible(true);
}

显然,这只是一个按钮,单击数字+1后应该重新绘制

跟进问题: 当面板位于另一个面板内时,如何告知面板重新绘制自身? 以下是应该可以工作的基本代码:

导入java.awt.Color;
导入java.awt.event.ActionEvent;
导入java.awt.event.ActionListener;
导入javax.swing.JButton;
导入javax.swing.JFrame;
导入javax.swing.JLabel;
导入javax.swing.JMenu;
导入javax.swing.JMenuBar;
导入javax.swing.JMenuItem;
导入javax.swing.JPanel;
导入javax.swing.border.border;
导入javax.swing.border.LineBorder;
公共类重绘
{
静态字符串done=“0”;
公共静态void main(字符串[]args)
{
新重绘();
}
公共重绘()
{
createframe();
}
public void createframe()
{
JFrame=新JFrame();
frame.setresizeable(false);
JPanel面板=新的JPanel();
框架设置尺寸(800500);
帧设置位置(500400);
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
BORD bo=新的线条边框(颜色为黑色);
JMenuBar=新的JMenuBar();
酒吧订单(bo);
JMenu菜单=新建JMenu(“编辑”);
JMenuItem stats=newjmenuItem(“编辑按钮”);
stats.addActionListener(新ActionListener()
{
已执行的公共无效操作(操作事件ev)
{
createbox();
}
});
添加(统计);
JLabel end=新的JLabel(完成);
添加(菜单);
frame.setJMenuBar(bar);
面板。添加(结束);
框架。添加(面板);
frame.setVisible(true);
}
public void createbox()
{
JFrame framebox=新的JFrame();
framebox.setresizeable(false);
JPanel panelbox=新的JPanel();
framebox.setSize(800500);
框架框。设置位置(500400);
JButton end=新JButton(完成);
end.addActionListener(新ActionListener()
{
@凌驾
已执行的公共无效操作(操作事件e)
{
完成+=字符串。值为(1);
framebox.dispose();
}
});
配电箱。添加(结束);
framebox.add(panelbox);
framebox.setVisible(true);
}
}

基本上,按下第2帧中的按钮会将字符串“done”的数量增加1。但它不会在原始帧中重新绘制。

如果要在
JButton
上的数字上添加1并显示它,则无需使用
repaint()
方法

这无关紧要

相反,您可以只使用
setText()
方法

代码:

repaint()
方法与
Java
中的
Graphics/Graphics2D
相关。当我们想要更改组件的外观时,会调用它


好的,我已经尝试解决了你们的两个问题,尽管我不完全确定你们的程序要做什么

首先,你接受的答案实际上是错误的。我猜另一个评论者忘记了变量
done
实际上是
String
类型,这意味着操作符
+=
实际上不做任何数学运算,它只是附加字符串。简单地说,运算符不向
done
添加1,而是将文本字符串值
1
添加到
done
。因此,如果
done
的值为0,您单击带有该代码的按钮,它将附加1,
done
现在将具有值
01
。如果再次单击它,它将生成
字符串
011
,依此类推

要纠正这个小错误,只需将
字符串
解析为
整数
,然后就可以对其使用数学运算符

关于你的第二个问题,我再次阅读了你的问题和你的代码,现在我似乎误解了我对另一个答案的评论。我试图不改变代码的底层逻辑,因此在
JButton
的功能方面,我偏离了代码。在原始代码中,按钮递增
done
,并且按钮应该显示该文本。该按钮也是此帧的关闭操作,因为您正在按钮的
actionPerformed()
调用中调用
dispose()

如果这是应该发生的事情(每次按下时关闭帧的按钮),那么您甚至不需要
WindowListener
或覆盖任何内容,您只需在
actionPerformed()
调用中执行您想要的任何操作即可

代码:

公共类重新绘制
{
字符串done=“0”;
JFrame框架;
JPanel小组;
边界波;
JMenuBar条;
JMenu菜单;
项目统计;
JLabel-endLabel;
JButton end = new JButton(done);
end.addActionListener(new ActionListener() {
    @Override
    public void actionPerformed(ActionEvent e) {
        done = done + "1";
        end.setText(done);
    }
});