2013-07-21 4 views
0

Код внизу. В основном, что я пытаюсь сделать, так это отображение в моем JPanel JTextPane. У меня есть кнопка, которая редактирует значение строки, которая должна отображаться в JTextPane. Однако я не могу понять, как обновить JTextPane. Я пробовал revalidate(), validate(), repaint(), ни один из них не работал.JTextPane не обновляется после изменения значений

Код завершен, он должен иметь возможность запуска.

импорт 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 Managers и Using Layout Managers для более подробной информации
  3. Для чего это стоит, использовать JTextField вместо JTextPane, вы получите немного нет пользы от использования JTextPane за то, чего вы пытаетесь достичь. На самом деле, вы можете быть на самом деле лучше нас, используя JLabel, если вы не хотите, чтобы их редактировали.
  4. Избегайте переопределения контейнеров верхнего уровня, например JFrame, вместо этого начните с чего-то вроде JPanel, создайте свой интерфейс на нем и затем разворачивайте его в какой-либо контейнер верхнего уровня, который вы хотите.

Проблема, с которой вы столкнулись, является справочной проблемой. В конструкторе вашего windowBuild вы определяете все компоненты своего пользовательского интерфейса. Это означает, что вы не можете ссылаться на них где-нибудь еще с вашей программой. Вместо этого создайте те компоненты, которые вам нужны, чтобы ссылаться на else, где указаны поля экземпляра.

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

Смежные вопросы