2013-03-28 35 views
1

我正在寫一個揮杆程序,使用鏈接的節點來存儲一個值,然後將其中包含的值以黃色條形式繪製到JPanel中。這幅畫最初是使用AWT完成的。我已經閱讀了一些有關在swing中繪畫的教程,但我仍然不明白如何繪製JPanel。當按下「隨機」按鈕時,該程序應該繪製條形圖,但目前不繪製任何圖形。如何繪製JPanel在揮杆

我已經包含了我認爲相關的代碼,但是如果您需要其他任何部分,請告訴我。預先感謝您可以給我的任何幫助或任何教程,您可以指向我。

public class DataOrganizer extends JPanel 
    { 

     private JFrame frame; 

     protected static final Color DEFAULT_COLOR = Color.YELLOW; 

     protected static final Color HIGHLIGHT_COLOR = Color.YELLOW.darker(); 

     protected DataCollection<Item> collection; // To hold our items 

     protected DataCollection<Item> sortedCollection; 

     protected Item selected; 

     private final int COLLECTION_SIZE = 10, // Maximum number of items 
       MAXIMUM_ITEM_VALUE = 16; // Maximum value of an item 

     private int firstItemXCoord; 

     protected int firstItemYCoord; 

     /** 
     * Launch the application. 
     */ 
     public static void main(String[] args) 
     { 
      EventQueue.invokeLater(new Runnable() { 
       public void run() 
       { 
        try 
        { 
         DataOrganizer window = new DataOrganizer(); 
         window.frame.setVisible(true); 
        } 
        catch (Exception e) 
        { 
         e.printStackTrace(); 
        } 
       } 
      }); 
     } 

     /** 
     * Create the application. 
     */ 
     public DataOrganizer() 
     { 
      initialize(); 

     } 

     /** 
     * Initialize the contents of the frame. 
     */ 
     private void initialize() 
     { 
      /* 
      * Create and set-up the JFrame. 
      */ 
      frame = new JFrame(); 
      frame.setPreferredSize(new Dimension(550, 450)); 
      frame.setBounds(100, 100, 600, 400); 
      frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
      frame.getContentPane().setLayout(null); 
      frame.setVisible(true); 

      /* 
      * Create btnRandom and add an action listener 
      * that calls randomAction(). 
      */ 
      JButton btnRandom = new JButton("Random"); 
      btnRandom.addActionListener(new ActionListener() { 
       public void actionPerformed(ActionEvent e) { 
        randomAction(); 
       } 
      }); 
      btnRandom.setBounds(6, 18, 117, 29); 
      frame.getContentPane().add(btnRandom); 

      /* 
      * Create btnMaximum and add an action listener 
      * that calls maximumAction(). 
      */ 
      JButton btnMaximum = new JButton("Maximum"); 
      btnMaximum.addActionListener(new ActionListener() { 
       public void actionPerformed(ActionEvent e) { 
        maximumAction(); 
       } 
      }); 
      btnMaximum.setBounds(6, 59, 117, 29); 
      frame.getContentPane().add(btnMaximum); 

      /* 
      * Create btnMinimum and add an action listener 
      * that calls minimumAction(). 
      */ 
      JButton btnMinimum = new JButton("Minimum"); 
      btnMinimum.addActionListener(new ActionListener() { 
       public void actionPerformed(ActionEvent e) { 
        minimumAction(); 
       } 
      }); 
      btnMinimum.setBounds(6, 100, 117, 29); 
      frame.getContentPane().add(btnMinimum); 

      /* 
      * Create btnRemove and add an action listener 
      * that calls removeAction(). 
      */ 
      JButton btnRemove = new JButton("Remove"); 
      btnRemove.addActionListener(new ActionListener() { 
       public void actionPerformed(ActionEvent e) { 
        removeAction(); 
       } 
      }); 
      btnRemove.setBounds(6, 141, 117, 29); 
      frame.getContentPane().add(btnRemove); 

      /* 
      * Create btnSort and add an action listener 
      * that calls sort(). 
      */ 
      JButton btnSort = new JButton("Sort"); 
      btnSort.addActionListener(new ActionListener() { 
       public void actionPerformed(ActionEvent e) { 
        sort(); 
       } 
      }); 
      btnSort.setBounds(6, 182, 117, 29); 
      frame.getContentPane().add(btnSort); 

      /* 
      * Create the JPanel, set the bounds, 
      * and add it to the frame. 
      */ 
      JPanel panel = new JPanel(); 
      panel.setBounds(135, 0, 465, 378); 
      frame.getContentPane().add(panel); 

      //Initialize the unsorted collection 
      collection = new DataCollection<Item>(COLLECTION_SIZE); 

      //Initialize the sorted collection 
      sortedCollection = new DataCollection<Item>(COLLECTION_SIZE); 

      repaint(); 
     } 


     public void paintComponent(Graphics panel) { 

      super.paintComponent(panel); 

      panel.drawString("Hello World", 140 , 10); 

      /* 
      * Display the Items when instantiated. 
      */ 

      if (collection != null) 
      { 

       Item item;    
       int xCoord = firstItemXCoord; 

       /* 
       * Reset the selected item to the start of the collection, 
       * ensuring it always starts at the first node 
       */ 
       collection.reset(); 

         //While there is another node in the collection, loop through. 
       while (collection.hasNext()) 
       { 
        /* 
        * Set the item to the selected node. 
        * Which since reset() was called on the 
        * collection, it should be the first node 
        * in the collection. Then set the next node in the 
        * collection a the selected one. 
        */ 
        item = collection.next(); 

        /* 
        * Call the paint method in the item class 
        */ 
        item.paint(panel, xCoord, firstItemXCoord); 
        xCoord += Item.OVERALL_WIDTH; 
       } 

      } 

      /* 
      * Display the Items when instantiated. 
      */ 

      if (sortedCollection != null) 
      { 
       Item item; 
       int xCoord = firstItemXCoord + 200; 

       /* 
       * Reset the selected item to the start of the collection, 
       * ensuring it always starts at the first node 
       */ 
       sortedCollection.reset(); 

         //While there is another node in the collection, loop through. 
       while (sortedCollection.hasNext()) 
       { 
        /* 
        * Set the item to the selected node. 
        * Which since reset() was called on the 
        * sortedCollection, it should be the first node 
        * in the collection. Then set the next node in the 
        * collection a the selected one. 
        */ 
        item = sortedCollection.next(); 

        /* 
        * Call the paint method in the item class 
        */ 
        item.paint(panel, xCoord, firstItemXCoord); 
        xCoord += Item.OVERALL_WIDTH; 
       } 

      } 
     } 

     // 
     // Random 
     // 
     public void randomAction() 
     { 
      collection.clear(); // We restart with nothing, 
      // then we add random items, 
      for (int i = 1; i <= COLLECTION_SIZE; i++) 
      { 
       collection.add(new Item((int) (1 + MAXIMUM_ITEM_VALUE 
         * Math.random()), DEFAULT_COLOR)); 
      } 
      selected = null; // We make sure nothing is selected 
     } 
+0

您是否檢查過您的面板是否尺寸足夠好,以便看到塗漆的任何東西?你應該這樣重寫'paintComponent',它確實需要一個'Graphics'對象,除此之外,只要你肯定你的'paintComponent'中的所有代碼都被執行了,你認爲它應該是正確的。 –

+0

我相信面板的尺寸正確。如果我正確讀取API,'panel.setBounds(135,0,465,378);'應該將左上角設置爲(135,0),尺寸設置爲465 x 378.除非我應該使用' setSize(int width,int height)'。 – Robert

+0

實際上,應用於面板父級的佈局管理器決定了繪製大小和位置。 –

回答

3

檢查出Custom Painting Approaches爲幾個方式做自定義繪畫。

程序應該要繪製的條形圖當按下「隨機」按鈕,但目前油漆沒有

你可能會需要使用添加對象到ArrayList的第一個方法,使你有一個要繪製的對象列表。所以按鈕會添加對象來繪製,然後調用面板上的repaint()方法。