Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/333.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 如何通过按键盘上的左右箭头键来更改背景色?(不在时钟内,在时钟外)_Java_Swing - Fatal编程技术网

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

我对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;
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添加到时钟类中

其他问题:

  • 不要覆盖paint()。相反,当使用Swing时,会覆盖paintComponent(…)

  • 不要覆盖update()。摆脱那些用AWT完成的代码,在使用Swing时不需要这些代码

  • 有关更多信息,请阅读上的Swing教程部分

    首先进行上述更改,以清理绘画逻辑

    然后,您可以执行以下操作以更好地实施Swing编码实践:

  • 不要用线。对Swing组件的更新应该在事件调度线程(EDT)上完成。相反,您应该使用

  • 不要使用KeyListener。相反,你应该使用

  • 我建议您在手边保留一个指向Swing教程的链接。我提供了3个部分的链接。您的大多数代码似乎都基于旧的AWT编码实践。使用
    Swing教程
    作为Swing的参考

    此外,秒、分钟和小时值都有变量。所以使用它们。不要一直调用该方法。这会让你的代码很混乱,因为人们会想知道为什么你创建了这个变量而从不使用它

    事实上,为什么上面的每个方法都有多个变量。每个值应该只有一个变量

    作为提示,您可以使用:

        Graphics2D g2 = (Graphics2D) g;
        g2.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON);
    
    在开始你的绘画方法时。它会把你的圆圈画得更平滑

    检查:作为实施绘画建议的示例。在该示例中,它向面板添加了鼠标侦听器。您希望从KeyListener开始,但如何实现该类的概念是相同的。

    请参阅: