当前位置: 首页 > 知识库问答 >
问题:

添加带有循环的JButton并在按下时更改它们

明松
2023-03-14

我试图构建一个程序,解析XML文件并使用XML属性生成GUI。它使用循环生成JButton并将其添加到GUI中,这样它就可以根据需要拥有任意多个按钮。当按下按钮时,GUI应该会刷新,显示新按钮。这是我到目前为止得到的:

import java.awt.BorderLayout;

import java.awt.EventQueue;

import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.border.EmptyBorder;
import javax.swing.JButton;
import java.awt.GridLayout;
import java.awt.event.ActionListener;
import java.awt.event.ActionEvent;
import javax.swing.JTextPane;
import javax.swing.JTextArea;
import java.io.*;
import java.util.*;
import org.jdom.*;
import org.jdom.input.SAXBuilder;

public class TextAdventureGUI extends JFrame implements ActionListener {

    private JPanel contentPane;
    /**
     * @wbp.nonvisual location=-20,79
     */
    private final JPanel panel = new JPanel();

    /**
     * Launch the application.
     */
    public static void main(String[] args) {
        EventQueue.invokeLater(new Runnable() {
            public void run() {
                try {

                    File inputFile = new File("input");
                    SAXBuilder saxB = new SAXBuilder();

                    Document doc = saxB.build(inputFile);

                    Element storyElement = doc.getRootElement();

                    List<Element> scenesList = storyElement.getChildren();

                    Element sceneElement = scenesList.get(1);
                    List<Element> choicesList = sceneElement.getChildren();

                    TextAdventureGUI frame = new TextAdventureGUI(sceneElement, choicesList);
                    frame.setVisible(true);


                } catch (Exception e) {
                    e.printStackTrace();
                }
            }
        });
    }

    /**
     * Create the frame.
     */
    public TextAdventureGUI(Element scene, List<Element> choices) {


        setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        setBounds(100, 100, 482, 311);
        contentPane = new JPanel();
        contentPane.setBorder(new EmptyBorder(5, 5, 5, 5));
        setContentPane(contentPane);
        contentPane.setLayout(new GridLayout(5, 0));

        //String buttonNames[] = {"choice1", "choice2", "choice3", "choice4", "choice5"};
        JButton[] cButtons = new JButton[18];

        for(int temp = 1; temp <= choices.size(); temp++)
        {
            Element choice = choices.get(temp);
            //String bName = buttonNames[temp];
            cButtons[temp] = new JButton(choice.getChildText("choiceDescription"));
            cButtons[temp].addActionListener(this);
            contentPane.add(cButtons[temp]);

        }

        JTextArea textArea = new JTextArea(scene.getChildText("sceneDescription"));
        textArea.setBounds(5, 11, 451, 104);
        contentPane.add(textArea);

    }

    @Override
    public void actionPerformed(ActionEvent e) {
        // TODO Auto-generated method stub

    }
}

这是我正在解析的XML:

<?xml version = "1.0"?>
<Story>
    <Scene id = "scene1">
        <SceneDescription>Insert Scene Description
        </SceneDescription>

        <choice no="1">
            <choiceDescription>choice description 1 </choiceDescription>
            <outcome>end1</outcome>
        </choice>

        <choice no="2">
            <choiceDescription>choice description 2 </choiceDescription>
            <outcome>scene3</outcome>
        </choice>
    </Scene>

    <Scene id = "scene2">
        <SceneDescription>This is the scene to parse
        </SceneDescription>

        <choice no="1">
            <choiceDescription>choice description 1 </choiceDescription>
            <outcome>scene1</outcome>
        </choice>

        <choice no="2">
            <choiceDescription>choice description 2 </choiceDescription>
            <outcome>scene3</outcome>
        </choice>
    </Scene>

    <Scene id = "scene3">
        <SceneDescription>Insert Scene Description
        </SceneDescription>

        <choice no="1">
            <choiceDescription>choice description 1 </choiceDescription>
            <outcome>end1</outcome>
        </choice>

        <choice no="2">
            <choiceDescription>choice description 2 </choiceDescription>
            <outcome>scene1</outcome>
        </choice>
    </Scene>

    <Scene id = "end1">
        <SceneDescription>ending
        </SceneDescription>

    </Scene>

</Story>

我不知道从这里去哪里,我不想有另一个循环在第一个循环中制作新按钮,但我想不出一种方法来构建第二个循环,它自己仍然保持我的变量在范围内,或者理想地重新使用同一个循环来显示新按钮,如果有人比我更好地理解GUI构建,可以给我一些关于如何使这项工作的建议,我将不胜感激。

共有1个答案

狄宾实
2023-03-14

我已经将其更改为使用JList而不是修复问题的JButton

 类似资料:
  • 这款应用目前以黑色背景开始。我想要一个在黑色背景上写着“警告可能会导致癫痫发作”的标签,一旦屏幕被按下,标签就会消失。这真的很简单,但我是新手

  • 问题内容: 在执行do-while循环时,让JButton重复更新(与计时器一起使用)时遇到了一些麻烦。我正在开发一个简单的游戏,在10 * 10的图块对象网格上玩,该对象对应于具有100个按钮的JButton arrayList。 程序的此部分处理简单的寻路(即,如果我单击角色,然后单击一个空的图块,则角色将在到达目标的途中在每个图块中移动)。每个步骤之间都有一定的延迟,因此用户可以看到角色的进

  • 我在php中工作,现在我正在将时循环应用于我的代码。我正在从数据库中获取数据。现在我必须将该数据应用于页面中的一个Div。 我的问题是"div类="项目活动"在循环中每次活动类都需要。现在我想改变它,就像在第一个循环过程之后,当第二个开始时,我想把那个div改变成这个"div类="项目"。 我对这个循环过程不太熟悉,所以我无法解决这个问题。需要帮助。谢谢

  • 如何显示一个计数器从1到2到3再到n的按钮点击。我尝试在for循环中执行setState,但不起作用。我知道React的setState是异步的,我甚至尝试过使用prevState,但它不起作用。 https://www.webpackbin.com/bins/-kku1nja-ectflydgf_s 我想把计数从0增加到n,作为点击时的定时器。

  • } 完整错误消息:

  • 问题内容: 我正在用Java开发游戏,面临以下挑战。 我有2个,需要在视觉上将形状从一个拖动到另一个。我有使用这个工作从。当我按下鼠标拖动形状时,激活该形状并将其转移到glassPane。因此,您需要将状态从转移到。我通过使用Robot类解决了这个问题,该类模拟了glassPane被激活后的另一个事件。 现在出现了问题,此解决方法仅在Windows上有效,而不适用于mac osx,在osx上,只要