简体   繁体   English

在面板上显示时钟

[英]Showing a clock on a panel

For some reason, my ClockComponent object does not show up when I add it to a JPanel object. 由于某些原因,当我将ClockComponent对象添加到JPanel对象时,它不会显示。 It DOES show up when I add it to a JFrame object but not a JPanel object... I don't understand why and I've looked it up before posting this question here but to no avail. 当我将其添加到JFrame对象而不是JPanel对象时,它确实显示了。我不明白为什么,在将这个问题发布到这里之前,我已经对其进行了查找,但无济于事。 Is there any way to make my ClockComponent object which inherits from JComponent to show up on a JPanel? 有什么方法可以使从JComponent继承的ClockComponent对象显示在JPanel上? Thank you so much for your help in advance. 非常感谢您的提前帮助。

Here's my ClockViewer class which won't display a clock when run: 这是我的ClockViewer类,在运行时不会显示时钟:

            import javax.swing.JFrame;
            import javax.swing.JPanel;

            public class ClockViewer
            {
                public static void main(String[] args)
                {
                    JFrame frame = new JFrame();
                    frame.setTitle("Clock viewer");
                    frame.setSize(500, 500);
                    JPanel panel = new JPanel();

                    ClockComponent comps = new ClockComponent(7, 40);

                    panel.add(comps);
                    frame.add(panel);

                    frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
                    frame.setVisible(true);
                }
            }

And here's my ClockComponent class for reference: 这是我的ClockComponent类供参考:

            import java.awt.Graphics;
            import java.awt.Graphics2D;
            import java.awt.geom.Ellipse2D;
            import java.awt.geom.Line2D;

            import javax.swing.JComponent;

            public class ClockComponent extends JComponent
            {
                final int CENTER = 150;
                final double HOUR_HAND_LENGTH = 20;
                final double MINUTE_HAND_LENGTH = 40;

                private Line2D.Double hourHand;
                private Line2D.Double minuteHand;

                public ClockComponent(double hour, double minute)
                {
                    hourHand = new Line2D.Double(CENTER, CENTER, 
                            CENTER, CENTER - HOUR_HAND_LENGTH);
                    minuteHand = new Line2D.Double(CENTER, CENTER, 
                            CENTER, CENTER - MINUTE_HAND_LENGTH);

                    final int HOURS_ON_CLOCK = 12;
                    final int MINUTES_IN_HOUR = 60;
                    final double HOURS_TO_RADIANS = 2 * Math.PI / HOURS_ON_CLOCK;
                    final double MINUTES_TO_RADIANS = 2 * Math.PI / MINUTES_IN_HOUR;

                    hourHand.setLine(CENTER, CENTER, CENTER + HOUR_HAND_LENGTH * 
                            Math.sin((hour + minute / MINUTES_IN_HOUR) * HOURS_TO_RADIANS), 
                            CENTER - HOUR_HAND_LENGTH * 
                            Math.cos((hour + minute / MINUTES_IN_HOUR) * HOURS_TO_RADIANS));
                    minuteHand.setLine(CENTER, CENTER,
                            CENTER + MINUTE_HAND_LENGTH * Math.sin(minute * MINUTES_TO_RADIANS),
                            CENTER - MINUTE_HAND_LENGTH * Math.cos(minute * MINUTES_TO_RADIANS));
                }

                public void paintComponent(Graphics g)
                {
                    final int DIAMETER = 100;
                    final int POS_X_Y = CENTER - DIAMETER / 2;

                    Graphics2D g2 = (Graphics2D) g;

                    Ellipse2D.Double clockFace = 
                            new Ellipse2D.Double(POS_X_Y, POS_X_Y, DIAMETER, DIAMETER);

                    g2.draw(clockFace);
                    g2.draw(hourHand);
                    g2.draw(minuteHand);
                }
            }

In the panel, you could use a layout that makes the clock component fill the full area of the panel, such as GridLayout : 在面板中,您可以使用使时钟组件填充面板整个区域的布局,例如GridLayout

JPanel panel = new JPanel(new GridLayout(1, 0));

The default FlowLayout for the panel will not expand any of the child components. 面板的默认FlowLayout不会扩展任何子组件。

ClockComponent should set or override the preferred size. ClockComponent应该设置或覆盖首选大小。 Many prefer to override it if the component is not resizable. 如果组件无法调整大小,许多人都倾向于覆盖它。 This example just sets it. 这个例子只是设置它。

import java.awt.*;
import java.awt.geom.*;
import javax.swing.*;

public class ClockComponent extends JComponent
{
    final int CENTER = 150;
    final double HOUR_HAND_LENGTH = 20;
    final double MINUTE_HAND_LENGTH = 40;

    private Line2D.Double hourHand;
    private Line2D.Double minuteHand;

    public ClockComponent(double hour, double minute)
    {
        setPreferredSize(new Dimension(300,300));
        hourHand = new Line2D.Double(CENTER, CENTER, 
                CENTER, CENTER - HOUR_HAND_LENGTH);
        minuteHand = new Line2D.Double(CENTER, CENTER, 
                CENTER, CENTER - MINUTE_HAND_LENGTH);

        final int HOURS_ON_CLOCK = 12;
        final int MINUTES_IN_HOUR = 60;
        final double HOURS_TO_RADIANS = 2 * Math.PI / HOURS_ON_CLOCK;
        final double MINUTES_TO_RADIANS = 2 * Math.PI / MINUTES_IN_HOUR;

        hourHand.setLine(CENTER, CENTER, CENTER + HOUR_HAND_LENGTH * 
                Math.sin((hour + minute / MINUTES_IN_HOUR) * HOURS_TO_RADIANS), 
                CENTER - HOUR_HAND_LENGTH * 
                Math.cos((hour + minute / MINUTES_IN_HOUR) * HOURS_TO_RADIANS));
        minuteHand.setLine(CENTER, CENTER,
                CENTER + MINUTE_HAND_LENGTH * Math.sin(minute * MINUTES_TO_RADIANS),
                CENTER - MINUTE_HAND_LENGTH * Math.cos(minute * MINUTES_TO_RADIANS));
    }

    public void paintComponent(Graphics g)
    {
        final int DIAMETER = 100;
        final int POS_X_Y = CENTER - DIAMETER / 2;

        Graphics2D g2 = (Graphics2D) g;

        Ellipse2D.Double clockFace = 
                new Ellipse2D.Double(POS_X_Y, POS_X_Y, DIAMETER, DIAMETER);

        g2.draw(clockFace);
        g2.draw(hourHand);
        g2.draw(minuteHand);
    }

    public static void main(String[] args)
    {
        JFrame frame = new JFrame();
        frame.setTitle("Clock viewer");
        // bad practice
        //frame.setSize(500, 500);
        JPanel panel = new JPanel();

        ClockComponent comps = new ClockComponent(7, 40);

        panel.add(comps);
        frame.add(panel);
        // Good practice.
        frame.pack();

        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        frame.setVisible(true);
    }
}

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM