'그리기'버튼을 누르면 시계가 나타나지 않습니다. 그 안에있는 textField 객체의 setText 메서드를 호출하면 버튼이 제대로 작동한다는 것을 알 수 있습니다. 나는 여러 가지 일을 시도했는데 아무 것도 찾을 수 없습니다. 나는 심지어 내 교수에게 다가 섰고, 그는 또한 힘든 시간을 보냈다. 하지만 프레임 크기를 조정하면 갑자기 나타났습니다. 왜 그런지 이해할 수 없으며 단순히 '그리기'버튼을 누르는 것만으로 시계를 표시하는 방법을 파악하려고합니다. 어떤 도움을 주셔서 감사 드리며 미리 감사드립니다.JFrame의 크기가 바뀔 때 시계가 나타납니다.
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 HOURS_ON_CLOCK = 12;
final double MINUTES_IN_HOUR = 60;
final double HOUR_LENGTH = .4;
final double MINUTE_LENGTH = .9;
private double radius;
private double posXY;
private double hourHandLength;
private double minuteHandLength;
private double center;
private Line2D.Double hourHand;
private Line2D.Double minuteHand;
public ClockComponent(double rad, double xy)
{
radius = rad;
posXY = xy;
center = posXY + radius;
hourHandLength = radius * HOUR_LENGTH;
minuteHandLength = radius * MINUTE_LENGTH;
hourHand = new Line2D.Double(center, center,
center, center - hourHandLength);
minuteHand = new Line2D.Double(center, center,
center, center - minuteHandLength);
}
public void setClock(int hour, int minute)
{
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 + hourHandLength *
Math.sin((hour + minute/MINUTES_IN_HOUR) * HOURS_TO_RADIANS),
center - hourHandLength *
Math.cos((hour + minute/MINUTES_IN_HOUR) * HOURS_TO_RADIANS));
minuteHand.setLine(center, center,
center + minuteHandLength * Math.sin(minute * MINUTES_TO_RADIANS),
center - minuteHandLength * Math.cos(minute * MINUTES_TO_RADIANS));
}
public void paintComponent(Graphics g)
{
Graphics2D g2 = (Graphics2D) g;
double diameter = 2 * radius;
Ellipse2D.Double clockFace =
new Ellipse2D.Double(posXY, posXY, diameter, diameter);
g2.draw(clockFace);
g2.draw(hourHand);
g2.draw(minuteHand);
}
}
ClockFrame 클래스를 ActionListener를 내부 클래스 : 여기
당신이 그들에게 자신을 실행하고자하지만, 그 선호 간결, ClockFrame 클래스에서 내부 클래스에 초점 단지의 경우 자신의 전체 내 클래스입니다. 나는 ActionListener를 내부 클래스는 내가 뭔가를 놓친 거지 곳이라고 생각하지만 정확히 ... import java.awt.BorderLayout;
import java.awt.GridLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.JTextField;
import javax.swing.border.EtchedBorder;
public class ClockFrame extends JFrame
{
final int FIELD_SIZE = 10;
final int FRAME_WIDTH = 450;
final int FRAME_HEIGHT = 450;
final int FIELD_WIDTH = 5;
private JPanel frameFace;
private JPanel fieldPanel;
private JPanel drawingPanel;
private JLabel hourLabel;
private JLabel minuteLabel;
private JTextField hourField;
private JTextField minuteField;
private JButton drawButton;
private ClockComponent clock;
public ClockFrame(double rad, double xy)
{
setTitle("Clock viewer");
setSize(FRAME_WIDTH, FRAME_HEIGHT);
frameFace = new JPanel(new BorderLayout());
fieldPanel = new JPanel();
drawingPanel = new JPanel();
drawingPanel.setBorder(new EtchedBorder());
hourLabel = new JLabel();
hourLabel.setText("Hour ");
minuteLabel = new JLabel();
minuteLabel.setText("Minute ");
hourField = new JTextField(FIELD_SIZE);
minuteField = new JTextField(FIELD_SIZE);
drawButton = new JButton("Draw");
drawingPanel.setLayout(new GridLayout(1, 1));
clock = new ClockComponent(rad, xy);
fieldPanel.add(hourLabel);
fieldPanel.add(hourField);
fieldPanel.add(minuteLabel);
fieldPanel.add(minuteField);
fieldPanel.add(drawButton);
ActionListener clockListener = new DrawListener();
drawButton.addActionListener(clockListener);
frameFace.add(fieldPanel, BorderLayout.NORTH);
frameFace.add(drawingPanel, BorderLayout.CENTER);
add(frameFace);
}
class DrawListener implements ActionListener
{
public void actionPerformed(ActionEvent event)
{
int hour = Integer.parseInt(hourField.getText());
int minute = Integer.parseInt(minuteField.getText());
clock.setClock(hour, minute);
drawingPanel.add(clock);
}
}
}
그리고 주요 방법은
import javax.swing.JFrame;
public class ClockViewer
{
public static void main(String[] args)
{
JFrame frame = new ClockFrame(75, 100);
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.setVisible(true);
}
}
은 훌륭하게 일을 그! 너무 감사합니다! – user1800967
@ user1800967 : 환영합니다! –