Java 在面板上显示时钟
由于某些原因,当我将ClockComponent对象添加到JPanel对象时,它不会显示。当我将它添加到JFrame对象而不是JPanel对象时,它确实会显示。。。我不明白为什么,我在发布这个问题之前已经查过了,但是没有用。有没有办法让继承自JComponent的ClockComponent对象显示在JPanel上?非常感谢您事先的帮助 以下是我的ClockViewer类,它在运行时不会显示时钟:Java 在面板上显示时钟,java,swing,user-interface,awt,java-2d,Java,Swing,User Interface,Awt,Java 2d,由于某些原因,当我将ClockComponent对象添加到JPanel对象时,它不会显示。当我将它添加到JFrame对象而不是JPanel对象时,它确实会显示。。。我不明白为什么,我在发布这个问题之前已经查过了,但是没有用。有没有办法让继承自JComponent的ClockComponent对象显示在JPanel上?非常感谢您事先的帮助 以下是我的ClockViewer类,它在运行时不会显示时钟: import javax.swing.JFrame;
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);
}
}
以下是我的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);
}
}
在面板中,可以使用使时钟组件填满面板整个区域的布局,例如
GridLayout
:
JPanel panel = new JPanel(new GridLayout(1, 0));
面板的默认
FlowLayout
不会展开任何子组件。在面板中,可以使用使时钟组件填满面板整个区域的布局,例如GridLayout
:
JPanel panel = new JPanel(new GridLayout(1, 0));
面板的默认
FlowLayout
不会展开任何子组件。ClockComponent
应设置或覆盖首选大小。如果组件无法调整大小,许多人更愿意覆盖它。这个例子正好说明了这一点
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);
}
}
ClockComponent
应设置或覆盖首选尺寸。如果组件无法调整大小,许多人更愿意覆盖它。这个例子正好说明了这一点
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);
}
}
ClockComponent
应设置或覆盖首选大小。ClockComponent
应设置或覆盖首选大小。这当然有效。。。非常感谢。尽管如此,我还是想知道为什么没有显式参数中的GridLayout对象它就不能工作……谢谢大家!你们是救生员!另请注意,如果是单个组件newjpanel(newgridlayout(1,0))
可以缩写为newjpanel(newgridlayout())代码>。例如,这当然有效。。。非常感谢。尽管如此,我还是想知道为什么没有显式参数中的GridLayout对象它就不能工作……谢谢大家!你们是救生员!另请注意,如果是单个组件newjpanel(newgridlayout(1,0))
可以缩写为newjpanel(newgridlayout())代码>。例如,请参阅。