更改值后JTextPane不更新

时间:2013-07-21 22:57:15

标签: java swing jtextpane

代码在下面。基本上我正在尝试做的是我在JTextPane的JPanel中显示。我有一个按钮,用于编辑应该在JTextPane中显示的字符串的值。我无法弄清楚如何更新JTextPane。我尝试过revalidate(),validate(),repaint(),但这些似乎都没有用。

代码已完成,应该能够运行。

import 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);

}


}

非常感谢!!

1 个答案:

答案 0 :(得分:2)

  1. 花点时间阅读Code Conventions for the Java Programming Language
  2. 使用适当的布局管理器,有关详细信息,请参阅A Visual Guide to Layout ManagersUsing Layout Managers
  3. 对于它的价值,使用JTextField而不是JTextPane,使用JTextPane来实现您想要实现的目标几乎没有任何好处。事实上,你可能实际上只是使用JLabel对我们更好,因为你不希望它们是可编辑的
  4. 避免覆盖顶级容器,例如JFrame,而是从JPanel开始,在其上构建您的UI,然后将其部署到您想要的顶级容器。
  5. 您遇到的问题是参考问题。在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
            }
        }