我正在尝试显示另一个类的标签。但是,当我将它添加到框架时,它将不会显示。我试过通过传递框架来从计数器类本身中绘制它,我认为这不是一个好习惯(忽略它不起作用的事实)。以及下面的代码中的内容。任何人都可以帮助我解释为什么我的解决方案不会显示创建的标签?你可能很有可能告诉我使用JPanel非常新。
CookieChaser Class
public class CookieChaser extends JPanel {
public static void main(String[] args) throws InterruptedException {
JFrame frame = new JFrame("Cookie Chaser");
CookieChaser game = new CookieChaser();
frame.add(game);
frame.setSize(1000, 1000);
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
counter Score = new counter(frame);
cookie Cookie = new cookie();
JLabel item = counter.getLabel();
frame.add(item);
frame.setVisible(true);
while (true) {
game.repaint();
Thread.sleep(10);
}
}
@Override
public void paint(Graphics g) {
super.paint(g);
Graphics2D g2d = (Graphics2D) g;
g2d.setRenderingHint(RenderingHints.KEY_ANTIALIASING,
RenderingHints.VALUE_ANTIALIAS_ON);
}
}
专柜类
public class counter {
int count;
static JLabel text;
public counter(JFrame frame){
count = 0;
text = new JLabel(String.valueOf(count));
text.setLocation(0,0);
text.setSize(50,50);
}
public static JLabel getLabel(){
return text;
}
答案 0 :(得分:1)
我修改了您的代码以创建以下Swing GUI。
每当我创建Swing游戏或应用程序时,我都会使用模型/视图/控制器模式。这意味着我创建了一个GUI模型。 GUI模型包含GUI所需的所有字段。接下来,我创建一个GUI视图,从GUI模型中读取值。最后,我创建了一个或多个GUI控制器,用于更新GUI模型并刷新/重新绘制GUI视图。
我对您的代码进行了以下更改:
我创建了一个GUI模型。我创建了Counter类。所有Counter类都有一个计数器值。
我创建了一个GUI视图,它使用GUI模型。我在视图类中创建了JFrame,JPanel和JLabel。您可以使用多个类来创建视图。由于这个视图很简单,我在一个类中创建了所有内容。
所有Swing应用程序必须以调用SwingUtilities invokeLater方法开始。 invokeLater方法在Event Dispatch thread上创建和更新Swing组件。 Oracle和我坚持认为所有Swing应用程序都是以这种方式开始的。
我创建了一个单独的动画可运行,以便您可以看到JLabel更新。我每秒增加一次计数器。
Animation类中的repaint方法调用SwingUtilities invokeLater方法,以确保在Event Dispatch线程上完成JLabel更新。动画循环在一个单独的线程中运行,以保持GUI响应。
这是修改后的代码。
package com.ggl.testing;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.SwingUtilities;
public class CookieChaser implements Runnable {
public static void main(String[] args) {
SwingUtilities.invokeLater(new CookieChaser());
}
private JLabel counterLabel;
@Override
public void run() {
Counter counter = new Counter();
JFrame frame = new JFrame("Cookie Chaser");
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
JPanel mainPanel = new JPanel();
counterLabel = new JLabel(" ");
mainPanel.add(counterLabel);
frame.add(mainPanel);
frame.setSize(300, 200);
frame.setVisible(true);
new Thread(new Animation(this, counter)).start();
}
public void setCounterLabel(String text) {
counterLabel.setText(text);
}
public class Counter {
private int counter;
public int getCounter() {
return counter;
}
public void setCounter(int counter) {
this.counter = counter;
}
public void incrementCounter() {
this.counter++;
}
}
public class Animation implements Runnable {
private Counter counter;
private CookieChaser cookieChaser;
public Animation(CookieChaser cookieChaser, Counter counter) {
this.cookieChaser = cookieChaser;
this.counter = counter;
}
@Override
public void run() {
while (true) {
counter.incrementCounter();
repaint();
sleep(1000L);
}
}
private void repaint() {
SwingUtilities.invokeLater(new Runnable() {
@Override
public void run() {
cookieChaser.setCounterLabel(Integer.toString(counter
.getCounter()));
}
});
}
private void sleep(long duration) {
try {
Thread.sleep(duration);
} catch (InterruptedException e) {
}
}
}
}