2013-07-21 74 views
0

代码位于下方。基本上我想要做的是在JTextPane的JPanel中进行显示。我有一个按钮,它编辑应该显示在JTextPane中的字符串的值。但我无法弄清楚如何更新JTextPane。我试过重新验证(),验证(),重绘(),这些似乎没有工作。JTextPane在值更改后未更新

代码完整,应该可以运行。

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

} 


} 

非常感谢!

+0

你试过txtpnH.setText(newInfo)吗? –

+1

'setLayout(null)'是我第一个关注的领域,这会让你长期以来更加困难 – MadProgrammer

+0

@MadProgrammer除非你的代码是由IDE生成的。 – tbodt

回答

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开始,建立在它的用户界面和然后将其部署到您想要的任何顶级容器。

您遇到的问题是一个参考问题。在您的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 
     } 
    } 
+0

好的。非常感谢!! – jdawg495