【问题标题】:Running Code after a button is clicked with GUI使用 GUI 单击按钮后运行代码
【发布时间】:2015-12-23 14:02:29
【问题描述】:

我想知道如何在用户按下按钮后运行一段代码。在这种情况下,我要求用户在文本字段中输入他们的姓名(如下所示)

    TextField textField = new TextField();
    textField.setBounds(104, 271, 517, 48);
    contentPane.add(textField);

然后在用户单击“下一步”后,我希望 GUI 移动到另一行更改 GUI 布局的代码。

我假设我需要在这里放一些东西,然后在其他地方运行另一行代码,

    JButton Next = new JButton("Next");
    Next.addMouseListener(new MouseAdapter() {
        @Override
        //Would I need to put something here?
        public void mouseClicked(MouseEvent e) {

        }
    });

详情

我想做的是创建一个游戏。我希望用户能够输入他们的姓名,然后我希望用户能够单击一个显示“下一步”的按钮,然后一旦按下该按钮,我希望 Java 程序中的内容发生变化。即,将文本更改为其他内容。

在用户输入他们的游戏详细信息(名称、首选类别、性别等)后,我会删除组件,然后有一个图像,在某个时候,它们的健康状况。

【问题讨论】:

  • 看起来你的做法是错误的。解释你想要做什么并向我们展示 GUI 的样子。更改 GUI 布局的按钮听起来很可疑。
  • 在我看来,您需要 CardLayout 或 JDialog / JOptionPane 来获取初始详细信息,然后才显示主框架。
  • 那么最好的办法就是学习如何手动编写代码。我在你之前的问题中链接了教程。
  • 不要使用空布局(即 setBounds)。而是使用Layout Managers 或它们的组合。此外,您的变量名称应以小写字母开头,请参阅naming conventions。而不是使用 TextField 尝试使用 Swing 的 JTextField
  • "TextField textField .." 应该是 JTextField textField ..(使用基于 Swing 的文本字段,而不是 AWT 的!)。为了尽快获得更好的帮助,请发布minimal reproducible example 或Short, Self Contained, Correct Example。但我不得不说我同意 @Frakcool 和 user1803551 关于使用布局的观点。

标签: java swing


【解决方案1】:

您可以使用 CardLayout 来更改 GUI 外观。 GUI 的每个“屏幕”都由一张卡片表示。某些事件(例如按下按钮)可以触发显示新卡片,从而显示 GUI 的新屏幕。

import java.awt.CardLayout;
import java.awt.FlowLayout;
import java.awt.event.ActionListener;
import java.awt.event.ActionEvent;
import javax.swing.*;

class Game{  

   /* This JPanel will manage all the cards we create */ 
   JPanel cards = new JPanel(new CardLayout()); 

   JTextField jtfName;
   JButton    jbtName;
   String     name;

   Game(){

      JFrame jfrm = new JFrame("Game");
      jfrm.setSize(200, 220);
      jfrm.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

      /* Setup card 1: This card asks for a username
       * and then changes to the next screen when the 
       * user clicks the "next" button.
       */
      JPanel card1 = new JPanel(new FlowLayout());
      jtfName = new JTextField(15);
      jbtName = new JButton("Next");
      jbtName.addActionListener(new ActionListener(){
         public void actionPerformed(ActionEvent ae){  
            /* Make sure a username was entered */
            if (!jtfName.getText().equals("")){ 
               name = jtfName.getText();
               swapCards("card2");
            }
         }
      });
      card1.add(new JLabel("Name:"));
      card1.add(jtfName);
      card1.add(jbtName);

      /* Setup card 2 */
      JPanel card2 = new JPanel(new FlowLayout());
      card2.add(new JLabel("Game stuff here ... "));

      /* Add cards to the controlling card. */
      cards.add(card1, "card1");
      cards.add(card2, "card2");

      /* Add the cards panel to the Frame and display */
      jfrm.add(cards);
      jfrm.setVisible(true);
   }

   /* Method to swap cards based on their name.
    * This is what actually changes the screen.
    */
   private void swapCards(String card){
      CardLayout cl = (CardLayout)(cards.getLayout());
      cl.show(cards, card);
   }

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

【讨论】:

    【解决方案2】:

    如果您使用的是 netbeans ,请右键单击设计选项卡下的按钮并选择事件 Mouse -> MouseClicked 。 它将创建一个处理此事件的 void。 输入您想在按下按钮后输入的代码。

    【讨论】:

    • 我正在使用 Eclipse,但无论如何我都会尝试。没有更快的方法吗?
    • 如果您想要一个体面且可维护的 gui 代码,请不要使用 netbeans 所见即所得。您需要添加一个 ActionListener,而不是 MouseListener
    • 我已经按照 Ayman 的建议做了,但小组都留在那里。有什么办法可以改变吗?
    • @JordonMyers :您阅读其他答案了吗?你需要一个 ActionListener 并且你需要 actionPerformed(ActionEvent event){} 方法中的代码,如果那里什么都没有,很明显它不会做任何事情
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-03-15
    • 2013-03-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-04-23
    相关资源
    最近更新 更多