JTextPane не обновляется после изменения значений

Код ниже. В основном то, что я пытаюсь сделать, это отображение в моей JPanel JTextPane. У меня есть кнопка, которая редактирует значение строки, которая должна отображаться в 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);

}


}

Большое спасибо!!


person jdawg495    schedule 21.07.2013    source источник
comment
Вы пробовали txtpnH.setText(newInfo)?   -  person David Pitre    schedule 22.07.2013
comment
setLayout(null) это моя первая область беспокойства, это просто усложнит вам задачу в долгосрочной перспективе   -  person MadProgrammer    schedule 22.07.2013
comment
@MadProgrammer Если ваш код не сгенерирован IDE.   -  person tbodt    schedule 22.07.2013
comment
@tbodt Тем не менее, вы взорветесь, когда впервые попытаетесь запустить его в системе, для которой он не был разработан.   -  person MadProgrammer    schedule 22.07.2013
comment
У меня уже был такой опыт с калькулятором. Это выглядело правильно в IDE, но не в реальной жизни.   -  person tbodt    schedule 22.07.2013
comment
@MadProgrammer Я использовал windowBuilder, чтобы изначально добавить свои кнопки и макет. Я полагал, что использовал AbsoluteLayout? Не уверен, что это прошло.   -  person jdawg495    schedule 22.07.2013
comment
@DavidPitre Я попробовал, но не смог получить к нему доступ.   -  person jdawg495    schedule 22.07.2013


Ответы (1)


  1. Уделите время прочтению условий кода для языка программирования Java.
  2. Используйте соответствующие менеджеры компоновки, см. Наглядное руководство по менеджерам компоновки и Использование менеджеров компоновки для получения дополнительной информации.
  3. Для чего бы это ни стоило, используйте JTextField вместо JTextPane, вы практически не получаете пользы, используя JTextPane для того, чего вы, кажется, пытаетесь достичь. На самом деле, вы можете быть лучше нас, просто используя JLabel, поскольку вы не хотите, чтобы их можно было редактировать.
  4. Избегайте переопределения контейнеров верхнего уровня, таких как JFrame, вместо этого начните с чего-то вроде JPanel, создайте на нем свой пользовательский интерфейс, а затем разверните его в любом контейнере верхнего уровня, который вы хотите.

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

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
        }
    }
person MadProgrammer    schedule 21.07.2013
comment
Итак, минус - любопытно понять, почему? Как это не отвечает на вопрос? Как это можно улучшить? Поскольку я не вижу других ответов, я могу только предположить, что либо вы не понимаете вопроса, либо не понимаете ответа :( - person MadProgrammer; 10.09.2020