本文介绍了如何更改模拟时钟的钟面在Java中使用的BufferedImage的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧! 问题描述 29岁程序员,3月因学历无情被辞! 想修改一个java code,使用的BufferedImage实现模拟时钟。我希望时钟的脸,当用户点击,通过与图像的位置ploaded一个数组$ P $滚动按钮动态地改变。到目前为止,我尝试都失败了。我有两个班;第一类创建和显示模拟,而第二类试图改变使用突变(setAnalogClockFace())和一个访问模拟时钟面(getAnalogClockFace())。以下是code为第一类上的此处,稍作修改:Am trying to modify a java code that implements Analog Clock using BufferedImage. I want the face of the clock to be changed dynamically when a user clicks on a button that scrolls through an array preloaded with the locations of images. So far my attempts have failed. I have two classes; The first Class creates and displays the Analog, and the second class attempts to change the face of the Analog clock using a mutator (setAnalogClockFace()) and an accessor (getAnalogClockFace()). The following is the code for the first Class as found on here, with minor modifications:package panels;import java.awt.*;import java.awt.event.*;import java.awt.image.BufferedImage;import java.io.IOException;import javax.imageio.ImageIO;import javax.swing.*;import java.util.*;public class Clock extends JPanel{/** * */private static final long serialVersionUID = 1L;private int hours = 0;private int minutes = 0;private int seconds = 0;private int millis = 0;private static final int spacing = 10;private static final float threePi = (float)(3.0 * Math.PI);private static final float radPerSecMin = (float)(Math.PI/30.0);private int size; //height and width of clockfaceprivate int centerX;//X coord of middle of clockprivate int centerY;//Y coord of middle of clockprivate BufferedImage clockImage;private BufferedImage imageToUse;private javax.swing.Timer t;public Clock(){ this.setPreferredSize(new Dimension(203,203)); this.setBackground(getBackground()); this.setForeground(Color.darkGray); t = new javax.swing.Timer(1000, new ActionListener(){ public void actionPerformed(ActionEvent ae){ update(); } });}public void update(){ this.repaint();}public void start(){ t.start();}public void stop(){ t.stop();}public void paintComponent(Graphics g){ super.paintComponent(g); Graphics2D g2d = (Graphics2D)g; g2d.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON); int w = getWidth(); int h = getHeight(); size = ((w < h) ? w : h) - 2 * spacing; centerX = size/2 + spacing; centerY = size/2 + spacing; setClockFace(new AnalogClockTimer().getAnalogClockFace()); clockImage = getClockFace(); if (clockImage == null | clockImage.getWidth() != w | clockImage.getHeight() != h){ clockImage = (BufferedImage)(this.createImage(w,h)); Graphics2D gc = clockImage.createGraphics(); gc.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON); drawClockFace(gc); } Calendar now = Calendar.getInstance(); hours = now.get(Calendar.HOUR); minutes = now.get(Calendar.MINUTE); seconds = now.get(Calendar.SECOND); millis = now.get(Calendar.MILLISECOND); g2d.drawImage(clockImage, null, 0, 0); drawClockHands(g);}private void drawClockHands(Graphics g){ int secondRadius = size/2; int minuteRadius = secondRadius * 3/4; int hourRadius = secondRadius/2; float fseconds = seconds + (float)millis/1000; float secondAngle = threePi - (radPerSecMin * fseconds); drawRadius(g, centerX, centerY, secondAngle, 0, secondRadius); float fminutes = (float)(minutes + fseconds/60.0); float minuteAngle = threePi - (radPerSecMin * fminutes); drawRadius(g, centerX, centerY, minuteAngle, 0 , minuteRadius); float fhours = (float)(hours + fminutes/60.0); float hourAngle = threePi - (5 * radPerSecMin * fhours); drawRadius(g, centerX, centerY, hourAngle, 0 ,hourRadius);}private void drawClockFace(Graphics g){ //g.setColor(Color.lightGray); g.fillOval(spacing, spacing, size, size); //g.setColor(new Color(168,168,168)); g.drawOval(spacing, spacing, size, size); for(int sec = 0; sec < 60; sec++){ int tickStart; if(sec%5 == 0){ tickStart = size/2-10; }else{ tickStart = size/2-5; } drawRadius(g, centerX, centerY, radPerSecMin * sec, tickStart, size/2); }}private void drawRadius(Graphics g, int x, int y, double angle, int minRadius, int maxRadius){ float sine = (float)Math.sin(angle); float cosine = (float)Math.cos(angle); int dxmin = (int)(minRadius * sine); int dymin = (int)(minRadius * cosine); int dxmax = (int)(maxRadius * sine); int dymax = (int)(maxRadius * cosine); g.drawLine(x+dxmin, y+dymin, x+dxmax,y+dymax);}public void setClockFace(BufferedImage img){ if(img != null){ imageToUse = img; }else{ try{ imageToUse =ImageIO.read(getClass().getClassLoader().getResource("http://imgur.com/T8x0I29")); }catch(IOException io){ io.printStackTrace(); } }}public BufferedImage getClockFace(){ return imageToUse;}}这是试图设置钟面第二类是:The second Class that attempts to set the Clock face is:package panels;import java.awt.BorderLayout;import java.awt.Dimension;import java.awt.FlowLayout;import java.awt.event.ActionEvent;import java.awt.event.ActionListener;import java.awt.event.MouseEvent;import java.awt.event.MouseListener;import java.awt.image.BufferedImage;import java.io.IOException;import javax.imageio.ImageIO;import javax.swing.ImageIcon;import javax.swing.JButton;import javax.swing.SwingConstants;import javax.swing.WindowConstants;import javax.swing.JFrame;import javax.swing.JPanel;import javax.swing.JTextField;import panels.Clock;public class AnalogClockTimer extends javax.swing.JPanel implements ActionListener,MouseListener {private Clock clock;/** * */private static final long serialVersionUID = 1L;private JButton prevBtn;private JTextField clockFaceCount;private JButton nextBtn;private JPanel buttonedPanel,leftPanel,rightPanel;private BufferedImage image;String[] clockFace;int arrayPointer = 1;/*** Auto-generated main method to display this* JPanel inside a new JFrame.*/public static void main(String[] args) { JFrame frame = new JFrame(); frame.getContentPane().add(new AnalogClockTimer()); frame.setDefaultCloseOperation(WindowConstants.DISPOSE_ON_CLOSE); frame.pack(); frame.setVisible(true);}public AnalogClockTimer() { super(); initGUI();}private void initGUI() { try { BorderLayout thisLayout = new BorderLayout(); this.setLayout(thisLayout); this.setPreferredSize(new java.awt.Dimension(283, 233)); this.setBackground(getBackground()); { clock = new Clock(); add(clock,BorderLayout.CENTER); clock.start(); clock.setSize(203, 203); } { buttonedPanel = new JPanel(); FlowLayout buttonedPanelLayout = new FlowLayout(); buttonedPanel.setLayout(buttonedPanelLayout); this.add(buttonedPanel, BorderLayout.SOUTH); buttonedPanel.setPreferredSize(new java.awt.Dimension(283, 30)); { prevBtn = new JButton(new ImageIcon(getClass().getClassLoader().getResource("icons/settings_left_rest.png"))); prevBtn.setPreferredSize(new java.awt.Dimension(20, 19)); prevBtn.setBackground(getBackground()); prevBtn.setBorderPainted(false); prevBtn.setEnabled(false); prevBtn.addMouseListener(this); prevBtn.addActionListener(this); buttonedPanel.add(prevBtn); } { nextBtn = new JButton(new ImageIcon(getClass().getClassLoader().getResource("icons/settings_right_rest.png"))); nextBtn.setPreferredSize(new java.awt.Dimension(20, 19)); nextBtn.setBackground(getBackground()); nextBtn.setBorderPainted(false); nextBtn.addMouseListener(this); nextBtn.addActionListener(this); } { clockFaceCount = new JTextField(); clockFaceCount.setPreferredSize(new java.awt.Dimension(50, 19)); clockFaceCount.setBackground(getBackground()); clockFaceCount.setBorder(null); clockFaceCount.setHorizontalAlignment(SwingConstants.CENTER); clockFaceCount.setEditable(false); buttonedPanel.add(clockFaceCount); buttonedPanel.add(nextBtn); } { clockFace = new String[]{"http://imgur.com/079QSdJ","http://imgur.com/vQ7tZjI", "http://imgur.com/T8x0I29"}; for(int i = 1; i <= clockFace.length; i++){ if(i == 1){ nextBtn.setEnabled(true); prevBtn.setEnabled(false); } clockFaceCount.setText(arrayPointer+" of "+clockFace.length); } } { leftPanel = new JPanel(); leftPanel.setPreferredSize(new Dimension(40, getHeight())); add(leftPanel,BorderLayout.WEST); } { rightPanel = new JPanel(); rightPanel.setPreferredSize(new Dimension(40,getHeight())); add(rightPanel,BorderLayout.EAST); } } } catch (Exception e) { e.printStackTrace(); }}@Overridepublic void mouseClicked(MouseEvent me) { if(me.getSource() == prevBtn) prevBtn.setIcon(new ImageIcon(getClass().getClassLoader().getResource("icons/settings_left_pressed.png"))); else nextBtn.setIcon(new ImageIcon(getClass().getClassLoader().getResource("icons/settings_right_pressed.png")));}@Overridepublic void mouseEntered(MouseEvent me) { if(me.getSource()==prevBtn) prevBtn.setIcon(new ImageIcon(getClass().getClassLoader().getResource("icons/settings_left_hover.png"))); else nextBtn.setIcon(new ImageIcon(getClass().getClassLoader().getResource("icons/settings_right_hover.png")));}@Overridepublic void mouseExited(MouseEvent me) { if(me.getSource() == prevBtn) prevBtn.setIcon(new ImageIcon(getClass().getClassLoader().getResource("icons/settings_left_rest.png"))); else nextBtn.setIcon(new ImageIcon(getClass().getClassLoader().getResource("icons/settings_right_rest.png")));}@Overridepublic void mousePressed(MouseEvent me) { if(me.getSource() == prevBtn){ prevBtn.setIcon(new ImageIcon(getClass().getClassLoader().getResource("icons/settings_left_pressed.png"))); }else{ nextBtn.setIcon(new ImageIcon(getClass().getClassLoader().getResource("icons/settings_right_pressed.png"))); }}@Overridepublic void mouseReleased(MouseEvent me) { if(me.getSource() == prevBtn) prevBtn.setIcon(new ImageIcon(getClass().getClassLoader().getResource("icons/settings_left_hover.png"))); else nextBtn.setIcon(new ImageIcon(getClass().getClassLoader().getResource("icons/settings_right_hover.png")));}@Overridepublic void actionPerformed(ActionEvent ae) { if(ae.getSource() == nextBtn){ { if(arrayPointer < clockFace.length){ ++arrayPointer; prevBtn.setEnabled(true); if(arrayPointer == clockFace.length) nextBtn.setEnabled(false); } clockFaceCount.setText(arrayPointer + " of " + clockFace.length); setAnalogClockFace(arrayPointer); } }else if(ae.getSource() == prevBtn){ { if(arrayPointer > 1){ --arrayPointer; nextBtn.setEnabled(true); if(arrayPointer == 1){ clockFaceCount.setText(arrayPointer+" of "+clockFace.length); prevBtn.setEnabled(false); } } clockFaceCount.setText(arrayPointer + " of "+clockFace.length); setAnalogClockFace(arrayPointer); } }}private void setAnalogClockFace(int pointerPosition) { try{ image = ImageIO.read(getClass().getClassLoader().getResource(clockFace[pointerPosition])); }catch(IOException io){ io.printStackTrace(); }}public BufferedImage getAnalogClockFace(){ return image;}}我一直工作在这几天,有人可以帮我明白我没有这样做对吗?任何帮助将大大AP preciated。I've been working on this for days, can someone please help me understand what am not doing right? Any help would be greatly appreciated.下面是一个使用MCVE一个JLabel来实现同样的结果:Here is an MCVE using a JLabel to achieve the same result:package panels;import java.awt.Dimension;import javax.swing.ImageIcon;import javax.swing.SwingConstants;import javax.swing.WindowConstants;import javax.swing.JFrame;import javax.swing.JLabel;import javax.swing.JPanel;import javax.swing.JButton;import javax.swing.JTextField;import java.awt.event.*;import java.awt.BorderLayout;@SuppressWarnings({"serial"})public class ClockPanel extends javax.swing.JPanel implements ActionListener {private JLabel clockImageLabel;private JPanel buttonsPanel;private JButton next,prev;private JTextField displayCount;String[] imageFaces;int pointer = 1;/*** Auto-generated main method to display this* JPanel inside a new JFrame.*/public static void main(String[] args) { JFrame frame = new JFrame(); frame.getContentPane().add(new ClockPanel()); frame.setDefaultCloseOperation(WindowConstants.DISPOSE_ON_CLOSE); frame.pack(); frame.setVisible(true);}public ClockPanel() { super(); initGUI();}private void initGUI() { try { setPreferredSize(new Dimension(203, 237)); BorderLayout panelLayout = new BorderLayout(); setLayout(panelLayout); { clockImageLabel = new JLabel(); clockImageLabel.setPreferredSize(new Dimension(203,203)); clockImageLabel.setHorizontalAlignment(SwingConstants.CENTER); clockImageLabel.setVerticalAlignment(SwingConstants.CENTER); add(clockImageLabel,BorderLayout.NORTH); } { buttonsPanel = new JPanel(); { next = new JButton(">"); next.addActionListener(this); } { prev = new JButton("<"); prev.addActionListener(this); displayCount = new JTextField(); displayCount.setBorder(null); displayCount.setEditable(false); displayCount.setBackground(getBackground()); displayCount.setHorizontalAlignment(SwingConstants.CENTER); buttonsPanel.add(prev); buttonsPanel.add(displayCount); displayCount.setPreferredSize(new java.awt.Dimension(45, 23)); buttonsPanel.add(next); add(buttonsPanel,BorderLayout.SOUTH); } { imageFaces = new String[]{"http://imgur.com/T8x0I29", "http://imgur.com/079QSdJ","http://imgur.com/vQ7tZjI" }; for(int i = 1; i < imageFaces.length; i++){ if(i == 1){ next.setEnabled(true); prev.setEnabled(false); } displayCount.setText(pointer+" of "+imageFaces.length); setLabelImage(pointer); } } } } catch (Exception e) { e.printStackTrace(); }}private void setLabelImage(int pointerPosition){ clockImageLabel.setIcon(new ImageIcon(getClass().getClassLoader().getResource(imageFaces[pointerPosition]))); this.repaint();}@Overridepublic void actionPerformed(ActionEvent ae) { if(ae.getSource() == next){ if(pointer < imageFaces.length){ ++pointer; prev.setEnabled(true); if(pointer == imageFaces.length)next.setEnabled(false); displayCount.setText(pointer+" of "+imageFaces.length); setLabelImage(pointer); } }else if(ae.getSource() == prev){ if(pointer > 1){ --pointer; next.setEnabled(true); if(pointer == 1)prev.setEnabled(false); displayCount.setText(pointer+" of "+imageFaces.length); setLabelImage(pointer); } }}}下面是1/2图片为code: HandlessAnalogClock 1 HandlessAnalogClock 2 HandlessAnalogClock 3Here are 1/2 Images for the code: HandlessAnalogClock 1 HandlessAnalogClock 2 HandlessAnalogClock 3推荐答案扩大对@ 安德鲁的示例时,考虑安排用于当前图象的至 环绕的,如图举的例子的这里。Expanding on @Andrew's example, consider arranging for the index of the current image to wrap-around, as shown in the example cited here.private int pointer = 0;...private void initGUI() { ... setLabelImage(pointer); ...}private void setLabelImage(int pointerPosition) { System.out.println("setLabelImage: " + pointerPosition); clockImageLabel.setIcon(new ImageIcon(images[pointerPosition])); displayCount.setText((pointerPosition + 1) + " of " + images.length); this.repaint();}@Overridepublic void actionPerformed(ActionEvent ae) { if (ae.getSource() == next) { pointer++; if (pointer >= images.length) { pointer = 0; } } else if (ae.getSource() == prev) { pointer--; if (pointer < 0) { pointer = images.length - 1; } } setLabelImage(pointer);}作为练习,通过创建一个分解出的ImageIcon 在 setLabelImage()的重复实例列表与LT; ImageIcon的方式&gt; 在 initGUI() 这篇关于如何更改模拟时钟的钟面在Java中使用的BufferedImage的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持! 上岸,阿里云! 08-28 20:52