繁体   English   中英

行为不一致

[英]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的超类( JComponentsuper.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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM