JLabel没有更新

时间:2014-03-14 05:04:43

标签: java swing jframe jpanel jbutton

所以感谢您查看我的问题,好吧,无论如何我试图制作一个cookie点击器克隆(如果你可以称之为),你点击按钮和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();

}

2 个答案:

答案 0 :(得分:1)

三件事......

一...

使用null布局。当事情出错时不要感到惊讶。使用JLabelJButton时,除非您打算实际向其添加内容,否则您无需触及布局管理器。

利用approriate layout managers

二...

在您完成填写之前在您的框架上调用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);
        }
    });

加成

请务必仔细阅读并理解Initial Threads

...只是因为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();
            }
        });
    }
}

答案 1 :(得分:0)

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

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