我兒子學校的課程仍然包括學習 Java AWT 的學生。即使我認為這不是最好的方法,我也不能改變它,因為它是教育部規定的。不管怎樣,我試著幫助我兒子練習,因為我多年前自己撰寫了 AWT。但是我在渲染標簽時遇到了問題。我真正想要的是在 AWT 中創建一個簡單的表,因為缺少表。方法是采用 GridLayout 并向其添加標簽。這很好用,但我想在列和行之間有分隔線。因此,我對 Label 進行了子分類并像這樣覆寫了油漆:
在 Table 類中我做
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());
}
}
渲染沒有改變。根據除錯器的說法,paint 和 update 都不會被呼叫。此外, println 沒有寫入控制臺。我錯過了什么?該應用程式在 Java 11 下編譯和運行。我知道,AWT 和版本 11 是有線的,但這是給定的設定。先感謝您。
uj5u.com熱心網友回復:
以下代碼對我有用。您可以擴展您的代碼以包含可重現的問題嗎?請準確描述問題所在,以便我們可以確定我們都在關注同一件事。
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());
}
}
uj5u.com熱心網友回復:
感謝您的所有反饋。我仍然不知道究竟出了什么問題,但是當我按照 Joop 的建議輸入“@Override”時,Eclipse 向我顯示了一個錯誤,說我的簽名未知。我看不出與檔案的區別,但洗掉了代碼并再次創建了該方法,這次是使用 Eclipse 的 Overwrite 功能。現在它起作用了。也許是該行某處的不可列印字符?!
順便說一下,雖然現在呼叫了paint,但仍然沒有渲染藍色邊框。我用“setColor”替換了“setPaint”但沒有成功。我也嘗試了設定hgap和vgap的建議,但是由于label的背景色和表的Container一樣,所以gap是不可見的。當設定容器的背景時,標簽會改變,但容器不會。這是容器的問題。在我更改表不再擴展容器而是面板后,對表背景的更改不再轉發到標簽。現在我可以使用 setBackground 為表格和標簽設定不同的顏色,因為我在 Paint 方法中編碼的任何內容都不起作用。我想有一個理由想出 Swing ;-)
轉載請註明出處,本文鏈接:https://www.uj5u.com/gongcheng/369632.html
