当我加入paint()
方法时,它只会在背景上显示一个白色屏幕。
第一张图片是paint()
的输出,第二张图片没有paint()
。
代码:
import javax.swing.*;
import java.io.*;
import java.awt.*;
import java.util.*;
import java.awt.GridBagConstraints;
import java.awt.GridBagLayout;
import java.awt.Insets;
import java.awt.BorderLayout;
import java.awt.event.*;
public class Board2 extends JFrame
{
static JPanel p1
static JButton b1
public Board2(){
setSize(1000, 800);
setResizable(false);
b1 = new JButton("Button");
p1.add(b1);
add(p1, BorderLayout.CENTER);
setVisible(true);
}
public void paint(Graphics g)
{
g.setColor(Color.BLUE);
g.fillRect(50,50,20,20);
}
public static void main(String args[]){
new Board2();
}
}
在我的其他程序中,按钮是隐形的,直到我将鼠标悬停在它们上面。怎么解决这个问题?
答案 0 :(得分:3)
问题的可能原因可能是因为你没有调用super.paint
,但由于你没有提供油漆代码,所以这只是一个有根据的猜测......
其他一些有根据的猜测......
paint
或JFrame
之类的paintComponent
时,你会覆盖JComponent
(可能是JPanel
等顶级容器) }(并调用super.paintComponent
)请查看Performing Custom Painting和Painting in AWT and Swing了解详情
根据更新的代码更新
你有两个基本问题......
public class Board2 extends JFrame
{
//...
public void paint(Graphics g)
{
g.setColor(Color.BLUE);
g.fillRect(50,50,20,20);
}
你正在覆盖顶级容器的paint
而你正在破坏油漆链。
Swing中的绘画是通过一系列链式方法调用完成的,它们一起工作以产生最终结果,达到特定工作,当你无法调用super.paint
时,你停止这些方法的工作。
当您在顶级容器上执行此操作时,您可以阻止它对其子项进行绘制......
此外,顶级容器不是双缓冲的,这使得它们在涂漆时会闪烁。
相反,创建一个自定义组件,覆盖它的paintComponent
并在那里进行自定义绘画
例如......
public class Board2 extends JFrame
{
static JPanel p1
static JButton b1
public Board2(){
setSize(1000, 800);
setResizable(false);
b1 = new JButton("Button");
p1 = new JPanel() {
protected void paintComponent(Graphics g) {
super.paintComponent(g);
g.setColor(Color.BLUE);
g.fillRect(50,50,20,20);
}
}
p1.add(b1);
add(p1, BorderLayout.CENTER);
setVisible(true);
}
public static void main(String args[]){
EventQueue.invokeLater(new Runnable() {
public void run() {
new Board2();
}
});
}
}