没有调用绘制方法

时间:2013-12-12 05:07:48

标签: java swing colors jframe paint

我试图简化一些基本代码,我遇到了一个小问题。我的印象是paint方法是自动调用的,而且我基于我编写的所有其他基本程序。我没有得到任何错误,只是代码不起作用,我也不能调用repaint()。 代码:

public class Dynamic_Bg_Color{

JFrame frame;

public Dynamic_Bg_Color(){
    frame = new JFrame("BG Color Changer");

}

public void paint(Graphics g1){
    Graphics g = (Graphics)g1;

    g.setColor(Color.pink);
    g.fillRect(20,20,frame.getWidth()-20,100);
}

public static void main(String[] args){
    Dynamic_Bg_Color d = new Dynamic_Bg_Color();
    Dimension size = new Dimension(500,400);
    d.frame.setPreferredSize(new Dimension(size));
    d.frame.setMinimumSize(new Dimension(size));
    d.frame.setMaximumSize(new Dimension(size));
    d.frame.setLocationRelativeTo(null);

    d.frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    d.frame.setLayout(new FlowLayout());
    d.frame.setVisible(true);
    d.frame.getContentPane().setBackground(Color.cyan);
}

}

4 个答案:

答案 0 :(得分:2)

如果paint方法是覆盖,则仅调用paint方法,并且该类扩展了paint方法具有意义的另一个类。你的班级没有这样做,因此你的绘画方法毫无意义。

话虽如此,我建议您重载绘制,而是在扩展JComponent或其子代之一的类中paintComponent(...)。最重要的是,阅读Swing教程的绘画。请开始here

顺便说一下,将Graphics对象转换为Graphics对象无需任何操作。也许您错误地复制了代码并且意味着将其转换为Graphics2D类型?

答案 1 :(得分:0)

  

我让类扩展了JComponent,并添加了覆盖,但没有任何改变。

  1. 我看不到将组件添加到框架的位置。
  2. 即使您确实将组件添加到框架中也不会绘制,因为组件的默认大小为(0,0),因此无需绘制任何内容。
  3. 您还需要重新构建代码。 JFrame变量不属于您进行自定义绘制的组件。我建议你阅读Custom Painting上的Swing教程中的部分。它会告诉你:

    1. 如何进行自定义绘画,包括如何为组件指定首选尺寸
    2. 如何更好地构建程序,包括在Event Dispatch Thread上执行代码

答案 2 :(得分:0)

使用最少的更改工作代码:

import javax.swing.*;
import java.awt.*;

public class Dynamic_Bg_Color extends JPanel{

JFrame frame;

public Dynamic_Bg_Color(){
frame = new JFrame("BG Color Changer");
}

public void paint(Graphics g1){
Graphics g = (Graphics2D)g1;

g.setColor(Color.pink);
g.fillRect(20,20,frame.getWidth()-20,100);
}

public static void main(String[] args){
Dynamic_Bg_Color d = new Dynamic_Bg_Color();
Dimension size = new Dimension(500,400);
d.setPreferredSize(new Dimension(size));
d.setMinimumSize(new Dimension(size));
d.setMaximumSize(new Dimension(size));

d.frame.add(d);
d.frame.setLocationRelativeTo(null);
d.frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
d.frame.setLayout(new FlowLayout());
d.frame.pack();
d.frame.setVisible(true);
d.frame.getContentPane().setBackground(Color.cyan);
}

}
但是,正如其他人所说,我不建议你使用这个原因,这是非常非常糟糕的程序结构。并阅读有关绘画的教程,即使我认为Oracles教程对此不好(frame.pack()只是将JFrame窗口的大小设置为保持它所包含的组件的大小。)

答案 3 :(得分:0)

继承人最后的工作代码。一些更改是扩展JPanel,设置JPanel的大小,以及将面板添加到JFrame。是的,我知道每个人都说,这不是一种最佳方式,但是现在,它确实有效。

import java.awt.Color;
import java.awt.Dimension;
import java.awt.EventQueue;
import java.awt.FlowLayout;
import java.awt.Graphics;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;
import java.awt.event.MouseListener;

import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.UIManager;
import javax.swing.UnsupportedLookAndFeelException;

public class Dynamic_Bg_Color extends JPanel{

private static final long serialVersionUID = 1L;

static Dimension size = new Dimension(500,400);

static JFrame frame;

public Dynamic_Bg_Color(){

    setPreferredSize(size);
    setBackground(Color.cyan);
    addMouseListener(new Handler());

}

@Override
public void paintComponent(Graphics g){

    System.out.println("Click");

    super.paintComponent(g);

    g.setColor(Color.blue);
    g.fillRect(20,20,getWidth()-40,100);

    g.setColor(Color.green);
    g.fillRect(20,140,getWidth()-40,100);

    g.setColor(Color.orange);
    g.fillRect(20,260,getWidth()-40,100);
}

public static void main(String[] args){     


    Dynamic_Bg_Color d = new Dynamic_Bg_Color();

    frame = new JFrame("BG Color Changer");

    frame.setPreferredSize(new Dimension(size));
    frame.setMinimumSize(new Dimension(size));
    frame.setMaximumSize(new Dimension(size));
    frame.setLayout(new FlowLayout());
    frame.setLocationRelativeTo(null);
    frame.add(d);
    frame.pack();
    frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    frame.getContentPane().setBackground(Color.cyan);
    frame.setVisible(true);

    }

public class Handler extends MouseAdapter{

    public void mousePressed(MouseEvent e) {

        int x = e.getX();
        int y = e.getY();

        if(x>= 20 && x<=getWidth()-40 && y>=20 && y<= 120){
            frame.getContentPane().setBackground(Color.blue);
            setBackground(Color.blue);
            frame.setTitle("Blue");
        }
        if(x>= 20 && x<=getWidth()-40 && y>=140 && y<= 240){
            frame.getContentPane().setBackground(Color.green);
            setBackground(Color.green);
            frame.setTitle("Green");    
            }
        if(x>= 20 && x<=getWidth()-40 && y>=260 && y<= 360){
            frame.getContentPane().setBackground(Color.orange);
            setBackground(Color.orange);
            frame.setTitle("Orange");
            }
    }



}

}