Java JLabel不更新

Java JLabel不更新,java,swing,jframe,jpanel,jbutton,Java,Swing,Jframe,Jpanel,Jbutton,所以谢谢你看我的问题,不管怎样,我正在尝试制作一个cookie clicker克隆(如果你可以这样称呼它),你点击按钮,JPanel更新,不幸的是JPanel没有更新,我只是在其他地方找不到答案,任何帮助都是有价值的帮助,谢谢!这是我的密码: public int numCookies; public main(){ //JButton JButton click = new JButton("Click"); click.setLayout(null);

所以谢谢你看我的问题,不管怎样,我正在尝试制作一个cookie clicker克隆(如果你可以这样称呼它),你点击按钮,JPanel更新,不幸的是JPanel没有更新,我只是在其他地方找不到答案,任何帮助都是有价值的帮助,谢谢!这是我的密码:

    public int numCookies;

public main(){

    //JButton
    JButton click = new JButton("Click");
    click.setLayout(null);
    click.setLocation(50, 50);
    click.setSize(80, 50);
    click.addActionListener(new ActionListener(){
        public void actionPerformed(ActionEvent arg0){
            numCookies = numCookies + 1;
        }
    });

//JLabel
JLabel cookies = new JLabel();
cookies.setLayout(null);
cookies.setText("Cookies:" + numCookies);
cookies.setLocation(480/2,10);
cookies.setSize(200, 50);

    //JPanel
JPanel panel = new JPanel();
    panel.setLayout(null);
    panel.setLocation(10, 0);
    panel.setSize(260, 30);
    panel.add(click);
    panel.add(cookies);

    //JFrame
    JFrame frame = new JFrame("Cookie clicker!");
    frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    frame.setSize(600, 480);
    frame.setLocationRelativeTo(null);
    pack();
    frame.setVisible(true);
    frame.add(panel);

}

public static void main(String args[]){

    new main();

}

在actionPerformed方法中设置JLabel的文本,如下所示:

click.addActionListener(new ActionListener(){
    public void actionPerformed(ActionEvent arg0){
        numCookies = numCookies + 1;
        cookies.setText("Cookies:" + numCookies);
    }
});
三件事

一。。。 使用
null
布局。当事情出错时,不要感到惊讶。当使用
JLabel
JButton
时,除非您打算实际添加一些内容,否则不需要触摸这些布局管理器

利用

两个。。。 在完成填充之前,在帧上调用
setVisible

JFrame frame = new JFrame("Cookie clicker!");
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.setSize(600, 480);
frame.setLocationRelativeTo(null);
// No idea what you expect this to be doing...
pack();
//frame.setVisible(true);
frame.add(panel);    
// This belongs here...and you shouldn't pack a window until
// it's ready to be made visible...
frame.setVisible(true);
三。。。 您似乎期望标签会神奇地出现,因为值
numCookies
已更改

click.addActionListener(new ActionListener(){
    public void actionPerformed(ActionEvent arg0){
        numCookies = numCookies + 1;
        // ??????
    }
您需要将该值重新指定给标签,以便更新标签

例如

public main(){
    //JLabel
    // Make the lable final...so we can access from witin
    // the listener...
    final JLabel cookies = new JLabel();
    cookies.setText("Cookies:" + numCookies);

    //JButton
    JButton click = new JButton("Click");
    click.addActionListener(new ActionListener(){
        public void actionPerformed(ActionEvent arg0){
            numCookies = numCookies + 1;
            cookies.setText("Cookies:" + numCookies);
        }
    });
奖金 确保你通读并理解

…仅仅因为
null
布局让我非常恼火

import java.awt.EventQueue;
import java.awt.GridBagConstraints;
import java.awt.GridBagLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.UIManager;
import javax.swing.UnsupportedLookAndFeelException;

public class Main {

    public int numCookies;

    public Main() {

        final JLabel cookies = new JLabel();
        cookies.setText("Cookies:" + numCookies);

        JButton click = new JButton("Click");
        click.addActionListener(new ActionListener() {
            public void actionPerformed(ActionEvent arg0) {
                cookies.setText("Cookies:" + (++numCookies));
            }
        });

        //JFrame
        JFrame frame = new JFrame("Cookie clicker!");
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        frame.setLayout(new GridBagLayout());
        GridBagConstraints gbc = new GridBagConstraints();
        gbc.gridwidth = GridBagConstraints.REMAINDER;
        frame.add(cookies, gbc);
        frame.add(click, gbc);
        frame.pack();
        frame.setLocationRelativeTo(null);
        frame.setVisible(true);

    }

    public static void main(String args[]) {
        EventQueue.invokeLater(new Runnable() {
            @Override
            public void run() {
                try {
                    UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName());
                } catch (ClassNotFoundException | InstantiationException | IllegalAccessException | UnsupportedLookAndFeelException ex) {
                }
                new Main();
            }
        });
    }
}

我看到
setLayout(null)
并且您不会对出现问题感到惊讶……使用适当的、无执行程序的Java GUI可能必须在多种平台上、不同的屏幕分辨率和不同的PLAF上工作。因此,它们不利于部件的精确放置。要为健壮的GUI组织组件,请改为使用布局管理器,或者与布局填充和边框一起使用。