2017-09-13 103 views
0

我想創建一個基本的GUI程序,其目的是:如何添加JPanel動態並使其可點擊?

  1. 動態插入的JPanel(將創建JPanel的數量是在我的列表的大小基地)是滾動的。
  2. 無論何時單擊,從JPanel獲取信息。

到目前爲止,這是我做過什麼:

... 

public class BeesFrame extends javax.swing.JFrame { 
    List<String> bees = new ArrayList<>(Arrays.asList("Bee 1", "Bee 2", "Bee 3", 
                "Bee 4", "Bee 5", "Bee 6", 
                "Bee 7", "Bee 8", "Bee 9", 
                "Bee 10", "Bee 11", "Bee 12", 
                "Bee 13")); 
    GridBagLayout layout = new GridBagLayout(); 

    JScrollPane scrollpane; 
    JPanel beesPanel; 
    JPanel beesCell; 
    JLabel label; 

    public BeesFrame() { 
     initComponents(); 
     label = new JLabel(); 
     for(int i = 0; i < bees.size(); i++){ 
      beesCell = new JPanel(); 
      beesCell.setName(bees.get(i)); 
      beesCell.setPreferredSize(new Dimension(100, 100)); 
      beesCell.setMinimumSize(new Dimension(100, 100)); 
      beesCell.setBackground(Color.yellow); 

      label.setHorizontalTextPosition(SwingConstants.CENTER); 
      label.setText(beesCell.getName()); 

      beesCell.add(label); 
      beesCell.validate(); 
      beesCell.repaint(); 
      System.out.println(bees.get(i)); 
     } 

     beesMainPanel.setLayout(new GridLayout((bees.size()/4)+1, 4, 1, 1)); 
     beesMainPanel.add(beesCell); 
     beesCell.setVisible(true); 
     beesCell.addMouseListener(new MouseAdapter() { 
      public void mousePressed(MouseEvent e){ 
       JPanel panel = (JPanel) getComponentAt(e.getPoint()); 
       panel.setName(label.getText()); 
       outPut(panel); 
      } 
     }); 

     beesCell.validate(); 
     beesCell.repaint(); 

    } 

    void outPut(JPanel panel){ 
     System.out.println("Panel...."+panel.getName()); 
    } 

... // some other code generated by Netbeans 


} 

但不是正確顯示它的。只有我列表中的最後一個被插入,如果我點擊它,它說javax.swing.JRootPane不能轉換爲javax.swing.JPanel。這是發生錯誤:

Exception in thread "AWT-EventQueue-0" java.lang.ClassCastException: javax.swing.JRootPane cannot be cast to javax.swing.JPanel 
    at catchingbees.frame.BeesFrame$1.mousePressed(BeesFrame.java:79) 
    at java.awt.Component.processMouseEvent(Component.java:6530) 
    at javax.swing.JComponent.processMouseEvent(JComponent.java:3324) 
    ... 

這裏是我的輸出的屏幕截圖:

enter image description here

但是這就是我打算做:

enter image description here

很感謝任何形式的幫助。

+0

1)爲了更好地幫助更快,發佈[MCVE]或[短的,獨立的,正確的示例](HTTP: //www.sscce.org/)。 2)請參閱[什麼是堆棧跟蹤,以及如何使用它來調試我的應用程序錯誤?](http://stackoverflow.com/q/3988788/418556)&[什麼是空指針異常,以及如何我解決它?](http://stackoverflow.com/q/218384/418556) –

回答

1

將MouseListener添加到每個面板,然後使用MouseEvent的getSource()方法訪問被單擊的面板。

MouseListener ml = new MouseAdapter() 
{ 
    @Override 
    public void mousePressed(MouseEvent e) 
    { 
     JPanel panel = (JPanel)e.getSource(); 

     // do your processing on the panel 
    } 
} 

然後在創建你根本面板循環:

panel.addMouseListener(ml); 
+0

謝謝你的幫助先生。我能夠獲得信息,現在我剩下的問題只是我創建列表的最後一個數據。如何添加從索引0到索引9的所有數據?正如你在屏幕截圖上看到的,只有最後一個數據被插入。我想要的是,當我循環到我的列表中,我將創建自己的面板,看起來像一個GridView,然後把所有的面板放在JScrollPane上。 –

+1

@AirirhLou,當你在完成循環之後只添加「beesCell」面板時,你希望發生什麼?在開始循環之前,您需要設置面板​​的佈局管理器。然後在創建每個「beesCell」面板後的循環內,使用GridlLayout將其添加到面板。 – camickr

+0

非常感謝您的幫助。我的代碼按照你的建議工作,只有一個小的,它總是顯示水平滾動條,是否有可能有一個垂直滾動條? –