简体   繁体   English

如何设置背景色和drawString而不用Java取消其他颜色?

[英]How do I set background colour and drawString without cancelling the other out in Java?

I am trying to create a jframe and set a background colour, but also putting in a drawstring. 我正在尝试创建一个jframe并设置背景色,但同时也放入了束带。 It seems like whenever I use .add, the text appears, but not the background. 似乎每当我使用.add时,都会显示文本,而不显示背景。 Without the .add, the background changes, but not the text. 没有.add,背景会更改,但文本不会更改。 ` `

import java.awt.Color;
import java.awt.Font;
import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.RenderingHints;
import javax.swing.JFrame;
import javax.swing.JPanel;
public class Test extends JPanel{
    public void paint(Graphics g){
        Graphics2D g2d=(Graphics2D)g;
    g2d.setRenderingHint(RenderingHints.KEY_ANTIALIASING,RenderingHints.VALUE_ANTIALIAS_ON);
        Font font = new Font("Serif", Font.PLAIN, 500);
        g.setFont(font);
        g.setColor(Color.red);
        g.drawString("Hello", 300, 900);
        }public static void main(String[] args) {
        // TODO Auto-generated method stub
        JFrame jf=new JFrame();
        jf.getContentPane().setBackground(Color.YELLOW);
        jf.getContentPane().add(new Test());
        jf.setSize(1920,1024);
        jf.setVisible(true);
        jf.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    }
}

` `

Set the background color of the Test JPanel, not the JFrame. 设置测试JPanel 而不是 JFrame的背景颜色。

Also: 也:

  • Override paintComponent, not paint 覆盖paintComponent, 而不是 paint
  • Don't forget to call the super's painting method within your override 别忘了在覆盖范围内调用super的绘画方法
  • Learn and follow Java naming and code formatting conventions. 了解并遵循Java命名和代码格式约定。 Your code is hard to read and understand as it is currently written. 当前编写的代码很难阅读和理解。

For example: 例如:

import java.awt.Color;
import java.awt.Dimension;
import java.awt.Font;
import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.RenderingHints;
import javax.swing.JFrame;
import javax.swing.JPanel;

public class Test3 {
    public static void main(String[] args) {
        JFrame jf = new JFrame();
        jf.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        jf.getContentPane().add(new MyTest("Hello", Color.RED));
        jf.pack();
        jf.setLocationRelativeTo(null);
        jf.setVisible(true);
    }
}

class MyTest extends JPanel {
    private static final int PREF_W = 1600;
    private static final int PREF_H = 900;
    private static final Color BG = Color.YELLOW;
    private static final Font FONT = new Font("Serif", Font.PLAIN, 500);;
    private String text;
    private Color color;

    MyTest(String text, Color color) {
        this.text = text;
        setBackground(BG);
        this.color = color;
    }

    @Override
    protected void paintComponent(Graphics g) {
        super.paintComponent(g);
        Graphics2D g2 = (Graphics2D) g;
        g2.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON);
        g2.setRenderingHint(RenderingHints.KEY_TEXT_ANTIALIASING, RenderingHints.VALUE_TEXT_ANTIALIAS_ON);
        g.setFont(FONT);
        g.setColor(color);
        g.drawString("Hello", 300, 600);

    }

    @Override
    public Dimension getPreferredSize() {
        if (isPreferredSizeSet()) {
            return super.getPreferredSize();
        }
        return new Dimension(PREF_W, PREF_H);
    }

}

There's a few ways you can do this... 您可以通过几种方法来执行此操作...

You could.. 你可以..

Make the Test panel the content panel for the frame... 使“ Test面板成为框架的内容面板...

JFrame jf = new JFrame();
jf.setContentPane(new Test());
jf.getContentPane().setBackground(Color.YELLOW);
jf.setSize(1920, 1024);
jf.setVisible(true);
jf.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

You could... 你可以...

Make the Test panel transparent 使Test面板透明

JFrame jf = new JFrame();
Test test = new Test();
test.setOpaque(false);
jf.getContentPane().setBackground(Color.YELLOW);
jf.add(test);
jf.setSize(1920, 1024);
jf.setVisible(true);
jf.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

You could... 你可以...

Just set the background color of the Test panel 只需设置“ Test面板的背景颜色

JFrame jf = new JFrame();
Test test = new Test();
test.setBackground(Color.YELLOW);
jf.add(test);
jf.setSize(1920, 1024);
jf.setVisible(true);
jf.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

Regardless of which you do... 不管你做什么...

You Should... 你应该...

  • Call the super method of the paint method 调用paint方法的super方法
  • Prefer paintComponent of paint - it's just a lot safer 首选paint paintComponent更安全
  • Only manipulate the UI from the context of the Event Dispatching Thead 仅从事件调度主题的上下文中操作UI

For example... 例如...

import java.awt.Color;
import java.awt.Font;
import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.RenderingHints;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.SwingUtilities;

public class Test extends JPanel {

    @Override
    protected void paintComponent(Graphics g) {
        super.paintComponent(g);
        Graphics2D g2d = (Graphics2D) g;
        g2d.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON);
        Font font = new Font("Serif", Font.PLAIN, 500);
        g.setFont(font);
        g.setColor(Color.red);
        g.drawString("Hello", 300, 900);
    }

    public static void main(String[] args) {
        SwingUtilities.invokeLater(new Runnable() {
            @Override
            public void run() {
                JFrame jf = new JFrame();
                jf.setContentPane(new Test());
                jf.getContentPane().setBackground(Color.YELLOW);
                jf.setSize(1920, 1024);
                jf.setVisible(true);
                jf.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
            }
        });
    }
}

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

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