簡體   English   中英

沒有調用繪制方法

[英]Paint method not being called

我試圖簡化一些基本代碼,我遇到了一個小問題。 我的印象是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);
}

}

如果paint方法是覆蓋,則僅調用paint方法,並且該類擴展了paint方法具有意義的另一個類。 你的班級沒有這樣做,因此你的繪畫方法毫無意義。

話雖如此,我建議你不要重載paint,而是在擴展JComponent或其中一個子節點的類中使用paintComponent(...) 最重要的是,閱讀Swing教程的繪畫。 請從這里開始。

另外,將Graphics對象轉換為Graphics對象無需任何操作。 也許您錯誤地復制了代碼並且意味着將其轉換為Graphics2D類型?

我使類擴展了JComponent,並添加了覆蓋,但沒有任何改變。

  1. 我沒有看到您將組件添加到框架的位置。
  2. 即使您確實將組件添加到框架中也不會繪制,因為組件的默認大小為(0,0),因此無需繪制任何內容。

您還需要重新構建代碼。 JFrame變量不屬於您進行自定義繪制的組件。 我建議你閱讀自定義繪畫的Swing教程中的部分。 它會告訴你:

  1. 如何進行自定義繪制,包括如何為組件指定首選大小
  2. 如何更好地構建程序,包括在Event Dispatch Thread上執行代碼

通過最小的更改使工作代碼:

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窗口的大小設置為保持它所包含的組件的大小)。

下面是最后的工作代碼。 一些更改是擴展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");
            }
    }



}

}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM