为什么我的背景不会改变颜色?

时间:2017-02-23 01:46:54

标签: java swing

我在课堂上正在研究这个实验室,当我尝试更改背景颜色时,它会保持默认的白色,有人可以解释我编程出错的地方。

import javax.swing.*;
import java.awt.*;
public class  DemoPoly extends JFrame {  

// constructor
public DemoPoly() {
  // defines Frame characteristics

  int size = 300;
  setSize(size,size);
  setTitle("a random window");

  getContentPane().setBackground(Color.red);

  setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);
  setVisible(true);
}

public static void main (String[] args){ 
  //  instantiates a JFrame
  //  exits on close (opional)
  JFrame object = new DemoPoly();
} 

public void  paint  (Graphics g){
  // This provides the Graphics object g,  where
  // you are going to use you graphics primitive
  // to paint on the content pane of the frame.
  int[] arr = {0,100,100,0};
  int[] yarr = {0,0,100,100};
  Square object = new Square(arr,yarr,Color.red);
  AbstractPolygon randSquare = new Square(arr, yarr, Color.red);
} 

2 个答案:

答案 0 :(得分:1)

我在您的代码中看到了一些问题:

  1. 扩展JFrame就像说你的班级 JFrameJFrame是一个严格的容器,而是基于{{创建你的GUI 1}}秒。有关详细信息,请参阅Java Swing extends JFrame vs calling it inside of class

  2. 您通过删除JPanel方法上的super.paint(g)调用来打破链接链。更改GUI以扩展paint(...)而不是JPanel时,应使用JFrame方法。选择Lesson: Performing Custom Painting in Swing

  3. 您忘记在paintComponent(...)方法上添加@Override表示法。

  4. 您没有将您的程序放在Event Dispatch Thread (EDT)上,这可能会导致线程问题。

    您可以通过更改paint(...)方法来解决此问题:

    main()
  5. 不要设置public static void main(String[] args) { SwingUtilities.invokeLater(new Runnable() { @Override public void run() { //Your constructor here } }); } 尺寸,而是覆盖JFrame方法并致电getPreferredSize()。见Should I setPreferred|Maximum|MiniumSize in Java Swing?。普遍的共识是肯定的。

  6. 添加

    解决了您的问题
    pack()

    super.paint(g); 方法:

    paint(...)

    考虑到上述所有建议后,您的代码现在应该如下所示:

    @Override
    public void paint(Graphics g) {
        super.paint(g); //Never remove this
        //Your code goes here
    }
    

    产生此输出(与您当前代码相同的输出,但更好,因为它可以让您更好地控制组件)

    enter image description here

答案 1 :(得分:0)

我不明白你的问题。但这里是将你的背景改为RED的代码;

public class DemoPoly extends JFrame {

    public DemoPoly() {
        // defines Frame characteristics

        int size = 300;
        setSize(size, size);
        setTitle("a random window");

        //change background here
        getContentPane().setBackground(Color.red);

        setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);
        setVisible(true);
    }

    public static void main(String[] args) {
        //  instantiates a JFrame
        //  exits on close (opional)
        JFrame object = new DemoPoly();
    }
}

你的代码很好。也许在你的paint方法中使用@override。