我有一個面板類:
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() 方法卻不行。面板始終與舊值相同。如何更新值并在面板中顯示它們?在我的框架類中,我正在呼叫 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");
}
}
uj5u.com熱心網友回復:
你的代碼沒問題。這是一個使用我的建議的示例。不要像我一樣在實際代碼中使用通配符匯入;)
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();
}
}
}
轉載請註明出處,本文鏈接:https://www.uj5u.com/ruanti/477990.html
