Проблема Java Paint - PullRequest
       30

Проблема Java Paint

0 голосов
/ 12 февраля 2011

Хорошо, мне интересно, почему код ниже не будет отображать JLabel.

MyPanel корректно добавляется в JFrame и все остальное, потому что все это отображается, но не рисует JLabel. Любая помощь приветствуется.

public class MyPanel extends JPanel {
  private Root root;
  ...

  public void paintComponent(Graphics g)
  {
    super.paintComponent(g);
    Graphics2D g2 = (Graphics2D) g;
    root.paint(g2); 
  }
}

class Root {
  private Node1 node1;

  ...
  public void paint(Graphics g) {
    node1.paint(g);
  }
}

class Node1 {
  ...
  public void paint(Graphics g) {
    JLabel jtp = new JLabel();
    jtp.setLocation((int) x, (int) y);
    jtp.setSize((int) width, (int) height);
    jtp.setLocation(40, 40);
    jtp.setSize(40, 40);
    jtp.setText("Hello world");
    //jtp.setVisible(true);
    jtp.paint(g);
  }
}

Ответы [ 2 ]

3 голосов
/ 12 февраля 2011

Я предлагаю не добавлять Компоненты в Контейнер в методе рисования, так как 1) у вас нет абсолютного контроля, когда или даже если будет вызван метод рисования, и 2) paint и paintComponent должны быть такими же быстрыминасколько это возможно, и это не время или место для обновления графического интерфейса.3) Поскольку рисование часто вызывается много раз, вы будете добавлять компоненты многократно в ваш контейнер, и все это вне вашего прямого контроля.

Кроме того, пока вы добавляете компонент в Root (каким бы Root ни былпоскольку он не расширяет JComponent, JPanel и т. п.) в методе рисования, объект Root никогда не добавляется ни к чему другому, что я могу сказать, и поэтому имеет смысл, что ничего не «добавляется» к компоненту, который в конечном итоге не добавляетсяв окне верхнего уровня будет видно.

Итог: я думаю, что вам нужно перепроектировать графический интерфейс в качестве решения.Если вы расскажете нам больше об этом, мы можем помочь вам с этим.Далее нам нужно поговорить об использовании менеджеров компоновки и о том, почему обычно задают абсолютную позицию и размеры компонентов.

Если что-то, что я говорю, сбивает с толку, пожалуйста, попросите разъяснений, или если что-то не так,пожалуйста, помогите мне исправить это!

2 голосов
/ 12 февраля 2011

Вам не следует создавать JLabel внутри метода рисования - вместо этого создайте его один раз при инициализации MyPanel. Ваша метка является своего рода компонентом рендеринга для ваших узлов, что в принципе хорошо. Вы можете посмотреть, как работают рендеры для JTable, JList, JTree.

В вашем случае, не устанавливайте местоположение вашей метки (это ничего не меняет, так как его paint-метод ожидает, что его графический объект будет ориентирован своим собственным верхним левым углом), вместо этого переводите Graphics-context:

 Graphics copy = g.create((int)x, (int)y, (int)width, (int)height);
 jtp.paint(copy);

(в Graphics2D есть и более причудливые методы для сдвига, поворота и масштабирования контекста).

Кроме этого, я не вижу никаких проблем. Убедитесь, что ваш метод Node1.paint() действительно вызван, поместив туда несколько System.out.println ().

...