以编程方式设置JLabel文本

时间:2012-09-19 20:26:20

标签: java swing jframe jpanel

所以我试图让JLabel在这段代码中工作。我可以让按钮和Action Listener工作,但不能使用Label。 MyDice是我创建面板和按钮的地方。

public class MyDice
{
    public static void main(String[] args)
    {
        JFrame frame = new JFrame("MyDice v1.0");
        frame.setSize(800,600);
        frame.setLocation(560, 240);
        frame.setResizable(false);
        frame.setVisible(true);
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

        JPanel panel = new JPanel();
        panel.setBackground(new Color(200,200,200));
        panel.setSize(800,600);
        frame.add(panel);
        panel.setVisible(true);

        JButton button_d4    = new JButton("Roll d4");
        panel.add(button_d4);
        button_d4.addActionListener   (new MyRoll(4,panel));
    }
}

当我点击按钮时,MyRoll就是我获得Action Listener的地方。

public class MyRoll implements ActionListener
{
    int dice;
    JPanel panel;

    public MyRoll (int dice, JPanel panel)
    {
        this.dice = dice;
        this.panel = panel;
    }

    public void actionPerformed(ActionEvent e)
    {
        rollDice(dice,1);
    }

    public void rollDice (int dice, int times)
    {
        int r=0;
        for (int i=0; i<times;i++)
        {
            double rand = Math.random();
            rand = rand*dice + 1;
            r = (int) rand;
        }

            System.out.println("You rolled "+r+" out of "+dice);

        JLabel output = new JLabel();
        output.setText("You rolled "+r+" out of "+dice);
        panel.add(output);

    }
}

但是,最后一部分不起作用。有什么想法吗?

3 个答案:

答案 0 :(得分:2)

使用JLabel并在逻辑中设置标签消息

修订更新后的代码

您应该在逻辑之外设置标签,使用初始空值添加到面板,然后在逻辑上更改标签的值

//Setting up your GUI
JLabel label = new JLabel("");
panel.add(label);


//Within your Logic method
System.out.println("Printing info");
label.setLabel("Printing info");

这样你就不会经常向你的Panel添加JLabel

答案 1 :(得分:2)

请查看以下代码:

    JLabel output = new JLabel(); 
    output.setText("You rolled "+r+" out of "+dice); 
    panel.add(output);

每次单击按钮时,您都会在面板中添加一个新JLabel(恰好位于主框架中)。但是,你没有什么可以告诉它重绘自己。

我建议解决此问题的方法是创建JLabel并将其添加到JPanel中的main(),并将JLabel引用传递给MyRoll类。然后,您可以随时拨打setText()。您确实不需要JPanelMyRoll的引用;您只需要引用JLabel

p.s。我想对您的main()方法发表一些评论。特别是,如果以不同方式组织代码,可以稍微简化一下。通常,创建Swing GUI遵循以下步骤:

  1. 创建JFrame

  2. 创建JPanel

  3. 将组件添加到JPanel

  4. JPanel添加到JFrame

  5. 设置JFrame可见。

  6. 请注意,您只需要在setVisible()上致电JFrame,如果您最后这样做的话。这将自动调用setVisible()及其所有子组件上的JPanel

答案 2 :(得分:0)

如果您正在寻找刷新方法,那么我就不知道。 相反,您可以设置一个线程,根据您提供的逻辑更新输出。