如何使用 repaint() 更新面板?
how to update panel with repaint()?
我有一个面板-class:
public class MyPanel extends JPanel {
Color myColor = Color.BLUE;
String string = "Hello";
public void update(String newString) {
myColor = Color.GREEN;
string = newString;
repaint();
}
@Override
protected void paintComponent(Graphics g) {
super.paintComponent(g);
Graphics2D g2 = (Graphics2D) g;
g2.setPaint(myColor);
g2.drawString(string, 200, 100);
}
}
我希望在调用 update() 方法后重新绘制面板。但是 update() 中的所有内容都可以正常工作,但应该重新绘制面板的 repaint() 方法却不行。该面板始终与旧值相同。如何更新值并在面板中显示它们?
在我的 frame-class 中,我正在调用 update() 方法。我检查了我是否使用了该方法并且它有效。值得一提的是:update() 方法的调用不是问题所在。
我也尝试过一段时间后执行 update(),但是 repaint() 从来没有用过。
public class MyFrame extends JFrame {
public MyFrame() {
setTitle("Task");
setLayout(new BorderLayout());
add(new MyPanel(), BorderLayout.CENTER);
}
public static void main(String [] args) {
MyFrame frame = new MyFrame();
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.setSize(800, 600);
frame.setVisible(true);
MyPanel myPanel = new MyPanel();
myPanel.update("new Hello");
}
}
您的代码没问题。这是一个根据我的建议工作的例子。不要像我一样在实际代码中使用通配符导入 ;)
import java.awt.*;
import java.awt.event.*;
import java.io.*;
import javax.swing.*;
public class F extends JFrame {
class MyPanel extends JPanel implements ActionListener {
Color myColor = Color.BLUE;
String string = "Hello";
public MyPanel() {
super();
Timer t = new Timer(2000, this);
t.start();
}
public void update(String newString) {
// myColor = Color.GREEN;
// Jazz it up
// myColor = Color.GREEN;
myColor = new Color((int) (Math.random() * Integer.MAX_VALUE));
string = newString;
repaint();
}
@Override
protected void paintComponent(Graphics g) {
super.paintComponent(g);
Graphics2D g2 = (Graphics2D) g;
g2.setPaint(myColor);
g2.drawString(string, 200, 100);
}
@Override
public void actionPerformed(ActionEvent e) {
String s = "" + (long) (Math.random() * Long.MAX_VALUE);
update(s);
}
}
private void setGui() {
try {
setLocation(0, 100);
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
Container cp = getContentPane();
cp.add(new MyPanel());
} catch (Exception e) {
e.printStackTrace();
}
}
public static void main(String[] args) {
try {
SwingUtilities.invokeAndWait(new Runnable() {
public void run() {
F f = new F();
f.setGui();
f.setSize(400, 200);
f.setVisible(true);
}
});
} catch (Exception e) {
e.printStackTrace();
}
}
}
我有一个面板-class:
public class MyPanel extends JPanel {
Color myColor = Color.BLUE;
String string = "Hello";
public void update(String newString) {
myColor = Color.GREEN;
string = newString;
repaint();
}
@Override
protected void paintComponent(Graphics g) {
super.paintComponent(g);
Graphics2D g2 = (Graphics2D) g;
g2.setPaint(myColor);
g2.drawString(string, 200, 100);
}
}
我希望在调用 update() 方法后重新绘制面板。但是 update() 中的所有内容都可以正常工作,但应该重新绘制面板的 repaint() 方法却不行。该面板始终与旧值相同。如何更新值并在面板中显示它们? 在我的 frame-class 中,我正在调用 update() 方法。我检查了我是否使用了该方法并且它有效。值得一提的是:update() 方法的调用不是问题所在。 我也尝试过一段时间后执行 update(),但是 repaint() 从来没有用过。
public class MyFrame extends JFrame {
public MyFrame() {
setTitle("Task");
setLayout(new BorderLayout());
add(new MyPanel(), BorderLayout.CENTER);
}
public static void main(String [] args) {
MyFrame frame = new MyFrame();
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.setSize(800, 600);
frame.setVisible(true);
MyPanel myPanel = new MyPanel();
myPanel.update("new Hello");
}
}
您的代码没问题。这是一个根据我的建议工作的例子。不要像我一样在实际代码中使用通配符导入 ;)
import java.awt.*;
import java.awt.event.*;
import java.io.*;
import javax.swing.*;
public class F extends JFrame {
class MyPanel extends JPanel implements ActionListener {
Color myColor = Color.BLUE;
String string = "Hello";
public MyPanel() {
super();
Timer t = new Timer(2000, this);
t.start();
}
public void update(String newString) {
// myColor = Color.GREEN;
// Jazz it up
// myColor = Color.GREEN;
myColor = new Color((int) (Math.random() * Integer.MAX_VALUE));
string = newString;
repaint();
}
@Override
protected void paintComponent(Graphics g) {
super.paintComponent(g);
Graphics2D g2 = (Graphics2D) g;
g2.setPaint(myColor);
g2.drawString(string, 200, 100);
}
@Override
public void actionPerformed(ActionEvent e) {
String s = "" + (long) (Math.random() * Long.MAX_VALUE);
update(s);
}
}
private void setGui() {
try {
setLocation(0, 100);
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
Container cp = getContentPane();
cp.add(new MyPanel());
} catch (Exception e) {
e.printStackTrace();
}
}
public static void main(String[] args) {
try {
SwingUtilities.invokeAndWait(new Runnable() {
public void run() {
F f = new F();
f.setGui();
f.setSize(400, 200);
f.setVisible(true);
}
});
} catch (Exception e) {
e.printStackTrace();
}
}
}