4

に と がありJPanelます。実行時に[クリック時] に追加します。JButtonJFrame
JLabelJPanelJButton

次のコードを使用します。

 panel.setLayout(null);

 jLabel _lbl=new jLabel();
 _lbl.setText("Label");
 panel.add(_lbl);
 panel.validate();

しかし、何も表示されませJLabelJPanel

4

1 に答える 1

13

JLabel私はあなたが呼び出されたを作成するのを見ます_lbl:

 JLabel _lbl=new JLabel();

ただし、パネルに追加することはありません。JLabel代わりに、パネルにテキストなしで新しいものを追加します。

 panel.add(new JLabel());

もちろん、これは表示されない空のラベルを作成します。

また、次のように追加した後、インスタンスでrevalidate()andを呼び出してみrepaint()てください。JPanelJLabel

JLabel _lbl=new JLabel("Label");//make label and assign text in 1 line

panel.add(_lbl);//add label we made

panel.revalidate();
panel.repaint();

これにより、新しいコンポーネントに合わせてpack()サイズを変更するために、フレーム インスタンスを呼び出す必要がある場合もあります。JFrame

また、null/Absoluteレイアウトは絶対に使用しないでください。これは (アニメーションを行う場合を除いて) 非常に悪い習慣であり、問​​題があり、非常に使いにくいことが判明する可能性があります。

代わりに次を使用しますLayoutManager

JPanelまたは、単純な呼び出しでコンポーネントが 1 つしかない場合はadd(label);JPanelサイズが拡大されます。

アップデート:

ここに小さなサンプルがあります。を押すたびにJLabels を追加するだけです。JPanelJButton

import java.awt.BorderLayout;
import java.awt.FlowLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import javax.swing.*;

public class JavaApplication116 {

    public static void main(String[] args) {
        SwingUtilities.invokeLater(new Runnable() {

            @Override
            public void run() {
                new JavaApplication116().createAndShowUI();
            }
        });
    }

    private void createAndShowUI() {
        JFrame frame = new JFrame("Test");
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

        initComponents(frame);

        frame.setResizable(false);
        frame.pack();
        frame.setVisible(true);
    }

    private void initComponents(final JFrame frame) {
        final JPanel panel = new JPanel(new FlowLayout());
        JButton button = new JButton("Add label");
        button.addActionListener(new ActionListener() {

            @Override
            public void actionPerformed(ActionEvent e) {
                JLabel _lbl = new JLabel("Label");//make label and assign text in 1 line

                panel.add(_lbl);//add label we made

                panel.revalidate();
                panel.repaint();

                frame.pack();//so our frame resizes to compensate for new components
            }
        });
        frame.getContentPane().add(panel, BorderLayout.CENTER);
        frame.getContentPane().add(button, BorderLayout.SOUTH);
    }
}
于 2012-09-30T09:52:27.443 に答える