Java 如何通过按键盘上的左右箭头键来更改背景色?(不在时钟内,在时钟外)
我对java编程相当陌生,我主要从互联网上找到这段代码,但对它进行了一些编辑。我认为代码运行良好。它显示当前时间及其指针的正确变化。我想通过使用第二个类来更改背景色Java 如何通过按键盘上的左右箭头键来更改背景色?(不在时钟内,在时钟外),java,swing,Java,Swing,我对java编程相当陌生,我主要从互联网上找到这段代码,但对它进行了一些编辑。我认为代码运行良好。它显示当前时间及其指针的正确变化。我想通过使用第二个类来更改背景色 import java.awt.BasicStroke; import java.awt.Color; import java.awt.Font; import java.awt.Graphics; import java.awt.Graphics2D; import java.awt.event.KeyEvent; imp
import java.awt.BasicStroke;
import java.awt.Color;
import java.awt.Font;
import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.event.KeyEvent;
import java.awt.event.KeyListener;
import java.text.SimpleDateFormat;
import java.time.LocalDateTime;
import java.util.Date;
import java.util.Locale;
import javax.swing.JFrame;
import javax.swing.JPanel;
public class Clock extends JPanel implements Runnable {
Thread thread = null;
int xcenter = 175;
int ycenter = 175;
private void drawStructure(Graphics g) {
Graphics2D g2 = (Graphics2D) g;
g.setFont(new Font("Italic", Font.ITALIC, 25));
g.setColor(Color.LIGHT_GRAY);
g2.setStroke(new BasicStroke(20));
g.drawOval(xcenter- 150, ycenter - 150, 300, 300);
g.setColor(Color.BLACK);
g.fillOval(xcenter-150, ycenter-150,300, 300);
g.setColor(Color.RED);
g.drawString("9",xcenter- 145, ycenter + 0);
g.drawString("3",xcenter + 135, ycenter + 0);
g.drawString("12",xcenter - 10, ycenter - 130);
g.drawString("6", xcenter- 10, ycenter + 145);
}
public void paint(Graphics g) {
Graphics2D g2 = (Graphics2D) g;
drawStructure(g);
LocalDateTime now = LocalDateTime.now();
int xksaniye = now.getSecond();
int yksaniye = now.getSecond();
int xkdakika = now.getMinute();
int ykdakika = now.getMinute();
int xksaat = now.getHour();
int yksaat = now.getHour();
xksaniye = (int) (Math.cos(now.getSecond() * 3.14f / 30 - 3.14f / 2) * 120 + xcenter);
yksaniye = (int)(Math.sin(now.getSecond() * 3.14f / 30 - 3.14f / 2) * 120 + ycenter);
xkdakika = (int)(Math.cos(now.getMinute() * 3.14f / 30 - 3.14f / 2) * 100 + xcenter);
ykdakika = (int)(Math.sin(now.getMinute() * 3.14f / 30 - 3.14f / 2) * 100 + ycenter);
xksaat = (int)(Math.cos((now.getHour() * 30 + now.getMinute() / 2) * 3.14f / 180 - 3.14f / 2) * 80 + xcenter);
yksaat = (int)(Math.sin(( now.getHour() * 30 + now.getMinute() / 2) * 3.14f / 180 - 3.14f / 2) * 80 + ycenter);
g.setColor(Color.magenta);
g2.setStroke(new BasicStroke(5));
g.drawLine(xcenter, ycenter,xksaniye, yksaniye);
g.setColor(Color.red);
g2.setStroke(new BasicStroke(5));
g.drawLine(xcenter, ycenter - 1,xkdakika, ykdakika);
g.drawLine(xcenter - 1, ycenter, xkdakika,ykdakika);
g.setColor(Color.green);
g2.setStroke(new BasicStroke(5));
g.drawLine(xcenter, ycenter - 1, xksaat, yksaat);
g.drawLine(xcenter - 1, ycenter,xksaat,yksaat);
}
public void start() {
if (thread == null) {
thread = new Thread(this);
thread.start();
}
}
public void stop() {
thread = null;
}
public void run() {
while (thread != null) {
try {
Thread.sleep(100);
}
catch (InterruptedException e) {}
repaint();
}
thread = null;
}
public void update(Graphics g){
paint(g);
}
public static void main(String[] args){
JFrame f = new JFrame("Analog Saat Pojesi");
f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
f.getContentPane().add(new Clock());
f.setBounds(0, 0, 370, 400);
Clock clock = new Clock();
f.add(clock);
f.setLocationRelativeTo(null);
f.setVisible(true);
clock.start();
Clock saat = new Clock();
}
}
import javax.swing.*;
import java.awt.*;
import java.awt.event.*;
public class ChangeColor extends JPanel{
public ChangeColor(){
addKeyListener(new DirectionListener());
setFocusable(true);
setBackground(Color.yellow);
}
private class DirectionListener implements KeyListener{
@Override
public void keyPressed(KeyEvent e) {
int keyCode = e.getKeyCode();
if (keyCode == KeyEvent.VK_LEFT){
setBackground(Color.red);
}
repaint();
}
@Override
public void keyReleased(KeyEvent e) {
// TODO Auto-generated method stub
}
@Override
public void keyTyped(KeyEvent e) {
// TODO Auto-generated method stub
}
}
}
这是我的第二节课
import java.awt.BasicStroke;
import java.awt.Color;
import java.awt.Font;
import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.event.KeyEvent;
import java.awt.event.KeyListener;
import java.text.SimpleDateFormat;
import java.time.LocalDateTime;
import java.util.Date;
import java.util.Locale;
import javax.swing.JFrame;
import javax.swing.JPanel;
public class Clock extends JPanel implements Runnable {
Thread thread = null;
int xcenter = 175;
int ycenter = 175;
private void drawStructure(Graphics g) {
Graphics2D g2 = (Graphics2D) g;
g.setFont(new Font("Italic", Font.ITALIC, 25));
g.setColor(Color.LIGHT_GRAY);
g2.setStroke(new BasicStroke(20));
g.drawOval(xcenter- 150, ycenter - 150, 300, 300);
g.setColor(Color.BLACK);
g.fillOval(xcenter-150, ycenter-150,300, 300);
g.setColor(Color.RED);
g.drawString("9",xcenter- 145, ycenter + 0);
g.drawString("3",xcenter + 135, ycenter + 0);
g.drawString("12",xcenter - 10, ycenter - 130);
g.drawString("6", xcenter- 10, ycenter + 145);
}
public void paint(Graphics g) {
Graphics2D g2 = (Graphics2D) g;
drawStructure(g);
LocalDateTime now = LocalDateTime.now();
int xksaniye = now.getSecond();
int yksaniye = now.getSecond();
int xkdakika = now.getMinute();
int ykdakika = now.getMinute();
int xksaat = now.getHour();
int yksaat = now.getHour();
xksaniye = (int) (Math.cos(now.getSecond() * 3.14f / 30 - 3.14f / 2) * 120 + xcenter);
yksaniye = (int)(Math.sin(now.getSecond() * 3.14f / 30 - 3.14f / 2) * 120 + ycenter);
xkdakika = (int)(Math.cos(now.getMinute() * 3.14f / 30 - 3.14f / 2) * 100 + xcenter);
ykdakika = (int)(Math.sin(now.getMinute() * 3.14f / 30 - 3.14f / 2) * 100 + ycenter);
xksaat = (int)(Math.cos((now.getHour() * 30 + now.getMinute() / 2) * 3.14f / 180 - 3.14f / 2) * 80 + xcenter);
yksaat = (int)(Math.sin(( now.getHour() * 30 + now.getMinute() / 2) * 3.14f / 180 - 3.14f / 2) * 80 + ycenter);
g.setColor(Color.magenta);
g2.setStroke(new BasicStroke(5));
g.drawLine(xcenter, ycenter,xksaniye, yksaniye);
g.setColor(Color.red);
g2.setStroke(new BasicStroke(5));
g.drawLine(xcenter, ycenter - 1,xkdakika, ykdakika);
g.drawLine(xcenter - 1, ycenter, xkdakika,ykdakika);
g.setColor(Color.green);
g2.setStroke(new BasicStroke(5));
g.drawLine(xcenter, ycenter - 1, xksaat, yksaat);
g.drawLine(xcenter - 1, ycenter,xksaat,yksaat);
}
public void start() {
if (thread == null) {
thread = new Thread(this);
thread.start();
}
}
public void stop() {
thread = null;
}
public void run() {
while (thread != null) {
try {
Thread.sleep(100);
}
catch (InterruptedException e) {}
repaint();
}
thread = null;
}
public void update(Graphics g){
paint(g);
}
public static void main(String[] args){
JFrame f = new JFrame("Analog Saat Pojesi");
f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
f.getContentPane().add(new Clock());
f.setBounds(0, 0, 370, 400);
Clock clock = new Clock();
f.add(clock);
f.setLocationRelativeTo(null);
f.setVisible(true);
clock.start();
Clock saat = new Clock();
}
}
import javax.swing.*;
import java.awt.*;
import java.awt.event.*;
public class ChangeColor extends JPanel{
public ChangeColor(){
addKeyListener(new DirectionListener());
setFocusable(true);
setBackground(Color.yellow);
}
private class DirectionListener implements KeyListener{
@Override
public void keyPressed(KeyEvent e) {
int keyCode = e.getKeyCode();
if (keyCode == KeyEvent.VK_LEFT){
setBackground(Color.red);
}
repaint();
}
@Override
public void keyReleased(KeyEvent e) {
// TODO Auto-generated method stub
}
@Override
public void keyTyped(KeyEvent e) {
// TODO Auto-generated method stub
}
}
}
从现在开始谢谢你的回答。正如我所说,我想改变背景,而不是时钟内部的颜色
我想通过使用第二个类来更改背景色
import java.awt.BasicStroke;
import java.awt.Color;
import java.awt.Font;
import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.event.KeyEvent;
import java.awt.event.KeyListener;
import java.text.SimpleDateFormat;
import java.time.LocalDateTime;
import java.util.Date;
import java.util.Locale;
import javax.swing.JFrame;
import javax.swing.JPanel;
public class Clock extends JPanel implements Runnable {
Thread thread = null;
int xcenter = 175;
int ycenter = 175;
private void drawStructure(Graphics g) {
Graphics2D g2 = (Graphics2D) g;
g.setFont(new Font("Italic", Font.ITALIC, 25));
g.setColor(Color.LIGHT_GRAY);
g2.setStroke(new BasicStroke(20));
g.drawOval(xcenter- 150, ycenter - 150, 300, 300);
g.setColor(Color.BLACK);
g.fillOval(xcenter-150, ycenter-150,300, 300);
g.setColor(Color.RED);
g.drawString("9",xcenter- 145, ycenter + 0);
g.drawString("3",xcenter + 135, ycenter + 0);
g.drawString("12",xcenter - 10, ycenter - 130);
g.drawString("6", xcenter- 10, ycenter + 145);
}
public void paint(Graphics g) {
Graphics2D g2 = (Graphics2D) g;
drawStructure(g);
LocalDateTime now = LocalDateTime.now();
int xksaniye = now.getSecond();
int yksaniye = now.getSecond();
int xkdakika = now.getMinute();
int ykdakika = now.getMinute();
int xksaat = now.getHour();
int yksaat = now.getHour();
xksaniye = (int) (Math.cos(now.getSecond() * 3.14f / 30 - 3.14f / 2) * 120 + xcenter);
yksaniye = (int)(Math.sin(now.getSecond() * 3.14f / 30 - 3.14f / 2) * 120 + ycenter);
xkdakika = (int)(Math.cos(now.getMinute() * 3.14f / 30 - 3.14f / 2) * 100 + xcenter);
ykdakika = (int)(Math.sin(now.getMinute() * 3.14f / 30 - 3.14f / 2) * 100 + ycenter);
xksaat = (int)(Math.cos((now.getHour() * 30 + now.getMinute() / 2) * 3.14f / 180 - 3.14f / 2) * 80 + xcenter);
yksaat = (int)(Math.sin(( now.getHour() * 30 + now.getMinute() / 2) * 3.14f / 180 - 3.14f / 2) * 80 + ycenter);
g.setColor(Color.magenta);
g2.setStroke(new BasicStroke(5));
g.drawLine(xcenter, ycenter,xksaniye, yksaniye);
g.setColor(Color.red);
g2.setStroke(new BasicStroke(5));
g.drawLine(xcenter, ycenter - 1,xkdakika, ykdakika);
g.drawLine(xcenter - 1, ycenter, xkdakika,ykdakika);
g.setColor(Color.green);
g2.setStroke(new BasicStroke(5));
g.drawLine(xcenter, ycenter - 1, xksaat, yksaat);
g.drawLine(xcenter - 1, ycenter,xksaat,yksaat);
}
public void start() {
if (thread == null) {
thread = new Thread(this);
thread.start();
}
}
public void stop() {
thread = null;
}
public void run() {
while (thread != null) {
try {
Thread.sleep(100);
}
catch (InterruptedException e) {}
repaint();
}
thread = null;
}
public void update(Graphics g){
paint(g);
}
public static void main(String[] args){
JFrame f = new JFrame("Analog Saat Pojesi");
f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
f.getContentPane().add(new Clock());
f.setBounds(0, 0, 370, 400);
Clock clock = new Clock();
f.add(clock);
f.setLocationRelativeTo(null);
f.setVisible(true);
clock.start();
Clock saat = new Clock();
}
}
import javax.swing.*;
import java.awt.*;
import java.awt.event.*;
public class ChangeColor extends JPanel{
public ChangeColor(){
addKeyListener(new DirectionListener());
setFocusable(true);
setBackground(Color.yellow);
}
private class DirectionListener implements KeyListener{
@Override
public void keyPressed(KeyEvent e) {
int keyCode = e.getKeyCode();
if (keyCode == KeyEvent.VK_LEFT){
setBackground(Color.red);
}
repaint();
}
@Override
public void keyReleased(KeyEvent e) {
// TODO Auto-generated method stub
}
@Override
public void keyTyped(KeyEvent e) {
// TODO Auto-generated method stub
}
}
}
这不是Swing的工作方式。KeyEvents仅调度到具有焦点的组件
你打算用你的ChangeColor课程做什么?你不能把它放在镜框上,因为它什么都不做
相反,您所需要的只是DirectionListener类。它应该是你的钟表课的一部分。然后在时钟类的构造函数中创建DirectionListener类的实例,并将其作为KeyListener添加到时钟类中
其他问题:
Swing教程
作为Swing的参考
此外,秒、分钟和小时值都有变量。所以使用它们。不要一直调用该方法。这会让你的代码很混乱,因为人们会想知道为什么你创建了这个变量而从不使用它
事实上,为什么上面的每个方法都有多个变量。每个值应该只有一个变量
作为提示,您可以使用:
Graphics2D g2 = (Graphics2D) g;
g2.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON);
在开始你的绘画方法时。它会把你的圆圈画得更平滑
检查:作为实施绘画建议的示例。在该示例中,它向面板添加了鼠标侦听器。您希望从KeyListener开始,但如何实现该类的概念是相同的。请参阅: