0

代码在下面。基本上我想要做的是在我的 JTextPane 的 JPanel 中进行显示。我有一个按钮,用于编辑应该在 JTextPane 中显示的字符串的值。但是,我不知道如何更新 JTextPane。我已经尝试过 revalidate()、validate()、repaint(),这些似乎都不起作用。

代码完成了,应该可以运行了。

导入 java.awt.Canvas;

public class windowBuild extends JFrame {

/**
 * 
 */
private static final long serialVersionUID = 1L;
private JPanel contentPane;
private int health = 20;
private int energy = 4;

/**
 * Launch the application.
 */
public static void main(String[] args) {
    EventQueue.invokeLater(new Runnable() {
        public void run() {
            windowBuild frame = new windowBuild();
            frame.setVisible(true);

        }
    });
}

private class ButtonHandler implements ActionListener {

    public void actionPerformed(ActionEvent e) {
        String which = e.getActionCommand();
        if (which.equals("Claw")){
            energy = energy-1;
            System.out.println("Player one's dragon clawed the opponent. Dragon's energy is now at: "+ energy);}
        else if (which.equals("Wait")){
            System.out.println("Turn succesfully skipped");}
        System.out.println(getEnergy());



    }

}


public windowBuild() {
    ButtonHandler bh;
    System.out.println("Starting frame...");
    bh = new ButtonHandler();
    setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    setBounds(100, 100, 800, 600);
    contentPane = new JPanel();
    contentPane.setBorder(new TitledBorder(null, "Dragon Duel",
            TitledBorder.CENTER, TitledBorder.TOP, null, Color.CYAN));
    setContentPane(contentPane);
    contentPane.setLayout(null);

    JButton btnClaw = new JButton("Claw");
    btnClaw.setBounds(288, 511, 109, 39);
    contentPane.add(btnClaw);
    btnClaw.addActionListener(bh);
    if (energy == 0)
        btnClaw.setEnabled(false); 
    JButton btnWait = new JButton("Wait");
    btnWait.setBounds(645, 511, 109, 39);
    contentPane.add(btnWait);
    btnWait.addActionListener(bh);

    StringBuilder sb = new StringBuilder();
    String strB = Integer.toString(health);
    sb.append("H: ").append(strB).append("/20");
    String healthString = sb.toString();

    JTextPane txtpnH_1 = new JTextPane();
    txtpnH_1.setEditable(false);
    txtpnH_1.setFont(new Font("Impact", Font.PLAIN, 30));
    txtpnH_1.setText(healthString);
    txtpnH_1.setBounds(134, 511, 109, 39);
    contentPane.add(txtpnH_1);

    String strR = Integer.toString(energy);
    String energyString = "E: ";
    energyString += strR;
    energyString += "/4";

    JTextPane txtpnH = new JTextPane();
    txtpnH.setEditable(false);
    txtpnH.setText(energyString);
    txtpnH.setFont(new Font("Impact", Font.PLAIN, 30));
    txtpnH.setBounds(39, 511, 85, 39);
    contentPane.add(txtpnH);

}


}

非常感谢!!

4

1 回答 1

1
  1. 花时间阅读Java 编程语言的代码约定
  2. 使用适当的布局管理器,有关更多详细信息,请参阅布局管理器的可视化指南使用布局管理器
  3. 为了它的价值,请JTextField改用,通过使用您似乎想要实现的目标JTextPane,您几乎没有获得任何好处。JTextPane实际上,您实际上可能比我们更好使用JLabel,因为您不希望它们可编辑
  4. 避免覆盖顶级容器,例如JFrame,而是从类似的东西开始,JPanel在其上构建您的 UI,然后将其部署到您想要的任何顶级容器。

您遇到的问题是参考问题。在您的构造函数中windowBuild,您正在定义所有 UI 组件。这意味着您无法在程序的其他任何地方引用它们。相反,使您需要引用的那些组件在其他实例字段中。

public class WindowBuild extends JFrame {
    //...//
    private JTextPane txtpnH_1;
    private JTextPane txtpnH;

    //...//
    public WindowBuild() {
        //...//
        txtpnH_1 = new JTextPane();
        //...//
        txtpnH = new JTextPane();
        //...//
    }

    private class ButtonHandler implements ActionListener {

        public void actionPerformed(ActionEvent e) {
            String which = e.getActionCommand();
            // Now you can use txtpnH_1.setText and txtpnH.setText
        }
    }
于 2013-07-21T23:37:25.893 回答