JLabel pas visible sur un Composite
Je suis en train de travailler sur un programme dans lequel j'avais utilisé un JTextArea
, JButton
, JLabel
et JPanel
.
La logique que j'avais à mettre en œuvre: l'utilisateur tape un texte dans le textArea
puis cliquez sur le button
. Sur le bouton cliquez sur j'aimerais récupérer le texte dans la textArea
et de créer un label
avec le texte écrit(comme dans textArea
) et de l'afficher sur le panel
.
Tout ce que j'avais fait précédemment est correct mais le problème est avec le label
et panel
. Le label
n'est pas visible sur la panel
.
Les extraits de code est:
import java.awt.BorderLayout;
import java.awt.HeadlessException;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import javax.swing.BorderFactory;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.JScrollPane;
import javax.swing.JTextArea;
import javax.swing.ScrollPaneConstants;
import javax.swing.border.BevelBorder;
/**
*
* @author mohammadfaisal
* http://ermohammadfaisal.blogspot.com
* http://facebook.com/m.faisal6621
*
*/
public class CodeMagnets extends JFrame{
private JTextArea area4Label;
private JLabel codeLabel;
private JButton createButton;
private JPanel magnet;
public CodeMagnets(String title) throws HeadlessException {
super(title);
magnet=new JPanel(null);
JScrollPane magnetScroller=new JScrollPane(magnet);
magnetScroller.setVerticalScrollBarPolicy(ScrollPaneConstants.VERTICAL_SCROLLBAR_ALWAYS);
magnetScroller.setHorizontalScrollBarPolicy(ScrollPaneConstants.HORIZONTAL_SCROLLBAR_AS_NEEDED);
add(BorderLayout.CENTER, magnetScroller);
JPanel inputPanel=new JPanel();
area4Label=new JTextArea(5, 30);
area4Label.setTabSize(4);
JScrollPane textScroller=new JScrollPane(area4Label);
inputPanel.add(textScroller);
createButton=new JButton("Create code magnet");
createButton.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
//codeLabel=new JLabel(area4Label.getText());
codeLabel=new MyLabel(area4Label.getText());//this is for my new question
codeLabel.setBorder(BorderFactory.createBevelBorder(BevelBorder.LOWERED));
codeLabel.setLocation(50, 20);
codeLabel.setVisible(true);
magnet.add(codeLabel);
area4Label.setText("");
//pack();
}
});
inputPanel.add(createButton);
add(BorderLayout.SOUTH, inputPanel);
//pack();
setSize(640, 480);
setVisible(true);
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
}
public static void main(String[] args) {
new CodeMagnets("Code Magnets");
}
}
Vous devez vous connecter pour publier un commentaire.
Vous avez besoin de repaint()/validate() de votre panle après l'ajout de nouveaux composants dans cette dynamique. Donc, après cette:
ajouter ceci:
ou
Aussi une chose que vous utilisez null disposition pour aimant panneau. Donc, il doit avoir à setBounds() de jLable avant de l'ajouter à aimant panneau. Ainsi, il devient
Il n'est pas recommandé d'utiliser
null
que la mise en page, vous devez utiliser la bonne disposition comme BorderLayout ou GridLayout ou encore plus simple FlowLayout en fonction de votre exigence.Comme dit par @Andrew utiliser quelque chose comme:
au lieu de
Cela permettra de résoudre le problème de taille de jLabel.
magnet.validate()
mais toujours pas de travail. Nireapint()
nivalidate()
est de travail. J'aimerais faire de lalabel
visible sur lepanel
.setLocation()
t-il maintenant assez parce quesetBounds()
peut découper le texte.setBounds()
également ne fonctionne pas. Je vous demande, veuillez vérifier le code en cours d'exécution.null
dans la mise en page vous doit définir explicitement les limites d'un composant.label
s déplaçable, donc j'avaissetLayout(null)
null
mise en page doit être échangé pour une mise en page personnalisée, mais ma principale objection à la réponse était quesetBounds()
est tellement conjecture quant à la taille de l'élément. Il serait mieux (même lors de l'utilisation d'unnull
mise en page) pour le régler à la taille souhaitée puis appelersetLocation()
plutôt quesetBounds()
.setBounds()
. Puis-je obtenir la taille souhaitée après l'utilisation de lasetBounds()
?