Java JTextArea在重新绘制()时不显示,但在重新验证()时图形不更新?
我正在制作一个模拟NHL选秀彩票的程序,屏幕右侧应该有一个JTextField,左侧应该有一个反弹的Draftball。我创建了一个名为Ball的类,它实现了Runnable,并在我的主DraftLottery类中作为线程运行。但是,当我的draw方法调用repaint()时,JTextArea不会显示。我尝试将repaint()切换为revalidate(),但球没有移动。然后我尝试调用repaint()和revalidate(),但其作用与repaint()相同。 以下是我的DraftLockting类的代码:Java JTextArea在重新绘制()时不显示,但在重新验证()时图形不更新?,java,multithreading,swing,jtextarea,repaint,Java,Multithreading,Swing,Jtextarea,Repaint,我正在制作一个模拟NHL选秀彩票的程序,屏幕右侧应该有一个JTextField,左侧应该有一个反弹的Draftball。我创建了一个名为Ball的类,它实现了Runnable,并在我的主DraftLottery类中作为线程运行。但是,当我的draw方法调用repaint()时,JTextArea不会显示。我尝试将repaint()切换为revalidate(),但球没有移动。然后我尝试调用repaint()和revalidate(),但其作用与repaint()相同。 以下是我的DraftLoc
package ca.WiltzSports.DraftLottery;
import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.Image;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
import java.util.Random;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.JScrollPane;
import javax.swing.JTextArea;
import ca.WiltzSports.DraftLottery.DraftBall.Ball;
public class DraftLottery extends JFrame {
public static final long serialVersionUID = 89L;
int teams;
String[] teamNames;
int[] balls;
JTextArea display;
JPanel screen;
JPanel animation;
List<String> entries;
public static List<Ball> ball;
String [] draftOrder;
Random rand;
int counter = 1;
javax.swing.Timer t;
public static int width = 1024;
public static int height = 768;
Graphics dbg;
Image dbImage;
int i = 0;
public DraftLottery(int teams, String[] teamNames, int[] balls){
t = new javax.swing.Timer(2000, new ActionListener(){
@Override
public void actionPerformed(ActionEvent arg0) {
draft();
}
});
ball = new ArrayList<Ball>();
rand = new Random();
this.teams = teams;
this.teamNames = teamNames;
this.balls = balls;
this.screen = new JPanel();
this.animation = new JPanel();
display = new JTextArea(20,50);
display.setBackground(Color.BLACK);
display.setForeground(Color.YELLOW);
draftOrder = new String[teams];
this.entries = new ArrayList<String>();
addTeamBalls();
setSize(width,height);
setVisible(true);
setLocationRelativeTo(null);
setDefaultCloseOperation(EXIT_ON_CLOSE);
setTitle("Draft Lottery");
setLayout(new BorderLayout());
screen.add(display);
add("East", new JScrollPane(display));
add("West", animation);
t.start();
}
@Override
public void paint(Graphics g){
dbImage = createImage(getWidth(), getHeight());
dbg = dbImage.getGraphics();
Graphics2D g2d = (Graphics2D) dbg;
draw(g2d);
g.drawImage(dbImage, 0, 0, this);
Ball.runBalls(ball);
}
public void draw(Graphics2D g2d){
for (Ball b: ball){
b.draw(g2d);
}
revalidate();
repaint();
}
public void addTeamBalls(){
for (int c = 0; c < teamNames.length; c++){
for (int j = 0; j < balls[c]; j++){
entries.add(teamNames[c]);
ball.add(new Ball(rand.nextInt(width/2 - Ball.SIZE), rand.nextInt(height - Ball.SIZE), teamNames[c], i++));
}
}
}
public void draft(){
int q = 0;
String [] e = entries.toArray(new String[entries.size()]);
String draftedTeam;
int index = rand.nextInt(entries.size());
draftedTeam = e[index];
if(!draftedTeam.equals("X")){
display.append("" + counter++ + ". " + draftedTeam + "\n");
for(int c = 0; c < e.length; c++){
if (e[c].equals(draftedTeam)){
e[c] = "X";
}
}
removeBalls();
}else {
boolean again = false;
for (int c = 0; c < e.length; c++){
if (!e[c].equals("X")){
again = true;
}
}
if(again){
}else{
t.stop();
display.append("DRAFT LOTTERY COMPLETE");
}
}
entries = Arrays.asList(e);
}
public void removeBalls(){
Ball [] bs;
int q = 0;
for (Ball b: ball){
if (b.getTeamName().equals("X")){
continue;
}else{
q++;
}
}
bs = new Ball[q];
q = 0;
for (Ball b: ball){
if (!b.getTeamName().equals("X")){
bs[q++] = b;
}
}
ball = Arrays.asList(bs);
}
package ca.WiltzSports.draftlotting;
导入java.awt.BorderLayout;
导入java.awt.Color;
导入java.awt.Graphics;
导入java.awt.Graphics2D;
导入java.awt.Image;
导入java.awt.event.ActionEvent;
导入java.awt.event.ActionListener;
导入java.util.ArrayList;
导入java.util.array;
导入java.util.List;
导入java.util.Random;
导入javax.swing.JFrame;
导入javax.swing.JPanel;
导入javax.swing.JScrollPane;
导入javax.swing.JTextArea;
导入ca.WiltzSports.draftlotting.DraftBall.Ball;
公共类DraftFrame扩展{
公共静态最终长serialVersionUID=89L;
国际小组;
字符串[]组名;
int[]球;
区域显示;
JPanel屏幕;
JPanel动画;
列出条目;
公共静态列表球;
字符串[]draftOrder;
随机兰德;
int计数器=1;
javax.swing.Timer t;
公共静态整型宽度=1024;
公共静态内部高度=768;
图形数据库;
图像dbImage;
int i=0;
公开抽奖(整数队,字符串[]队名,整数[]球){
t=newjavax.swing.Timer(2000,newActionListener(){
@凌驾
已执行的公共无效操作(操作事件arg0){
草案();
}
});
ball=新的ArrayList();
rand=新随机数();
这个。团队=团队;
this.teamNames=团队名称;
这个球=球;
this.screen=new JPanel();
this.animation=new JPanel();
显示=新的JTextArea(20,50);
显示.背景(颜色.黑色);
显示。设置前景(颜色。黄色);
draftOrder=新字符串[团队];
this.entries=new ArrayList();
addTeamBalls();
设置尺寸(宽度、高度);
setVisible(真);
setLocationRelativeTo(空);
setDefaultCloseOperation(关闭时退出);
setTitle(“草稿彩票”);
setLayout(新的BorderLayout());
屏幕。添加(显示);
添加(“东”,新的JScrollPane(显示));
添加(“西部”,动画);
t、 start();
}
@凌驾
公共空间涂料(图g){
dbImage=createImage(getWidth(),getHeight());
dbg=dbImage.getGraphics();
Graphics2D g2d=(Graphics2D)dbg;
绘图(g2d);
g、 drawImage(dbImage,0,0,this);
跑球;
}
公共空心图(Graphics2D g2d){
对于(球b:球){
b、 绘图(g2d);
}
重新验证();
重新油漆();
}
public void addTeamBalls(){
对于(int c=0;c
}
任何帮助都将不胜感激。
非常感谢 您有许多问题:
paint
方法。通常不建议这样做,因为它不是双缓冲的,并且可以通过动画和其他绘制更新产生闪烁super.paint
。绘制
方法负责将所有子绘制方法拉到一起,包括,绘制组件
;但由于您不允许paint
完成它的工作,因此它不会为您呈现这些组件JPanel
扩展而来请查看和以了解更多详细信息。您有许多问题:
paint
方法。通常不建议这样做,因为它不是双缓冲的,并且可以通过动画和其他绘制更新产生闪烁super.paint
。绘制
方法负责将所有子绘制方法拉到一起,包括,绘制组件
;但由于您不允许paint
完成它的工作,因此它不会为您呈现这些组件