我正在為大學建立一個專案,我的框架中有幾個形狀,我需要對這些物件做一些操作。 例如:
Figure fig = figs.get(figs.size()-1)。
fig.mov(dx,dy);
figs.set(figs.size() -1, fig) 。
repaint()。
我有一個數字陣列,每當我拖動/移動一個數字時,我必須更新該陣列并進行repaint(),這將在按下一個鍵盤箭頭時發生。
我的問題是,盡管repaint()函式速度很快,但當我對1個物體進行多次移動時,螢屏會多次變白,讓人看不清。我對java了解不多,對如何解決這個問題沒有任何想法。我在想,如果有人有什么想法,請幫我解決。
例子:
figurestest/Figure.java
package figurestest;
import java.awt.Graphics;
public abstract class Figure {
public int x, y;
public int w, h;
public Figure (int x。int y, int w, int h) {
this.x = x;
this.y = y;
this.w = w;
this.h=h。
}
public abstract void paint (圖形g)。
public abstract void mov (int dx, int dy)。
}
figurestest/rect.java
。package figurestest;
import java.awt.*;
public class Rect extends Figure {
public Rect (int x。int y, int w, int h) {
super(x, y, w, h)。
}
public void paint (Graphics g) {
Graphics2D g2d = (Graphics2D)g;
g2d.fillRect(this.x, this.y, this.w, this.h) 。
g2d.drawRect(this.x,this.y, this.w,this.h) 。
}
public void mov (int dx, int dy){
this.x = dx。
this.y = dy。
}
testapp.java
import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
import java.util.ArrayList;
import java.util.Random;
import figurestest.*;
class TestApp {
public static void main (String[] args){
ListFrame frame = new ListFrame() 。
frame.setVisible(true)。
}
}
class ListFrame extends JFrame {
ArrayList<Figure> figs = new ArrayList< Figure>();
Random rand = new Random()。
ListFrame () {
this.addWindowListener (
new WindowAdapter() {
public void windowClosing (WindowEvent e) {
System.exit(0)。
}
}
);
this.addKeyListener (
new KeyAdapter() {
public void keyPressed (KeyEvent evt) {
Dimension size = getContentPane().getSize()。
int x = rand.nextInt(size.width)。
int y = rand.nextInt(size.height)。
int w = 5 rand.nextInt(50)。
int h = 5 rand.nextInt(50)。
if (evt.getKeyChar() == 'r'/span>) {
figs.add(new Rect(x,y, w,h))。
}
else if (evt.getKeyCode() == KeyEvent.VK_DOWN || evt. getKeyCode() == KeyEvent.VK_LEFT || evt.getKeyCode() == KeyEvent.VK_RIGHT || evt.getKeyCode() == KeyEvent.VK_UP ) {
if (figs.size() > 0){
int dx = 0;
int dy = 0;
if(evt.getKeyCode() == KeyEvent.VK_DOWN) dy = 2;
else if (evt.getKeyCode() == KeyEvent.VK_UP){ dy = -2; }
else if (evt.getKeyCode() == KeyEvent.VK_RIGHT) dx = 2;
else if (evt.getKeyCode() == KeyEvent.VK_LEFT) dx = -2;
Figure fig = figs.get(figs.size() -1)。
fig.mov(dx,dy);
figs.set(figs.size() -1, fig)。
}
}
repaint()。
}
}
);
this.setTitle("數字")。
this.setSize(350, 350)。
}
public void paint (圖形g) {
super.paint(g)。
for (Figure fig: this.figs) {
fig.paint(g);
}
}
uj5u.com熱心網友回復:
你正在犯一些奇怪的錯誤。不要擴展JFrame,在這種情況下是沒有意義的。
這里是一個開始。你也許應該使用鍵監聽器以外的東西,并為輸入地圖做一個動作來代替。
class ListFrame {
ArrayList<Figure> figs = new ArrayList< Figure>();
Random rand = new Random()。
ListFrame () {
JFrame frame = new JFrame()。
frame.setDefaultCloseOperation( JFrame.EXIT_ON_CLOSE ) 。
JPanel custom = new JPanel(){
@Override
public void paintComponent(Graphics g) {
super.paint(g)。
for (Figure fig: figs) {
fig.paint(g);
}
}
@Override
public Dimension getPreferredSize()/span>{
//你的自定義組件應該知道它的首選尺寸。。
return new Dimension(350, 350)。
}
};
frame.addKeyListener (
new KeyAdapter() {
public void keyPressed (KeyEvent evt) {
Dimension size = custom.getSize()。
int x = rand.nextInt(size.width)。
int y = rand.nextInt(size.height)。
int w = 5 rand.nextInt(50)。
int h = 5 rand.nextInt(50)。
if (evt.getKeyChar() == 'r'/span>) {
figs.add(new Rect(x,y, w,h))。
}
else if (evt.getKeyCode() == KeyEvent.VK_DOWN || evt. getKeyCode() == KeyEvent.VK_LEFT || evt.getKeyCode() == KeyEvent.VK_RIGHT || evt.getKeyCode() == KeyEvent.VK_UP ) {
if (figs.size() > 0){
int dx = 0;
int dy = 0;
if(evt.getKeyCode() == KeyEvent.VK_DOWN) dy = 2;
else if (evt.getKeyCode() == KeyEvent.VK_UP){ dy = -2; }
else if (evt.getKeyCode() == KeyEvent.VK_RIGHT) dx = 2;
else if (evt.getKeyCode() == KeyEvent.VK_LEFT) dx = -2;
Figure fig = figs.get(figs.size() -1)。
fig.mov(dx,dy)。
//你不需要設定這個值。你修改了它。
//figs.set(figs.size() -1, fig);
}
}
custom.repaint()。
}
}
);
frame.setContentPane(custom);
frame.pack();
frame.setTitle("數字")。
frame.setVisible(true)。
}
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/331548.html
標籤:
上一篇:如何獲得NodeList中的元素
