Java Graphics не отображает изменения - PullRequest
3 голосов
/ 18 февраля 2012

Я работаю над небольшим Java-апплетом, очень новым для этой программы. Используя Java 1.6

У меня есть класс, который создает JPanel из нескольких флажков. Цель состоит в том, чтобы пользователь выбрал некоторое фиксированное количество параметров, а затем передал эти параметры другим методам

public class OptionSelector extends JPanel {

private JCheckBox[] optionCheckBoxes;
private int numberSelected;
private int goalNumber;
private ArrayList<String> selectedOptions = new ArrayList<String>();
private boolean rightAmountSelected;
private boolean isFinalChoice = false;
private DoneButton done = new DoneButton();

/**
 * This method is used only for the purposes of initialization
 *
 */
public OptionSelector()
{
    this(1, "test", "test");
}

public OptionSelector(int howManyToSelect, String ... options)
{
    super(new FlowLayout());
    JCheckBox option;
    optionCheckBoxes = new JCheckBox[options.length];
    for (int i = 0; i < options.length; i++)
    {
        option = new JCheckBox(options[i]);
        optionCheckBoxes[i] = option;
        add(option);
    }
    add(done);
    numberSelected = 0;
    goalNumber = howManyToSelect;
    rightAmountSelected = false;
}

public void setOptions(String ... options)
{
    this.removeAll();
    JCheckBox option;
    optionCheckBoxes = new JCheckBox[options.length];
    for (int i = 0; i < options.length; i++)
    {
        option = new JCheckBox(options[i]);
        optionCheckBoxes[i] = option;
        add(option);
        System.out.println(option.getBounds());
    }
    add(done);
    System.out.println(done.getBounds());
}

public void paintComponent(Graphics g)
{
    g.clearRect(0,0,this.getWidth(), this.getHeight());
    for (int i = 0; i < getComponentCount(); i++)
    {
        System.out.println(this.getComponents()[i].getBounds());
    }
}

Апплет, который я использовал для тестирования ниже

public class TestDisplay extends JApplet implements MouseListener{

OptionSelector s = new OptionSelector();

public void init()
{
    setSize(640,480);
    this.getContentPane().setLayout(null);
    addMouseListener(this);
    s.setBounds(10,10,200,200);
    add(s);
    s.repaint();
}

public void paint(Graphics g)
{
    s.repaint();
}

public void mouseClicked(MouseEvent arg0) 
{
    s.setOptions("1","2");
    repaint();
}

public void mousePressed(MouseEvent arg0) {
    // TODO Auto-generated method stub

}

public void mouseReleased(MouseEvent arg0) {
    // TODO Auto-generated method stub

}

public void mouseEntered(MouseEvent arg0) {
    // TODO Auto-generated method stub

}

public void mouseExited(MouseEvent arg0) {
    // TODO Auto-generated method stub

}

}

Проблема в том, что когда я тестирую апплет, щелчок мышью меняет параметры просто отлично, но новые JCheckBoxes не отображаются. Эксперимент с печатью границ каждого компонента в селекторе показывает, что границы JCheckBox по-прежнему застряли в (0,0,0,0), а границы кнопки не изменились. Я много раз пытался перекрасить OptionSelector и весь апплет, но, похоже, ничего не работает. Есть идеи как это исправить?

1 Ответ

5 голосов
/ 18 февраля 2012

Вы, кажется, забыли вызвать revalidate() в вашем контейнере JPanel при удалении и добавлении компонентов:

public void mouseClicked(MouseEvent arg0) {
  s.setOptions("1", "2");
  s.revalidate();
  repaint();
}

Это важно, если вы хотите, чтобы контейнер (ваш JPanel) размещал новые компоненты вконтейнер соответственно.Кроме того, это не очень хорошая вещь:

public void paint(Graphics g) {
    s.repaint();
}

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...