【问题标题】:How to add JPanels one by one to an array of type JPanel如何将 JPanel 一个一个添加到 JPanel 类型的数组中
【发布时间】:2015-03-03 15:58:30
【问题描述】:

目前,我遇到了此代码的问题,我希望每次向地图添加一个点以将 JPanel 添加到数组 Panels(这是一个 JPanel 数组)。

我不能使用 for 语句,因为我想在每次调用 (addPanel()) 时添加 1 个 Jpanel,而且我遇到了动作侦听器的问题,它只能识别数组中的第一个元素,这是正常的因为 JPanel 没有添加到数组中。

import java.awt.Color;
import java.awt.Dimension;
import java.awt.GridLayout;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;
import javax.swing.*;
import javax.swing.border.EmptyBorder;
import java.awt.BorderLayout;

public class TestGrid02 extends JPanel  {

   private static final long serialVersionUID = 1L;

   protected static final Color SELECTION_COLOR = Color.pink;
   private Color originalColor = new Color(238,238,238) ;
   private static final Dimension PREF_SIZE = new Dimension(50, 50);
   public JPanel panel_2;
   public JPanel panel_3;
   public JFrame frame;
   public JTextField textField;
   public int maxX =10;
   public int maxY =10;
   public String name;
   JPanel[] panels = new JPanel[100];


   public TestGrid02() {
       initUI();
       createMap(panel_2,maxX ,maxY );

   }

   public final void initUI() {

       setLayout(new BorderLayout(0, 0));

        panel_2 = new JPanel();
        add(panel_2, BorderLayout.WEST);
        panel_2.setLayout(new GridLayout(10, 10, 1, 1));
        panel_2.setBackground(Color.GRAY);

        panel_3 = new JPanel(new BorderLayout(4, 4));
        add(panel_3, BorderLayout.LINE_END);
        panel_3.setBackground(Color.GREEN);

        JPanel controls = new JPanel(new GridLayout(0, 1, 0, 25));
        panel_3.add(controls, BorderLayout.PAGE_START);
        controls.setBackground(Color.CYAN);
        controls.setBorder(new EmptyBorder(40, 20, 20, 20));
        controls.add(new JTextField(10));
        controls.add(new JTextField(10));
        controls.add(new JButton("OK"));
   }


   public void createMap(JPanel a,int maxX,int maxY)  {    

       String [ ][ ] map = new String [maxX][maxY];

      for (int x = maxX-1; x>=0 ; x--) {

          for (int y = 0; y<maxY  ; y++) { 
               int i=x-1;
               int j=y-1;

              map [x][y] =  i + ","+  j ;
              System.out.println( map [x][y]); 
              addPanel(a,i,j);

}}}

   public void addPanel(JPanel a,int c, int d) {
              int i =0;
              panels[i] = new JPanel();        
              a.add(panels[i]);
              panels[i].setPreferredSize(PREF_SIZE);
              name = String.format("[%d, %d]", c,d);
              panels[i].setBackground(originalColor);
              panels[i].setName(name); 
              System.out.println(  "PanelName:"+panels[i].getName());
              //panels[i] =panels[i]; 
              //I need this statement to add the panel to the array panels

              panels[i].addMouseListener(new MouseAdapter() {
                @Override
                public void mouseEntered(MouseEvent e) {
                    panels[i].setBackground(Color.pink);
                    panels[i].add(new JLabel(panels[i].getName()));

                    panels[i].repaint();
                    panels[i].revalidate();

                }

                @Override
                public void mouseExited(MouseEvent e) {
                    panels[i].setBackground(originalColor);
                    panels[i].repaint();
                    panels[i].removeAll();

                }
            });

   }   


   public static void main(String[] args) {
      SwingUtilities.invokeLater(new Runnable() {
         public void run() {
             JFrame frame = new JFrame("Astar");
             frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
             frame.getContentPane().add(new TestGrid02());
             frame.setLocationRelativeTo(null);
             frame.pack();
             frame.setVisible(true);     

         }
      });
   }
}

【问题讨论】:

    标签: java arrays swing


    【解决方案1】:

    它只识别数组中的第一个元素

    那是因为你所有的代码都引用了似乎永远不会改变的变量“i”。

    从可见的 GUI 添加(或删除)组件时,基本代码是:

    panel.add(...);
    panel.revalidate(); // to invoke the layout manager
    panel.repaint();
    

    不要使用数组来保存面板。您将自己限制在一些硬编码的大小。而是使用ArrayList。或者真正的问题是您是否甚至需要一个阵列来保存面板以供将来处理?

    您的 MouseListener 代码错误。要引用生成事件的组件,您的代码应该是:

    JPanel panel = (JPanel)e.getSource();
    panel.setBackground(...);
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-02-25
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多