现在的位置: 首页 > 综合 > 正文

关于Graphics类以及paint、paintComponent的用法

2013年08月22日 ⁄ 综合 ⁄ 共 16397字 ⁄ 字号 评论关闭

近来学习Graphics类,以及绘图方法,做了一个小程序,运行结果如下(按钮部分是ps做出来的图片):

代码如下:

Code:
  1.   
  2. public class TestDrawPicture extends JFrame {   
  3.     private static final long serialVersionUID = 2L;   
  4.     private JSplitPane mainJsp;   
  5.     private JSplitPane jsp;   
  6.     private MenuPane mp = new MenuPane();   
  7.     static Waveform dl;   
  8.     public TestDrawLine() {   
  9.         dl = new Waveform();   
  10.         setTitle("电磁波");   
  11.         setBounds(200100810500);   
  12.         jsp = new JSplitPane();   
  13.         jsp.setLeftComponent(new Manager());   
  14.         jsp.setRightComponent(dl);   
  15.         jsp.setDividerLocation(220);   
  16.         jsp.setDividerSize(1);   
  17.         jsp.setEnabled(false);   
  18.         mainJsp = new JSplitPane(JSplitPane.VERTICAL_SPLIT, mp, jsp);   
  19.         mainJsp.setDividerLocation(60);   
  20.         mainJsp.setDividerSize(1);   
  21.         mainJsp.setEnabled(false);   
  22.         add(mainJsp,BorderLayout.CENTER);   
  23.         this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);   
  24.         setResizable(false);   
  25.         setVisible(true);   
  26.     }   
  27.     public static void main(String[] args) {   
  28.         new TestDrawLine();   
  29.     }   
  30. }   
  31.   
  32. class MenuPane extends JPanel {   
  33.     /*  
  34.      * 菜单面板  
  35.      */  
  36.     private static String cmd = "正弦波";   
  37.     static boolean state = false;    //状态是否改变,以便重绘   
  38.     private static final long serialVersionUID = 3L;   
  39.     private JButton[] btnMenu = {   
  40.             new JButton(new ImageIcon("image/zxb.png")),   
  41.             new JButton(new ImageIcon("image/yxb.png")),   
  42.             new JButton(new ImageIcon("image/fb.png")),   
  43.             new JButton(new ImageIcon("image/jcb.png")),   
  44.             new JButton(new ImageIcon("image/mcb.png"))   
  45.     };   
  46.        
  47.     public MenuPane() {   
  48.         setLayout(new GridLayout(0,7,20,0));   
  49.         setBackground(new Color(171130255));   
  50.         this.setSize(getWidth()-80070);   
  51.         for(int i=0; i<btnMenu.length; i++) {   
  52.             btnMenu[i].setBackground(new Color(171130255));   
  53.             btnMenu[i].setBorderPainted(false);   
  54.             btnMenu[i].addActionListener(new BtnMenuListener());   
  55.             add(btnMenu[i]);   
  56.         }   
  57.     }   
  58.        
  59.     private void setCmd(String _cmd) {  //对外不提供接口   
  60.         cmd = _cmd;        
  61.     }   
  62.        
  63.     public String getCmd() {   
  64.         return cmd;   
  65.     }   
  66.        
  67.     public void setState(boolean bool) {   
  68.         state = bool;   
  69.     }   
  70.        
  71.     public boolean getState() {   
  72.         return state;   
  73.     }   
  74.        
  75.     class BtnMenuListener implements ActionListener {   
  76.         public void actionPerformed(ActionEvent e) {   
  77.             if(e.getSource() == btnMenu[0]) {   
  78.                 setCmd("正弦波");   
  79.             }   
  80.             if(e.getSource() == btnMenu[1]) {   
  81.                 setCmd("余弦波");   
  82.             }   
  83.             if(e.getSource() == btnMenu[2]) {   
  84.                 setCmd("方波");   
  85.             }   
  86.             if(e.getSource() == btnMenu[3]) {   
  87.                 setCmd("锯齿波");   
  88.             }   
  89.             if(e.getSource() == btnMenu[4]) {   
  90.                 setCmd("脉冲波");   
  91.             }   
  92.             setState(true);   
  93.         }   
  94.     }   
  95. }   
  96.   
  97. class Manager extends JPanel {   
  98.     /*  
  99.      * 绘图管理面板  
  100.      */  
  101.     private static final long serialVersionUID = 2L;   
  102.     private JSlider hSlider;         //水平滚动条   
  103.     private JLabel hLabel;           //水平偏移量标签   
  104.     private JLabel hTips;            //水平调节方式标签   
  105.     private JComboBox hcb;           //水平调节方式选择   
  106.     private JPanel hPanel;           //水平相关面板   
  107.     private JTextField hPosText;     //水平偏移量值   
  108.     private JSlider vSlider;         //垂直滚动条   
  109.     private JLabel vLabel;           //垂直偏移量标签   
  110.     private JComboBox vcb;           //垂直调节方式选择   
  111.     private JLabel vTips;            //垂直调节方式标签   
  112.     private JPanel vPanel;           //垂直相关面板   
  113.     private JTextField vPosText;     //垂直偏移量值   
  114.     private int wayOfSwitchH;        //水平调节方式   
  115.     private int wayOfSwitchV;        //垂直调节方式   
  116.        
  117.     private static int hPosValue = 0;   
  118.     private static int vPosValue = 0;   
  119.        
  120.     private JButton[] btn = {   
  121.             new JButton(new ImageIcon("image/left.jpg")),   
  122.             new JButton(new ImageIcon("image/right.jpg")),   
  123.             new JButton(new ImageIcon("image/left.jpg")),   
  124.             new JButton(new ImageIcon("image/right.jpg"))   
  125.     };   
  126.     static boolean state = false;    //状态是否改变,以便重绘   
  127.        
  128.     public Manager() {   
  129.         setLayout(new GridLayout(2,0));    
  130.         String[] item = {"默认比例","放大2倍","缩小2倍"};   
  131.         {   
  132.             wayOfSwitchH = 0;       //默认比例   
  133.             wayOfSwitchV = 0;   
  134.                
  135.             TitledBorder tb = new TitledBorder(BorderFactory.createLineBorder(new Color(25500)),"水平中心位置");       
  136.             tb.setTitleColor(Color.blue);   
  137.             hPanel = new JPanel(null);   
  138.             hPanel.setBorder(tb);   
  139.             hLabel = new JLabel("偏移量:");   
  140.             hLabel.setBounds(251508020);   
  141.             hTips = new JLabel("调节方式");   
  142.             hTips.setBounds(25308020);   
  143.                
  144.             hcb = new JComboBox(item);   
  145.             hcb.addItemListener(new CbxListener());   
  146.             hcb.setBounds(100308020);   
  147.                
  148.             hPosText = new JTextField("0");   
  149.             hPosText.setEditable(false);   
  150.             hPosText.setBounds(1001508020);   
  151.             hPosText.setHorizontalAlignment(JTextField.CENTER);   
  152.                
  153.             btn[0].setBounds(18,75,12,25);   
  154.             btn[0].addActionListener(new BtnActionListener());   
  155.             btn[1].setBounds(185,75,12,25);   
  156.             btn[1].addActionListener(new BtnActionListener());   
  157.                
  158.             hSlider = new JSlider(-50500);   
  159.             hSlider.setBounds(307515550);   
  160.             hSlider.setPaintTicks(true);   
  161.             hSlider.setMajorTickSpacing(25);   
  162.             hSlider.setMinorTickSpacing(5);   
  163.             hSlider.setPaintLabels(true);   
  164.             //为调节水平滚动条添加监听器   
  165.             hSlider.addChangeListener(new SliderHandler());   
  166.             hPanel.add(hLabel);   
  167.             hPanel.add(hTips);   
  168.             hPanel.add(hcb);   
  169.             hPanel.add(hPosText);   
  170.             hPanel.add(btn[0]);   
  171.             hPanel.add(btn[1]);   
  172.             hPanel.add(hSlider);   
  173.             add(hPanel);   
  174.         }   
  175.         {   
  176.             TitledBorder tb = new TitledBorder(BorderFactory.createLineBorder(new Color(25500)),"水平中心位置");       
  177.             tb.setTitleColor(Color.blue);   
  178.             vPanel = new JPanel(null);   
  179.             vPanel.setBorder(tb);   
  180.             vLabel = new JLabel("偏移量:");   
  181.             vLabel.setBounds(251508020);   
  182.                
  183.             vTips = new JLabel("调节方式");   
  184.             vTips.setBounds(25308020);   
  185.                
  186.             vcb = new JComboBox(item);   
  187.             vcb.addItemListener(new CbxListener());   
  188.             vcb.setBounds(100308020);   
  189.                
  190.             vPosText = new JTextField("0");   
  191.             vPosText.setEditable(false);   
  192.             vPosText.setBounds(1001508020);   
  193.             vPosText.setHorizontalAlignment(JTextField.CENTER);   
  194.                
  195.             btn[2].setBounds(18,75,12,25);   
  196.             btn[2].addActionListener(new BtnActionListener());   
  197.             btn[3].setBounds(185,75,12,25);   
  198.             btn[3].addActionListener(new BtnActionListener());   
  199.                
  200.             vSlider = new JSlider(-50500);   
  201.             vSlider.setBounds(307515550);   
  202.             vSlider.setPaintTicks(true);   
  203.             vSlider.setMajorTickSpacing(25);   
  204.             vSlider.setMinorTickSpacing(5);   
  205.             vSlider.setPaintLabels(true);   
  206.             //为调节垂直滚动条添加监听器   
  207.             vSlider.addChangeListener(new SliderHandler());   
  208.             vPanel.add(vLabel);   
  209.             vPanel.add(vTips);   
  210.             vPanel.add(vcb);   
  211.             vPanel.add(vPosText);   
  212.             vPanel.add(btn[2]);   
  213.             vPanel.add(btn[3]);   
  214.             vPanel.add(vSlider);   
  215.             add(vPanel);   
  216.         }   
  217.     }   
  218.        
  219.     public int getHposValue() {   
  220.         return hPosValue;   
  221.     }   
  222.        
  223.        
  224.     public int getVposValue() {   
  225.         return vPosValue;   
  226.     }   
  227.        
  228.     public void setState(boolean bool) {   
  229.         state = bool;   
  230.     }   
  231.        
  232.     public boolean getState() {   
  233.         return state;   
  234.     }   
  235.        
  236.     class SliderHandler implements ChangeListener {   //对滚动条进行监听   
  237.         /*  
  238.          * 实时对滚动条进行监听,并及时在数值文本框显示信息  
  239.          * 当选择调节方式变时,应及时更新显示的数值  
  240.          */  
  241.         public void stateChanged(ChangeEvent ce) {   
  242.             if(wayOfSwitchH == 0) {   
  243.                 hPosText.setText(""+hSlider.getValue());   
  244.             } else if(wayOfSwitchH == 1) {   
  245.                 hPosText.setText(""+hSlider.getValue()*2);   
  246.             } else {   
  247.                 hPosText.setText(""+hSlider.getValue()/2);   
  248.             }   
  249.                
  250.             hPosValue = Integer.parseInt(hPosText.getText());   
  251.                
  252.             if(wayOfSwitchV == 0) {   
  253.                 vPosText.setText(""+vSlider.getValue());   
  254.             } else if(wayOfSwitchV == 1) {   
  255.                 vPosText.setText(""+vSlider.getValue()*2);   
  256.             } else {   
  257.                 vPosText.setText(""+vSlider.getValue()/2);   
  258.             }   
  259.                
  260.             vPosValue = Integer.parseInt(vPosText.getText());   
  261.                
  262.             state = true//得到一个状态改变的消息   
  263.         }   
  264.     }   
  265.     class CbxListener implements ItemListener {    //对下拉列表进行监听   
  266.         /*  
  267.          * 对下拉列表进行实时监听,并及时在数值文本框显示信息  
  268.          * 当选择调节方式变时,应及时更新显示的数值  
  269.          */  
  270.         public void itemStateChanged(ItemEvent e) {   
  271.             state = true;   
  272.             if(e.getSource() == hcb) {   
  273.                 wayOfSwitchH = hcb.getSelectedIndex();   
  274.                 if(wayOfSwitchH == 0) {   
  275.                     hPosText.setText(""+hSlider.getValue());   
  276.                 } else if(wayOfSwitchH == 1) {   
  277.                     hPosText.setText(""+hSlider.getValue()*2);   
  278.                 } else {   
  279.                     hPosText.setText(""+hSlider.getValue()/2);   
  280.                 }   
  281.                 hPosValue = Integer.parseInt(hPosText.getText());   
  282.             }   
  283.             if(e.getSource() == vcb) {   
  284.                 wayOfSwitchV = vcb.getSelectedIndex();   
  285.                 if(wayOfSwitchV == 0) {   
  286.                     vPosText.setText(""+vSlider.getValue());   
  287.                 } else if(wayOfSwitchV == 1) {   
  288.                     vPosText.setText(""+vSlider.getValue()*2);   
  289.                 } else {   
  290.                     vPosText.setText(""+vSlider.getValue()/2);   
  291.                 }   
  292.                 vPosValue = Integer.parseInt(vPosText.getText());   
  293.             }   
  294.         }   
  295.     }   
  296.     class BtnActionListener implements ActionListener {   //对四个按钮进行监听   
  297.         /*  
  298.          * 以上三个监听器实现了信息的同步更新,但是代码冗余量较高  
  299.          */  
  300.         public void actionPerformed(ActionEvent e) {   
  301.             int hPos, vPos;   
  302.             hPos = hSlider.getValue();   
  303.             vPos = vSlider.getValue();   
  304.             state = true;   
  305.             if(e.getSource()==btn[0]) {   
  306.                 hPos--;   
  307.                 hSlider.setValue(hPos);   
  308.                 if(wayOfSwitchH == 0) {   
  309.                     hPosText.setText(""+hSlider.getValue());   
  310.                 } else if(wayOfSwitchH == 1) {   
  311.                     hPosText.setText(""+hSlider.getValue()*2);   
  312.                 } else {   
  313.                     hPosText.setText(""+hSlider.getValue()/2);   
  314.                 }   
  315.             }   
  316.             if(e.getSource()==btn[1]) {   
  317.                 hPos++;   
  318.                 hSlider.setValue(hPos);   
  319.                 if(wayOfSwitchH == 0) {   
  320.                     hPosText.setText(""+hSlider.getValue());   
  321.                 } else if(wayOfSwitchH == 1) {   
  322.                     hPosText.setText(""+hSlider.getValue()*2);   
  323.                 } else {   
  324.                     hPosText.setText(""+hSlider.getValue()/2);   
  325.                 }   
  326.             }   
  327.             if(e.getSource()==btn[2]) {   
  328.                 vPos--;   
  329.                 vSlider.setValue(vPos);   
  330.                 if(wayOfSwitchV == 0) {   
  331.                     vPosText.setText(""+vSlider.getValue());   
  332.                 } else if(wayOfSwitchV == 1) {   
  333.                     vPosText.setText(""+vSlider.getValue()*2);   
  334.                 } else {   
  335.                     vPosText.setText(""+vSlider.getValue()/2);   
  336.                 }   
  337.             }   
  338.             if(e.getSource()==btn[3]) {   
  339.                 vPos++;   
  340.                 vSlider.setValue(vPos);   
  341.                 if(wayOfSwitchV == 0) {   
  342.                     vPosText.setText(""+vSlider.getValue());   
  343.                 } else if(wayOfSwitchV == 1) {   
  344.                     vPosText.setText(""+vSlider.getValue()*2);   
  345.                 } else {   
  346.                     vPosText.setText(""+vSlider.getValue()/2);   
  347.                 }   
  348.             }   
  349.         }   
  350.     }   
  351. }   
  352. class Waveform extends JPanel implements Runnable {          
  353.     /*  
  354.      * 绘图面板  
  355.      */  
  356.     private static final long serialVersionUID = 1L;   
  357.     private Point start;   
  358.     private Point end;   
  359.     private Point temp = null;   
  360.     static int p = -300;   
  361.     private MenuPane menuPaint = new MenuPane();  //得到菜单栏的一个引用   
  362.     private Manager mgr = new Manager();          //得到管理面板的一个引用   
  363.     public Waveform() {   
  364.         setBackground(Color.BLACK);   
  365.         setBorder(BorderFactory.createEtchedBorder());   
  366.         new Thread(this).start();   //自身启动这个线程   
  367.     }   
  368.     public void paint(Graphics g) { 
  369.         super.paint(g);  
  370.         Color c = g.getColor();     //记录当前画笔颜色,以便恢复现场   
  371.         setBorder(BorderFactory.createEtchedBorder());   
  372.         g.fillRect(00this.getWidth(), this.getHeight());   
  373.         g.setColor(Color.red);   
  374.         start = new Point(080);   
  375.         end = new Point(080);   
  376.            
  377.         g.setColor(Color.BLUE);   
  378.         for(int i=0; i<1000; i+=25) {  //绘制坐标轴   
  379.             g.drawLine(0, i, 1000, i);   
  380.             g.drawLine(i, 0, i, 1000);   
  381.         }   
  382.            
  383.         g.setColor(Color.RED);   
  384.         for(int i=25,x=-100; i<=550; i+=25,x+=10) {  //绘制x坐标显示的值   
  385.             g.drawString(""+x, i+1202);   
  386.         }   
  387.         for(int i=23,y=70; i<=400; i+=25,y-=10) {   //绘制y坐标显示的值   
  388.             g.drawString(""+y, 277, i+4);   
  389.         }   
  390.            
  391.         g.setColor(Color.GREEN);   
  392.         if(menuPaint.getCmd() == "正弦波") {   
  393.             for(int x = p; x<1000; x++) {   //绘制曲线   
  394.                 temp = new Point(x+mgr.getHposValue(), mgr.getVposValue()+80+(int)(40*Math.sin(Math.PI*(x-80)/30)));   
  395.                 g.drawLine(start.x, start.y, end.x, end.y);   
  396.                 g.drawLine(790-start.x, start.y+120790-end.x, end.y+120);   
  397.                 g.drawLine(start.x, start.y+240, end.x, end.y+240);   
  398.                 start = end;   
  399.                 end = temp;   
  400.             }      
  401.         }   
  402.         if(menuPaint.getCmd() == "余弦波") {   
  403.             for(int x = p; x<1000; x++) {   //绘制曲线   
  404.                 temp = new Point(x+15+mgr.getHposValue(), mgr.getVposValue()+80+(int)(40*Math.sin(Math.PI*(x-80)/30)));   
  405.                 g.drawLine(start.x, start.y, end.x, end.y);   
  406.                 g.drawLine(790-start.x, start.y+120790-end.x, end.y+120);   
  407.                 g.drawLine(start.x, start.y+240, end.x, end.y+240);   
  408.                 start = end;   
  409.                 end = temp;   
  410.             }      
  411.         }   
  412.         if(menuPaint.getCmd() == "方波") {   
  413.             //GraphicsEnvironment em = GraphicsEnvironment.getLocalGraphicsEnvironment();   
  414.             //String[] fontNames = em.getAvailableFontFamilyNames();   
  415.             g.setFont(new Font("华文行楷", Font.BOLD, mgr.getHposValue()+50));   
  416.             g.drawString("方波波形"60, mgr.getVposValue()*5+50);   
  417.         }   
  418.         if(menuPaint.getCmd() == "锯齿波") {   
  419.             for(int x = p; x<1000; x++) {   //绘制曲线   
  420.                 temp = new Point(x+mgr.getHposValue(), mgr.getVposValue()+60+(int)(60*(x*0.02-(int)(x*0.02))));   
  421.                 g.drawLine(start.x, start.y, end.x, end.y);   
  422.                 g.drawLine(790-start.x, start.y+120790-end.x, end.y+120);   
  423.                 g.drawLine(start.x, start.y+240, end.x, end.y+240);   
  424.                 start = end;   
  425.                 end = temp;   
  426.             }   
  427.         }   
  428.         if(menuPaint.getCmd() == "脉冲波") {   
  429.             g.setFont(new Font("华文行楷", Font.BOLD, 100));   
  430.             g.drawString("脉冲波"100200);   
  431.         }   
  432.            
  433.         g.setColor(c);  //恢复画笔颜色   
  434.     }   
  435.   
  436.     public void run() {   
  437.         try {   
  438.             while(true) {   
  439.                 Thread.sleep(10);   
  440.                 repaint();  //一直重绘   
  441. //              if(menuPaint.getState()) {  //当条件改变时才重绘   
  442. //                  repaint();   
  443. //                  menuPaint.setState(false);   
  444. //              }   
  445.             }   
  446.         } catch (InterruptedException e) {   
  447.             e.printStackTrace();   
  448.         }   
  449.     }   
  450.        
  451.     class Point {

抱歉!评论已关闭.