添加到面板时 paintComponent() 不起作用
paintComponent() is not working when add to panel
我正在开发一个可以绘制数学函数图形的 swing 应用程序。我正在使用 getGraghics 函数,但我不知道如何删除和重新绘制它们,所以我决定覆盖 paintComponent() 方法来实现我正在寻找的东西
我想做的是在用户单击按钮后在面板中绘制函数图。但似乎 paintCompnent() 不起作用。我完全按照任何现有的教程和堆栈上的类似问题 overflow.but none 为我工作:( 只是没有意义:(
请帮助我解决这个问题一整夜:(
以下是绘制函数图的代码,但由于它不起作用,所以我只留下了绘制坐标系的部分进行测试,之后是我如何创建实例并尝试将其添加到我的面板的代码主要 class
class drawfunction extends JPanel{
@Override
protected void paintComponent(Graphics g){
super.paintComponent(g);
g.setColor(Color.red);
g.drawLine(0, 200, 400, 200);
g.drawLine(200,0 , 200, 400);
}
}
然后是main中的代码class
JPanel panel = new JPanel();
panel.setBounds(14, 104, 400, 400);
contentPane.add(panel);
panel.setBackground(Color.white);
JButton btnNewButton = new JButton("View the graph");
btnNewButton.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent arg0) {
//a= Integer.parseInt(cofficient_a.getText());
//b= Integer.parseInt(cofficient_b.getText());
//c= Integer.parseInt(cofficient_c.getText());
//d= Integer.parseInt(cofficient_d.getText());
//e= Integer.parseInt(cofficient_e.getText());
drawfunction a=new drawfunction();
panel.add(a);
});
任何人都可以告诉我应该如何解决这个问题。谢谢!!!!
两个基本的东西...
- 组件的默认首选大小为
0x0
,因此在将其添加到任何布局管理器控制下的容器时,它的大小都会达到 0x0
(或非常接近)
- Swing 通常是惰性的,它不会在您添加或删除组件时更新 UI,这可能会影响性能,因为 UI 不知道更新 UI 根据你在做什么,相反,你需要调用
revalidate
和(大部分时间)repaint
来更新 UI
例如...
import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.Dimension;
import java.awt.EventQueue;
import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.UIManager;
import javax.swing.UnsupportedLookAndFeelException;
public class Test {
public static void main(String[] args) {
new Test();
}
public Test() {
EventQueue.invokeLater(new Runnable() {
@Override
public void run() {
try {
UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName());
} catch (ClassNotFoundException | InstantiationException | IllegalAccessException | UnsupportedLookAndFeelException ex) {
ex.printStackTrace();
}
JFrame frame = new JFrame("Testing");
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.add(new TestPane());
frame.pack();
frame.setLocationRelativeTo(null);
frame.setVisible(true);
}
});
}
public class TestPane extends JPanel {
private JPanel center;
public TestPane() {
setLayout(new BorderLayout());
JButton btnNewButton = new JButton("View the graph");
center = new JPanel();
center.setPreferredSize(new Dimension(400, 400));
add(center);
btnNewButton.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent arg0) {
remove(center);
//a= Integer.parseInt(cofficient_a.getText());
//b= Integer.parseInt(cofficient_b.getText());
//c= Integer.parseInt(cofficient_c.getText());
//d= Integer.parseInt(cofficient_d.getText());
//e= Integer.parseInt(cofficient_e.getText());
center = new Drawfunction();
add(center);
revalidate();
repaint();
}
});
add(btnNewButton, BorderLayout.NORTH);
}
public class Drawfunction extends JPanel {
public Drawfunction() {
}
@Override
public Dimension getPreferredSize() {
return new Dimension(400, 400);
}
protected void paintComponent(Graphics g) {
super.paintComponent(g);
Graphics2D g2d = (Graphics2D) g.create();
g2d.setColor(Color.red);
g2d.drawLine(0, 200, 400, 200);
g2d.drawLine(200, 0, 200, 400);
g2d.dispose();
}
}
}
}
我正在开发一个可以绘制数学函数图形的 swing 应用程序。我正在使用 getGraghics 函数,但我不知道如何删除和重新绘制它们,所以我决定覆盖 paintComponent() 方法来实现我正在寻找的东西
我想做的是在用户单击按钮后在面板中绘制函数图。但似乎 paintCompnent() 不起作用。我完全按照任何现有的教程和堆栈上的类似问题 overflow.but none 为我工作:( 只是没有意义:(
请帮助我解决这个问题一整夜:(
以下是绘制函数图的代码,但由于它不起作用,所以我只留下了绘制坐标系的部分进行测试,之后是我如何创建实例并尝试将其添加到我的面板的代码主要 class
class drawfunction extends JPanel{
@Override
protected void paintComponent(Graphics g){
super.paintComponent(g);
g.setColor(Color.red);
g.drawLine(0, 200, 400, 200);
g.drawLine(200,0 , 200, 400);
}
}
然后是main中的代码class
JPanel panel = new JPanel();
panel.setBounds(14, 104, 400, 400);
contentPane.add(panel);
panel.setBackground(Color.white);
JButton btnNewButton = new JButton("View the graph");
btnNewButton.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent arg0) {
//a= Integer.parseInt(cofficient_a.getText());
//b= Integer.parseInt(cofficient_b.getText());
//c= Integer.parseInt(cofficient_c.getText());
//d= Integer.parseInt(cofficient_d.getText());
//e= Integer.parseInt(cofficient_e.getText());
drawfunction a=new drawfunction();
panel.add(a);
});
任何人都可以告诉我应该如何解决这个问题。谢谢!!!!
两个基本的东西...
- 组件的默认首选大小为
0x0
,因此在将其添加到任何布局管理器控制下的容器时,它的大小都会达到0x0
(或非常接近) - Swing 通常是惰性的,它不会在您添加或删除组件时更新 UI,这可能会影响性能,因为 UI 不知道更新 UI 根据你在做什么,相反,你需要调用
revalidate
和(大部分时间)repaint
来更新 UI
例如...
import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.Dimension;
import java.awt.EventQueue;
import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.UIManager;
import javax.swing.UnsupportedLookAndFeelException;
public class Test {
public static void main(String[] args) {
new Test();
}
public Test() {
EventQueue.invokeLater(new Runnable() {
@Override
public void run() {
try {
UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName());
} catch (ClassNotFoundException | InstantiationException | IllegalAccessException | UnsupportedLookAndFeelException ex) {
ex.printStackTrace();
}
JFrame frame = new JFrame("Testing");
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.add(new TestPane());
frame.pack();
frame.setLocationRelativeTo(null);
frame.setVisible(true);
}
});
}
public class TestPane extends JPanel {
private JPanel center;
public TestPane() {
setLayout(new BorderLayout());
JButton btnNewButton = new JButton("View the graph");
center = new JPanel();
center.setPreferredSize(new Dimension(400, 400));
add(center);
btnNewButton.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent arg0) {
remove(center);
//a= Integer.parseInt(cofficient_a.getText());
//b= Integer.parseInt(cofficient_b.getText());
//c= Integer.parseInt(cofficient_c.getText());
//d= Integer.parseInt(cofficient_d.getText());
//e= Integer.parseInt(cofficient_e.getText());
center = new Drawfunction();
add(center);
revalidate();
repaint();
}
});
add(btnNewButton, BorderLayout.NORTH);
}
public class Drawfunction extends JPanel {
public Drawfunction() {
}
@Override
public Dimension getPreferredSize() {
return new Dimension(400, 400);
}
protected void paintComponent(Graphics g) {
super.paintComponent(g);
Graphics2D g2d = (Graphics2D) g.create();
g2d.setColor(Color.red);
g2d.drawLine(0, 200, 400, 200);
g2d.drawLine(200, 0, 200, 400);
g2d.dispose();
}
}
}
}