Java Jpanel没有';加载另一个类时不绘制
我确切地知道是哪一行导致了问题,但是没有显示堆栈跟踪错误,所以我只剩下调试了。让我困扰的问题是,我认为小组没有焦点。当第一次打开时,面板是空白的,并且没有绘制,但是当我最小化并恢复时,面板会被绘制。我尝试将Java Jpanel没有';加载另一个类时不绘制,java,swing,class,focus,jpanel,Java,Swing,Class,Focus,Jpanel,我确切地知道是哪一行导致了问题,但是没有显示堆栈跟踪错误,所以我只剩下调试了。让我困扰的问题是,我认为小组没有焦点。当第一次打开时,面板是空白的,并且没有绘制,但是当我最小化并恢复时,面板会被绘制。我尝试将panel.requestFocus()和panel.requestFocusInWindow()添加到在绘制屏幕之前初始化的类的构造函数中,但它似乎没有任何作用。代码如下: JPanel类: package blackjack; import java.awt.Color; import
panel.requestFocus()
和panel.requestFocusInWindow()
添加到在绘制屏幕之前初始化的类的构造函数中,但它似乎没有任何作用。代码如下:
JPanel类:
package blackjack;
import java.awt.Color;
import java.awt.Graphics;
import javax.swing.JPanel;
@SuppressWarnings("serial")
public class Board extends JPanel {
int dealer = 0;
int player = 0;
int money = 2500;
Deck deck;
Player p = new Player();
public Board() {
deck = new Deck(false, this); //if I comment this out, the panel gets painted straight away
}
public void paint(Graphics g) {
super.paintComponent(g);
g.setColor(Color.GREEN);
g.fillRect(0,0,getWidth(),getHeight());
repaint();
}
}
以及导致问题的类:
package blackjack;
import java.awt.Image;
import java.util.Random;
import javax.swing.ImageIcon;
public class Deck {
Card[] deck = new Card[52];
int[] used = new int[52];
Random r = new Random();
public Deck(boolean shuffle, Board b) {
int i = 0;
for(int x=0; x<51; x++) {
used[x] = -1;
}
for(Cards card : Cards.values()) {
if(card.getId() != 53) {
Image image = new ImageIcon(this.getClass().getResource(card.getImagePath())).getImage();
deck[i] = new Card(card.getId(),card.getValue(),image);
i = i+1;
}
}
if(shuffle) shuffle();
b.requestFocus();
b.requestFocusInWindow();
}
public void shuffle() {
Card[] shuffled = new Card[52];
for(int x=0; x<51; x++) {
int i = pickNotUsed();
if(i==-1) break;
shuffled[x] = deck[i];
}
deck = shuffled;
}
private int pickNotUsed() {
int notpicked = r.nextInt(52);
for(int x=0; x<51; x++) {
if(used[x] != notpicked) {
return notpicked;
}
}
return -1;
}
public Card[] getCards() {
return deck;
}
public Card drawCard() {
for(int x=0; x<deck.length; x++) {
if(deck[x] != null) {
return deck[x];
}
}
return null;
}
}
- 在显示JFrame(板)之前,将组件添加到JFrame(板)
- 不要替代“绘制方法”,而是将图形逻辑置于:
- 无需在paint方法中调用repaint(),因为它将导致无休止的循环。当需要重新绘制时,系统会自动调用Paint方法,或者当确实需要重新绘制时,系统会自动调用Paint方法
- 在你真正理解行为之前,不要请求关注。在这种情况下,调用它是没有意义的
无论如何,即使在这种状态下,您的应用程序从一开始就向我显示绿色背景框。您正在覆盖
paint
并在其主体中调用paintComponent
,然后重新绘制。不要在Board
课堂上做那些事<在paint/paintComponent
内部,code>repaint
将导致无限递归的paint调用(实际上,这将得到colaesed,这意味着只有当其他请求到达时,才会处理队列中的重新绘制请求)。相反,只需覆盖JPanel
的paintComponent
以及getPreferredSize
即可返回一些有效的维度
对象,并将super.paintComponent
作为第一行。是的。重写paintComponent(…)
并调用super.paintComponent(g)
。不要从内部调用repaint()
。不会有真正的递归,但它仍然是一种非常糟糕的动画制作方法。你的JFrame在哪里?你怎么展示这个?何时在JFrame上调用setVisible(true)
?添加组件之前或之后?不要覆盖paint(…)
,而是覆盖paintComponent(…)
。阅读JComponentAPI以查看其签名。Ahh。你提到我在哪里添加了setVisible()和add(newBoard())方法,我交换了它们,结果成功了。谢谢
import javax.swing.JFrame;
@SuppressWarnings("serial")
public class Blackjack extends JFrame {
public static void main(String[] args) {
new Blackjack();
}
public Blackjack() {
setSize(1000,600);
setTitle("Blackjack");
setResizable(false);
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
setVisible(true);
add(new Board());
}
}