Метод paint(графика g) производного класса java.awt.Label не вызывается

0

Вопрос

Учебная программа для школы моего сына по-прежнему включает в себя студентов, изучающих Java AWT. Хотя я и не думаю, что это лучший подход, я не могу его изменить, потому что он установлен Министерством образования. Во всяком случае, я стараюсь помогать своему сыну с его упражнениями, как я сам запрограммировал AWT много лет назад. Но у меня проблема с отображением меток. На самом деле мне нужно создать простую таблицу в AWT, так как таблицы отсутствуют. Подход состоит в том, чтобы взять сетку и добавить к ней метки. Это работает нормально, но я хотел, чтобы между столбцами и строками были разделительные линии. Поэтому я подклассировал ярлык и переписал краску следующим образом:

В классе таблицы я делаю

public class Table extends Container {
    ...
    this.setLayout(new GridLayout(rows+1, cols));
    for(int i=0; i<cols; i++) {
        for(int y=0; y< rows; y++) {
            TableLabel label = new TableLabel(rowData[i][y].toString()); 
            add(label);
        }
    }
    ...
}

что относится к

public class TableLabel extends Label {

    public TableLabel(String labelText) {
        super(labelText);
    }

    public void paint​(Graphics g) {
        super.paint(g);
        System.out.println("paint");
        Graphics2D g2 = (Graphics2D)g;
        g2.setPaint(Color.BLUE);
        g2.drawRect(getX(), getY(), getWidth(), getHeight());
    }
    
    public void update​(Graphics g) {
        super.update(g);
        System.out.println("update");
        Graphics2D g2 = (Graphics2D)g;
        g2.setPaint(Color.BLUE);
        g2.drawRect(getX(), getY(), getWidth(), getHeight());
    }
}

Рендеринг не изменился. Согласно отладчику, ни краска, ни обновление никогда не вызываются. Кроме того, println не записывает данные на консоль. Что я упускаю? Приложение скомпилировано и работает под управлением Java 11. Я знаю, что AWT и версия 11 вроде как подключены, но это заданная настройка. Заранее спасибо.

awt inheritance java paint
2021-11-23 17:31:33
2
0

Следующий код работает для меня. Можете ли вы расширить свой код, чтобы включить воспроизводимую проблему? И, пожалуйста, опишите точно, в чем проблема, чтобы мы могли быть уверены, что все мы смотрим на одно и то же.

public class AwtPaint {
   
   public static void main( String[] args ) {
      SwingUtilities.invokeLater( AwtPaint::init );
   }
   
   private static void init() {
      JFrame frame = new JFrame();
      
      Table myTable = new Table( 3, 3 );
      frame.add( myTable );
      
      frame.setDefaultCloseOperation( JFrame.EXIT_ON_CLOSE );
      frame.pack();
      frame.setLocationRelativeTo( null );
      frame.setVisible( true );
   }
   
}

class Table extends Container {
    public Table( int rows, int cols ) {
    this.setLayout(new GridLayout(rows+1, cols));
    for(int i=0; i<cols; i++) {
        for(int y=0; y< rows; y++) {
            TableLabel label = new TableLabel( "Col: " + i + ", row: " + y ); 
            add(label);
        }
    }
    }
}
class TableLabel extends Label {

    public TableLabel(String labelText) {
        super(labelText);
    }

    public void paint​(Graphics g) {
        super.paint(g);
        System.out.println("paint");
        Graphics2D g2 = (Graphics2D)g;
        g2.setPaint(Color.BLUE);
        g2.drawRect(getX(), getY(), getWidth(), getHeight());
    }
    
    public void update​(Graphics g) {
        super.update(g);
        System.out.println("update");
        Graphics2D g2 = (Graphics2D)g;
        g2.setPaint(Color.BLUE);
        g2.drawRect(getX(), getY(), getWidth(), getHeight());
    }
}
2021-11-23 17:43:25

Всегда добавляйте @Override. Может быть - я не уверен - drawRect(0, 0, .... Позвоните по super.paint не нужно.
Joop Eggen
0

Спасибо вам за все отзывы. Я до сих пор не знаю, что на самом деле было не так, но когда я последовал предложению Джупа и ввел "@Переопределение", Eclipse показал мне ошибку, сказав, что моя подпись неизвестна. Я не увидел разницы в документации, но удалил код и снова создал метод, на этот раз используя функцию перезаписи Eclipse. Теперь это работает. Может быть, непечатаемый символ где-то в строке?!

Кстати, в то время как краска теперь называется, синяя граница все еще не отрисована. Я безуспешно заменил "setPaint" на "setColor". Я также попробовал предложение установить hgap и vgap, но поскольку метки имеют тот же цвет фона, что и контейнер таблицы, пробелы невидимы. И при настройке фона контейнера меняются метки, но не сам контейнер. Это проблема с контейнером. После того, как я изменил эту таблицу, она больше не является контейнером, а панелью, изменения фона таблицы больше не перенаправляются на метки. Теперь я могу установить разные цвета для таблицы и надписей, используя setBackground, так как все, что я закодировал в методе рисования, не имело никакого эффекта. Я думаю, была причина, чтобы придумать Свинг ;-)

2021-11-23 20:33:31

На других языках

Эта страница на других языках

Italiano
..................................................................................................................
Polski
..................................................................................................................
Română
..................................................................................................................
한국어
..................................................................................................................
हिन्दी
..................................................................................................................
Français
..................................................................................................................
Türk
..................................................................................................................
Česk
..................................................................................................................
Português
..................................................................................................................
ไทย
..................................................................................................................
中文
..................................................................................................................
Español
..................................................................................................................
Slovenský
..................................................................................................................

Популярное в этой категории

Популярные вопросы в этой категории