我在课堂上正在研究这个实验室,当我尝试更改背景颜色时,它会保持默认的白色,有人可以解释我编程出错的地方。
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);
}
答案 0 :(得分:1)
我在您的代码中看到了一些问题:
扩展JFrame
就像说你的班级是 JFrame
,JFrame
是一个严格的容器,而是基于{{创建你的GUI 1}}秒。有关详细信息,请参阅Java Swing extends JFrame vs calling it inside of class。
您通过删除JPanel
方法上的super.paint(g)
调用来打破链接链。更改GUI以扩展paint(...)
而不是JPanel
时,应使用JFrame
方法。选择Lesson: Performing Custom Painting in Swing。
您忘记在paintComponent(...)
方法上添加@Override
表示法。
您没有将您的程序放在Event Dispatch Thread (EDT)上,这可能会导致线程问题。
您可以通过更改paint(...)
方法来解决此问题:
main()
不要设置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?。普遍的共识是肯定的。
添加
解决了您的问题pack()
在super.paint(g);
方法:
paint(...)
考虑到上述所有建议后,您的代码现在应该如下所示:
@Override
public void paint(Graphics g) {
super.paint(g); //Never remove this
//Your code goes 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。