来自不同类的JLabel没有被绘制

时间:2016-10-13 18:50:03

标签: java swing jframe jlabel

我正在尝试显示另一个类的标签。但是,当我将它添加到框架时,它将不会显示。我试过通过传递框架来从计数器类本身中绘制它,我认为这不是一个好习惯(忽略它不起作用的事实)。以及下面的代码中的内容。任何人都可以帮助我解释为什么我的解决方案不会显示创建的标签?你可能很有可能告诉我使用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;
    }

1 个答案:

答案 0 :(得分:1)

我修改了您的代码以创建以下Swing GUI。

enter image description here

每当我创建Swing游戏或应用程序时,我都会使用模型/视图/控制器模式。这意味着我创建了一个GUI模型。 GUI模型包含GUI所需的所有字段。接下来,我创建一个GUI视图,从GUI模型中读取值。最后,我创建了一个或多个GUI控制器,用于更新GUI模型并刷新/重新绘制GUI视图。

我对您的代码进行了以下更改:

  1. 我创建了一个GUI模型。我创建了Counter类。所有Counter类都有一个计数器值。

  2. 我创建了一个GUI视图,它使用GUI模型。我在视图类中创建了JFrame,JPanel和JLabel。您可以使用多个类来创建视图。由于这个视图很简单,我在一个类中创建了所有内容。

  3. 所有Swing应用程序必须以调用SwingUtilities invokeLater方法开始。 invokeLater方法在Event Dispatch thread上创建和更新Swing组件。 Oracle和我坚持认为所有Swing应用程序都是以这种方式开始的。

  4. 我创建了一个单独的动画可运行,以便您可以看到JLabel更新。我每秒增加一次计数器。

  5. Animation类中的repaint方法调用SwingUtilities invokeLater方法,以确保在Event Dispatch线程上完成JLabel更新。动画循环在一个单独的线程中运行,以保持GUI响应。

  6. 这是修改后的代码。

    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) {
    
                }
            }
        }
    }