Как перерисовать Java-апплет

У меня есть следующий код, который представляет собой простой апплет, который преобразует градусы Цельсия в градусы Фаренгейта.

Если введено правильное число и нажата кнопка, температура преобразуется и отображается без проблем. Однако, если текстовое поле содержит недопустимую запись, сообщение должно отображаться на метке на панели ошибок, но этого не произойдет, если я не изменю размер апплета. Так вот вопрос "Как перекрасить!!!"

import java.applet.Applet;
import java.awt.*;
import java.awt.event.*;
import javax.swing.*;

public class TemperatureConverter extends Applet{

private JLabel lblCel=new JLabel("Celsius Temperature   :");
private JLabel lblFar=new JLabel("Fahrenheit value      :");
private JLabel lblResult=new JLabel("");
private JLabel lblError=new JLabel("");
private JTextField txtFahr;
private JPanel celsPanel;
private JPanel farPanel;
private JPanel errorPanel;
private JButton btnEnter = new JButton("Convert");
public double temp = 0.0;

public void init(){



    celsPanel = new JPanel(new GridLayout(1,3,2,2));
    celsPanel.add(lblCel);
    txtFahr = new JTextField(50);
    celsPanel.add(txtFahr);
    btnEnter.addActionListener(new ActionListener() {       
        @Override
        public void actionPerformed(ActionEvent arg0) {
            try{
                temp = Double.parseDouble(txtFahr.getText());
                double X = (temp - 32)* 0.69;
                lblResult.setText(String.valueOf(X));
                lblError.setText(" ");
            }
            catch(NumberFormatException ex){
                lblError.setText("Invalid Celsius Value");
            }
        }
    });
    celsPanel.add(btnEnter);

    farPanel = new JPanel(new GridLayout(1,2,2,2));
    farPanel.add(lblFar);
    lblResult.setSize(100, 30);
    farPanel.add(lblResult);

    errorPanel = new JPanel();
    lblError.setSize(100, 30);
    errorPanel.add(lblError);

    setLayout(new GridLayout(3,2,2,2));
    add(celsPanel);
    add(farPanel);
    add(errorPanel);
    setSize(550,200);

}

}

Кто-нибудь может это понять? Я думал о проблеме с размером этикетки, но тогда я не уверен в этом.


person joe    schedule 23.02.2013    source источник
comment
почему этот вопрос заслуживает -1? похоже, что голосование против стало национальным спортом некоторых людей здесь: O   -  person joe    schedule 23.02.2013
comment
Вы пробовали this.repaint(); stackoverflow.com/questions/5566994/ docs.oracle.com/javase/6/docs/api/java/awt/   -  person Mehdi Karamosly    schedule 23.02.2013
comment
Я тоже не понимаю отрицательного голосования.   -  person deau    schedule 23.02.2013
comment
@deau да... к сожалению... Админы должны бороться с таким издевательством, точно так же, как они просят людей сделать домашнее задание, прежде чем что-либо спрашивать.   -  person joe    schedule 23.02.2013
comment
У меня нет опыта работы с менеджерами компоновки Java, но я заметил, что вы вообще не вызываете pack() в макете - может ли это способствовать проблеме?   -  person deau    schedule 23.02.2013
comment
@deau, хороший вопрос, но тогда почему только с меткой ошибки. хотя я попробую   -  person joe    schedule 23.02.2013
comment
попробуйте это: ` btnEnter.addActionListener (новый ActionListener () { @Override public void actionPerformed (ActionEvent arg0) { try { temp = Double.parseDouble (txtFahr.getText ()); double X = (temp - 32) * 0,69; lblResult .setText(String.valueOf(X)); lblError.setText()); this.repaint(); } catch(NumberFormatException ex){ lblError.setText(Неверное значение Цельсия); } } });'   -  person Mehdi Karamosly    schedule 23.02.2013
comment
@deau Апплет (либо Applet, либо JApplet) не имеет метода pack(), но код должен вызывать validate().   -  person Andrew Thompson    schedule 23.02.2013
comment
Ваш пост включает 1) аккуратно отформатированный код, показывающий проблему, 2) описание проблемы и 3) конкретный вопрос. +1 за отличный вопрос. (Хотя я подозреваю, что выбранный вами ответ менее чем оптимален.)   -  person Andrew Thompson    schedule 23.02.2013


Ответы (2)


попробуй это :

    btnEnter.addActionListener(new ActionListener() {       
        @Override
        public void actionPerformed(ActionEvent arg0) {
            try{
                temp = Double.parseDouble(txtFahr.getText());
                double X = (temp - 32)* 0.69;
                lblResult.setText(String.valueOf(X));
                lblError.setText(" ");
                this.repaint();
            }
            catch(NumberFormatException ex){
                lblError.setText("Invalid Celsius Value");
            }
        }
    });
person Mehdi Karamosly    schedule 23.02.2013
comment
1. Не расширяйте апплет. Это апплет Swing, поэтому вы должны расширять JApplet. 2. Не знаю, почему у вас возникла проблема, у меня код работает нормально. Вам НЕ нужно вызывать repaint(). Swing достаточно умен, чтобы перерисовывать компонент при использовании метода setText(). - person camickr; 23.02.2013

  1. расширить JApplet, увеличить высоту апплета в теге на странице html
  2. нельзя использовать макет сетки и установить размер, если вы хотите использовать собственный размер, установите менеджер макета как нуль для апплета, а затем установите границы
  3. вызовите недействительность компонента, чтобы принудительно перекрасить lblError.invalidate(), если 1 и 2 не работают

О нулевом менеджере компоновки и установке границ: это работает на всех ОС (проверено с Apple, unix, windows и linux), хотя в учебниках говорится, что используйте менеджер компоновки, на самом деле все довольно глупо с пикселями размером до 1000x800 в моих тестах более 12 лет. образцы image xy ; корзина для сбора мусора ; сбор информации

Справочник читайте о недействительности, перерисовке и игнорировании перерисовки в javadoc

person tgkprog    schedule 02.04.2013