2017-02-15 29 views
0

Я использую JPanel с GridLayout, и я положил JLabel внутрь. Бесконечные работы. Но я хочу использовать свой собственный класс (extends JLabel), есть проблема.Создание собственного JLabel

Когда я использую JLabel у меня есть этот рендеринг:

result

И когда я использую мои собственные JLabel У меня есть что:

result

Вот мой код из моего JLabel изготовленный под заказ:

public class LabelCustom extends JLabel{ 

int x; 
int y; 

public LabelCustom(int x, int y) { 
    super(); 
    this.x = x; 
    this.y = y; 
    this.setBackground(Color.white); 
    this.setBorder(javax.swing.BorderFactory.createBevelBorder(javax.swing.border.BevelBorder.LOWERED)); 
} 

public int getX() { 
    return x; 
} 

public void setX(int x) { 
    this.x = x; 
} 

public int getY() { 
    return y; 
} 

public void setY(int y) { 
    this.y = y; 
} 

}

И как я использую его:

JPanel j = new JPanel(); 
    j.setLayout(new GridLayout(nbCaseY, nbCaseX)); 

    for(int i=0; i<nbCaseY; i++) { 
     HashMap<Integer, JLabel> ligne = new HashMap(); 
     for(int y=0; y<nbCaseX; y++) { 
      LabelCustom p = new LabelCustom(i, y); 
      p.addMouseListener(ml); 
      //p.setBounds(100+ y*(hauteur), 100 + i*(hauteur), hauteur, hauteur); 
      p.setPreferredSize(new Dimension(hauteur, hauteur)); 

      //p.setBounds(100+ y*((width-200-2*hauteur)/nbCaseX), 100 + i*((height-200)/nbCaseY), ((width-200-2*hauteur)/nbCaseX), ((height-200)/nbCaseY)); 
      p.setTransferHandler(new TransferHandler("icon")); 
      p.setBorder(javax.swing.BorderFactory.createBevelBorder(javax.swing.border.BevelBorder.LOWERED)); 

      p.setOpaque(true); 
      p.setVisible(true); 
      j.add(p); 
      ligne.put(y, p); 
     } 
     Frame.p.getListeNiveau().get(0).ajouterLigne(ligne); 
    } 
+1

'JLabel' уже имеет методы' get/X/Y', лучше не повторять их, если у вас нет очень хорошего Причина – MadProgrammer

+0

Это не для позиции x и y. Это для id hashmap, я думаю, что это полезно;) – Sebastien

+1

Возможно, каким образом, как вы думаете, API определяет позицию вашего компонента? Бьюсь об заклад, если вы добавили '@ Override' в методы' getX' и 'getY', он все равно будет компилироваться, сообщая вам, что вы переопределяете методы родительского класса, методы, которые он, вероятно, хочет использовать для какой-либо цели ... как позиция компонента ... может быть – MadProgrammer

ответ

1

JLabel уже имеет getX и getY метод, который должен поместить метку на экране, вы (невольно) переопределить эту функцию и теперь возвращая несвязанную информацию.

Это не для позиции x и y. Это для ид HashMap, я думаю, что это полезно;)

Таким образом, вместо того, чтобы использовать getX/Y, я предлагаю сделать ID класс, который несет в себе информацию, необходимую (возможно перекрывая equals и hashcode методы в упростить сравнение) и использовать их вместо этого (предоставляя методы getID и setID)