0

私は新しい Java 学習者です。

GUIアプリケーションを作成しています。

このクラスは、ユーザーから番号を取得し、フレームにテーブルを表示します。

クラスを実行するとき、数値を入力して JButton をクリックしますが、フレームの JLabel が表示されません。

なぜそうでないのかはわかりません。

import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JTextField;
import java.awt.event.*;
//this Frame class use the association   
class Frame {
    JFrame f;
    JButton jb,jbclear;
    JTextField jt;
    JLabel jl1[]=new JLabel[10];
    EventHandler hand=new EventHandler();
    //constructor
    Frame(){
        f=new JFrame("Hello");
        f.setSize(500,500);
        f.setLayout(null);

        JLabel jl=new JLabel("Enter the number");
        jl.setBounds(30,10,100,20);
        f.getContentPane().add(jl);

        jt=new JTextField();
        jt.setBounds(170,10,50,20);
        f.add(jt);

        jb=new JButton("Click");
        jb.setBounds(270,50,80,30);
        f.add(jb);
        jb.addActionListener(hand);

        jbclear=new JButton("Clear");
        jbclear.setBounds(270,90,80,30);
        f.add(jbclear);
        jbclear.addActionListener(hand);
        f.setVisible(true);


    }
    class EventHandler implements ActionListener{
        public void actionPerformed(ActionEvent e){
            if(e.getSource()==jb){
                 int num=Integer.parseInt((jt.getText()));
                    for(int i=0;i<10;i++){
                        int n=(num*i);
                        String s=String.valueOf(num)+" X "+i+" = "+n;
                       jl1[i]=new JLabel(s);
                    }
                    for(int i=0,k=80;i<10;i++){
                     jl1[i].setBounds(30,k,150,10);
                     f.add(jl1[i]);
                     jl1[i].setVisible(true);
                     k=k+30;
                    }

            }
            if(e.getSource()==jbclear){
                for(int i=0;i<10;i++){
                   jl1[i].setText("");
                }
            }

        }
    }






    public static void main(String [] args){
        new Frame();

    }

}

JFrame を作成して表示した後にコンポーネントを追加できますか?

4

3 に答える 3

1
             for(int i=0;i<10;i++){
                 int n=(num*i);
                 String s=String.valueOf(num)+" X "+i+" = "+n;
                 jl1[i]=new JLabel(s);
             }
             for(int i=0,k=80;i<10;i++){
                jl1[i].setBounds(30,k,150,10);
                f.add(jl1[i]);
                jl1[i].setVisible(true);

わかりました。フレームのコンテンツ ペインに追加JLabelしていますが、GUI を更新する必要はありません。追加が完了したらすぐに呼び出して、一時的な満足のためにいくつかの出力も用意してください。JFramerepaint()JFramef.repiant()labels

JFrame を作成して表示した後にコンポーネントを追加できますか?

はい。ただし、適切なレイアウト マネージャーを使用する必要があります。コンポーネントを追加した後、呼び出して、GUI を適切にレンダリングする必要がrevalidate()あります。repaint()

さらにいくつかのこと:

  1. Nullレイアウト(または絶対レイアウト)を使用しないでください。
  2. すべてのコンポーネントの可視フラグはデフォルトであり、アプリケーション ウィンドウを除いて、そのようなコンポーネントをtrue呼び出す必要はありません。setVisible(true)JFrame
  3. Swing は EDT を使用して GUI レンダリング タスクを実行します。したがって、起動時に最初にアプリケーションを表示するなど、GUI に必要なすべての更新を行う必要があり、EDT 内にも配置する必要があります。SwingUtilies.invokeLater(new Runnabe(){})それだけをしてください。

チュートリアル:

  1. Swing での並行性
  2. レッスン: コンテナ内のコンポーネントのレイアウト
于 2013-11-08T10:10:16.683 に答える
1

ラベルを作成しますjl1[i]=new JLabel(s)が、コンテナーに追加されません。

null layout/setBounds() を使用せず、適切なものを選択してください (例:GridLayoutまたはBoxLayout)

于 2013-11-08T09:45:37.113 に答える