JLabel не отображается на Jpanel - PullRequest
2 голосов
/ 01 декабря 2011

Я работаю над программой, в которой я использовал JTextArea, JButton, JLabel и JPanel.
Логика, которую я хотел бы реализовать: пользователь вводит текст в данном textArea, а затем нажимает на button. При нажатии на кнопку я получу текст из textArea и создам label с письменным текстом (как в textArea) и отобразим его на panel.
Все, что я сделал ранее, правильно, но проблема в label и panel. label не отображается на panel.

Фрагменты кода:

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");
    }
}

1 Ответ

4 голосов
/ 01 декабря 2011

Вам нужно перекрасить () / проверить () вашу панель после динамического добавления в нее новых компонентов. Итак, после этого:

magnet.add(codeLabel);

добавить это:

magnet.validate();

или

magnet.repaint();

Также одна вещь, которую вы используете нулевой макет для магнитной панели. Поэтому необходимо добавить setBounds () из jLable, прежде чем добавлять его на панель магнита. Так становится

public void actionPerformed(ActionEvent e) {
    codeLabel=new JLabel(area4Label.getText());
    codeLabel.setBorder(BorderFactory.createBevelBorder(BevelBorder.LOWERED));
    codeLabel.setBounds(50, 20, 100, 100);
    magnet.add(codeLabel);
    magnet.repaint();
    area4Label.setText("");
}

Не рекомендуется использовать null в качестве макета, вы должны использовать правильный макет, такой как BorderLayout или GridLayout или даже более простой FlowLayout в зависимости от ваших требований.


Как сказал @Andrew, используйте что-то вроде:

codeLabel.setSize(codeLabel.getPreferredSize());
codeLabel.setLocation(50, 20);

вместо

codeLabel.setBounds(50, 20, 100, 100);

Это решит проблему размера jLabel.

...