[英]Inconsistent Behavior
當我運行以下代碼時,它們似乎會產生不一致的行為。 在某些運行中,畫布最終顯示為灰色,但在另一些運行中,其最終顯示為藍色。 為什么會這樣,我該如何糾正?
import java.awt.*;
import javax.swing.*;
public class psw extends JFrame {
String symbols="~ ! @ # $ % ^ & * ( ) _ = + : ; < , > . ? / | \\ '";
public static void main(String[] args){
psw app=new psw();
app.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE) ;
app.setSize(600, 450);
app.setVisible(true);
app.getContentPane().setBackground(new Color(30,144,255));
@Override
public void paint(Graphics g) {
g.setColor(new Color(255,255,255));
g.drawRect(10, 10, 60, 50);
g.drawLine(60, 50, 220, 20);
g.drawString(symbols, 10, 150);
}
}
更改代碼以通過事件分發線程訪問JFrame ,如下所示:
SwingUtilities.invokeLater(new Runnable() {
public void run() {
createAndShowGUI();
}
});
Oracle教程說:
Swing事件處理代碼在稱為事件調度線程的特殊線程上運行。 大多數調用Swing方法的代碼也都在此線程上運行。 這是必需的,因為大多數Swing對象方法都不是“線程安全的”:從多個線程中調用它們可能會導致線程干擾或內存一致性錯誤。 一些Swing組件方法在API規范中被標記為“線程安全”。 這些可以從任何線程安全地調用。 所有其他Swing組件方法都必須從事件分發線程中調用。 忽略此規則的程序在大多數情況下都可以正常運行,但是會遇到難以預料的錯誤,這些錯誤很難再現。
聽起來像您所看到的。
您需要記住要調用super.paint(g);
。 那顯示了那幅畫。
public void paint(Graphics g) {
super.paint(g);
g.setColor(new Color(255,255,255));
g.drawRect(10, 10, 60, 50);
g.drawLine(60, 50, 220, 20);
g.drawString(symbols, 10, 150);
}
JFrame
上繪制不是一個好主意,因為它們沒有雙重緩沖。 而是在主要是JPanel
的組件上繪畫,並覆蓋其paintComponent
方法。 就像paint
,您需要調用super.paintComponent
。 super.paintComponent(g)
從JPanel
的超類( JComponent
類super.paintComponent(g)
調用paintComponent
方法,以擦除面板上當前繪制的任何內容。 這是使用JPanel
而不是JFrame
import java.awt.Color;
import java.awt.Dimension;
import java.awt.Graphics;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.SwingUtilities;
public class psw extends JPanel {
String symbols = "~ ! @ # $ % ^ & * ( ) _ = + : ; < , > . ? / | \\ '";
public static void main(String[] args) {
SwingUtilities.invokeLater(new Runnable() {
public void run() {
JFrame app = new JFrame();
app.add(new psw());
app.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
app.pack();
app.setVisible(true);
}
});
}
@Override
public void paintComponent(Graphics g) {
super.paintComponent(g);
g.setColor(new Color(30, 144, 255));
g.fillRect(0, 0, getWidth(), getHeight());
g.setColor(new Color(255, 255, 255));
g.drawRect(10, 10, 60, 50);
g.drawLine(60, 50, 220, 20);
g.drawString(symbols, 10, 150);
}
public Dimension getPreferredSize() {
return new Dimension(600, 450);
}
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.