【问题标题】:Refresh panel when a button in clicked单击按钮时刷新面板
【发布时间】:2015-10-09 18:20:53
【问题描述】:

我有一个 MainPanel,其中包含 2 个其他面板(显示随机数)和一个 Next 按钮。当我单击下一个按钮时,我想显示另一个数字组合。我无法做到这一点。

我的挥杆一般。我知道如何使用面板、按钮和监听器(不确定)。但是如何链接它们没有!!!。

我的代码:

public class Test extends JFrame implements MouseListener {


  JPanel mainPanel = new JPanel(new GridLayout(1, 1, 5, 5));
  JPanel panel1 = new JPanel();
  JPanel panel2 = new JPanel();
  JLabel label1 = new JLabel();
  JLabel label2 = new JLabel();
  JPanel buttonPanel = new JPanel();
  JButton next = new JButton();

public void randomNumber(){
    int randomNumber1 = 0;
    int randomNumber2 = 0;
    randomNumber1 = 1 + (int) (Math.random() * 9);
    randomNumber2 = 1 + (int) (Math.random() * 9);

    label1.setText(String.valueOf(randomNumber1));
    label2.setText(String.valueOf(randomNumber2));        
}


public Test(){

   panel1.setBorder(BorderFactory.createEmptyBorder(15, 15, 15, 15));
   panel2.setBorder(BorderFactory.createEmptyBorder(15, 15, 15, 15));
   panel1.setBackground(Color.red);
   panel2.setBackground(Color.yellow);    

   panel1.add(label1);
   panel2.add(label2);       

   next.setText("Next");

   mainPanel.add(panel1);
   mainPanel.add(panel2);
   buttonPanel.add(next);

   this.add(mainPanel, BorderLayout.NORTH);
   this.add(buttonPanel,BorderLayout.CENTER);

   initUI();
}

/**
 *
 */
public final void initUI()
{
    setTitle("Test");
    setSize(800, 400);
    setLocationRelativeTo(null);
    setVisible(true);
    this.setResizable(false);
    setDefaultCloseOperation(EXIT_ON_CLOSE);
}

public void actionPerformed(ActionEvent event) {
Object source = event.getSource();
  if (source instanceof JButton) randomNumber()  ;
}


/**
 *
 * @param args
 */
public static void main(String[] args){
      Test game = new Test();
      game.setVisible(true);
    }    

}

【问题讨论】:

  • 为什么不能用数字更新标签?
  • 我不知道,当我单击“下一步”按钮时似乎没有任何效果。我尝试了很多方法,但没有结果
  • 你的意思是,我不需要通过面板。
  • 但是,这是我做对了???

标签: java swing


【解决方案1】:

我稍微清理了您的代码。这是你的 GUI。

我为您的下一个按钮添加了一个动作监听器。我确保您的 JFrame 代码以正确的顺序执行。

代码如下:

package com.ggl.testing;

import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.GridLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;

import javax.swing.BorderFactory;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.SwingUtilities;

public class Test27 implements Runnable {

    JPanel mainPanel = new JPanel(new GridLayout(1, 1, 5, 5));
    JPanel panel1 = new JPanel();
    JPanel panel2 = new JPanel();
    JLabel label1 = new JLabel();
    JLabel label2 = new JLabel();
    JPanel buttonPanel = new JPanel();
    JButton next = new JButton();

    @Override
    public void run() {
        JFrame frame = new JFrame();
        frame.setTitle("Test");
        frame.setLocationRelativeTo(null);
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

        panel1.setBorder(BorderFactory.createEmptyBorder(15, 15, 15, 15));
        panel2.setBorder(BorderFactory.createEmptyBorder(15, 15, 15, 15));
        panel1.setBackground(Color.red);
        panel2.setBackground(Color.yellow);

        panel1.add(label1);
        panel2.add(label2);

        next.setText("Next");
        next.addActionListener(new RandomNumber());

        mainPanel.add(panel1);
        mainPanel.add(panel2);
        buttonPanel.add(next);

        frame.add(mainPanel, BorderLayout.NORTH);
        frame.add(buttonPanel, BorderLayout.CENTER);

        randomNumber();

        frame.pack();
        frame.setVisible(true);
    }

    public void randomNumber() {
        int randomNumber1 = 0;
        int randomNumber2 = 0;
        randomNumber1 = 1 + (int) (Math.random() * 9);
        randomNumber2 = 1 + (int) (Math.random() * 9);

        label1.setText(String.valueOf(randomNumber1));
        label2.setText(String.valueOf(randomNumber2));
    }

    public static void main(String[] args) {
        SwingUtilities.invokeLater(new Test27());
    }

    public class RandomNumber implements ActionListener {

        @Override
        public void actionPerformed(ActionEvent event) {
            randomNumber();
        }

    }
}

【讨论】:

    【解决方案2】:

    您不应该实现MouseListener,而应该实现ActionListener

    您应该在 Test 构造函数的末尾添加

    randomNumber(); // Show the number when the application starts
    next.addActionListener(this); // actionPerformed will now recieve signals from 'next' button
    

    【讨论】:

    • 啊,谢谢伙计,当我看到 MouseListener 时,我真的被吓到了
    猜你喜欢
    • 2014-04-10
    • 2013-10-10
    • 2015-07-05
    • 2016-11-07
    • 1970-01-01
    • 1970-01-01
    • 2018-06-18
    • 1970-01-01
    相关资源
    最近更新 更多