java - JPanel - 更改 JPanel 的背景颜色时出错

标签 java swing

我写了下面的代码:

import java.awt.Color;
import java.awt.Graphics;
import java.awt.event.WindowAdapter;
import java.awt.event.WindowEvent;

import javax.swing.JFrame;
import javax.swing.JPanel;

public class Test extends JFrame{
    
    public Test() {
        this.setTitle("Test");
        this.addWindowListener(new WindowAdapter() {
            public void windowClosing(WindowEvent e) {
                System.exit(0);
            }
        });

        JPanel jPanel = new JPanel() {
            public void paint(Graphics g) {
                g.setColor(Color.GREEN);
                g.fillOval(100, 100, 100, 100);
                g.setColor(Color.BLACK);
                g.drawLine(0, 0, 100, 100);
            }
        };
        jPanel.setSize(500, 500);
        jPanel.setBackground(Color.RED);
        this.add(jPanel);
        this.setVisible(true);
        this.setSize(500, 500);
    }
    
    public static void main(String[] args) {
        Test test = new Test();
    }
}

我想画一个圆,一条线,并将屏幕的背景颜色更改为红色,但是当我运行程序时,屏幕看起来如下: Screen

代码哪里出错了。坦克你

最佳答案

首先,不要覆盖paint,而是覆盖paintComponent

然后,setBackground 的 javadoc 说:

Direct subclasses of JComponent must override paintComponent to honor this property.

因此,在您的情况下,调用此方法本身不会执行任何操作,除非您调用父类的 paintComponent(或您自己绘制背景,但那样做太过分了)。

在任何情况下都建议调用 super.paintComponent,因为父实现可能​​会执行一些清理或其他有用的操作。

这是您的代码的修改版本,它考虑了所有这些:

import java.awt.Color;
import java.awt.Graphics;
import java.awt.event.WindowAdapter;
import java.awt.event.WindowEvent;

import javax.swing.JFrame;
import javax.swing.JPanel;

public class Test extends JFrame {

    public Test() {
        this.setTitle("Test");
        this.addWindowListener(new WindowAdapter() {
            public void windowClosing(final WindowEvent e) {
                System.exit(0);
            }
        });

        JPanel jPanel = new JPanel() {
            @Override
            public void paintComponent(final Graphics g) {
                // call parent method
                super.paintComponent(g);

                // OR paint background yourself :
                // g.setColor(getBackground());
                // g.fillRect(0, 0, getWidth(), getHeight());


                // paint other things
                g.setColor(Color.GREEN);
                g.fillOval(100, 100, 100, 100);
                g.setColor(Color.BLACK);
                g.drawLine(0, 0, 100, 100);
            }
        };
        jPanel.setSize(500, 500);
        jPanel.setBackground(Color.RED);
        this.add(jPanel);
        this.setVisible(true);
        this.setSize(500, 500);
    }

    public static void main(final String[] args) {
        Test test = new Test();
    }
}

关于java - JPanel - 更改 JPanel 的背景颜色时出错,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44439475/

相关文章:

java - 使用 TextFields 将学生的 ArrayList 存储在文件中

java - Jbutton 覆盖 Jbutton 背景图像?

java - 在Java中调用HashMap中对象的方法

java - 在 Gradle 中使用 DBDeploy 并使用 hibernate 作为 ORM

java - 自定义 ListAdapter 中的点击监听器如何修改列表数据?

java - setLabelTable 方法自定义 slider 标签的问题

java - 根据角色限制用户

java - 当背景颜色 alpha 值设置为小于 255 (200) 时,JButton、JLabel、JTextArea 会抖动

java - 如何让 JPanel 使用滚动条来适应大型 J 组件?

java - 检测 JRadioButton 状态更改