1.题目要求  小应用程序先将若干个按钮和若干个标签放入JPanel中,然后将JPpanel放入JScrollPane中,最后, 将JScrollPane放入小程序的窗口中,程序所创建的JScrollPane总是带水平和垂直滚动条,滚动条面板的可视范围小于面板的时机要求,可以移动滚动条的滑块现实面板原先不在可视范围内的区域。
import java.applet.*;
import javax.swing.*;
import java.awt.*;
 class MyWindow extends JFrame{
   public MyWindow(int w,int h){
      setTitle("滚动面板实例");
       Container con=getContentPane();
       con.setPreferredSize(new Dimension(w,h));
       con.setLayout(new BorderLayout());
       JPanel p=new JPanel();
       p.setLayout(new GridLayout(6,6));
       for(int i=0;i<6;i++)
        {
           p.add(new JLabel());
         for(int j=1;j<=2;j++)
          {
            p.add(new JButton("按钮" +(2*i+j)));
            p.add(new JLabel("标签" +(2*i+j)));
          }
            p.add(new JLabel());
        }
      p.setBackground(Color.blue);
      p.setPreferredSize(new Dimension(w+60,h+60));
      JScrollPane scrollPane=new JScrollPane(p);
         scrollPane.setPreferredSize(new Dimension(w-60,h-60));
         add(scrollPane,BorderLayout.CENTER);
         setVisible(true);
         pack();
   }
 }
class ScrollPane extends JScrollPane{
    public ScrollPane(Component p){
     super(p);
   this.setHorizontalScrollBarPolicy(JScrollPane.HORIZONTAL_SCROLLBAR_ALWAYS);
   this.setVerticalScrollBarPolicy(JScrollPane.VERTICAL_SCROLLBAR_ALWAYS);
      }
 }
public class Ex extends Applet
{
   MyWindow myWindow;
   public void init(){
        myWindow=new MyWindow(100,350);
       }
}
  问题(1)add(scrollPane,BorderLayout.CENTER);
         setVisible(true);
         pack();
   这三个方法为什么可以用this.而不可以用myWindow.呢?
问题(2)在类里 add,pack, setVisible这些方法前面为什么不加调用它的对象呢?2.import java.applet.*;
import javax.swing.*;
import java.awt.event.*;
 public class Example5 extends Applet{
    JTextField text1,text2;
  Sqr s=new Sqr();
  public void init(){
   text1=new JTextField(10);
   text2=new JTextField(10);
   add(text1);
   add(text2);
    text1.addActionListener(s);
    }
}
   class Sqr implements ActionListener{
        public void actionPerformed(ActionEvent e){
   if(e.getSource()==text1){
       long n=Long.parseLong(text1.getText());
        text2.setText(String.valueOf(n*n));
        }
   else{}
  }
}
问题(1)大家好 我这里的text1 text2为什么不可以直接用呢

解决方案 »

  1.   

    先去了解一下 JFrame的源码?
      

  2.   

    我也不太懂啊,第一题不加调用的对象就是指的是当前对象,可以省略的,也就是this,
    第二题就简单了,应该如下
    import java.applet.*;
    import javax.swing.*;
    import java.awt.event.*;
     public class Example5 extends Applet{
      JTextField text1,text2;
      Sqr s=new Sqr();
      public void init(){
      text1=new JTextField(10);
      text2=new JTextField(10);
      add(text1);
      add(text2);
      text1.addActionListener(s);
      }
      class Sqr implements ActionListener{
      public void actionPerformed(ActionEvent e){
      if(e.getSource()==text1){
      long n=Long.parseLong(text1.getText());
      text2.setText(String.valueOf(n*n));
      }
      else{}
      }
    }
    }
      
      

  3.   

    也可以这样
    import java.applet.*;
    import javax.swing.*;import java.awt.event.*;
     public class Example5 extends Applet{
      JTextField text1,text2;
      public void init(){
      text1=new JTextField(10);
      text2=new JTextField(10);
      Sqr s=new Sqr(  text1, text2);
      add(text1);
      add(text2);
      text1.addActionListener(s);
      }
    }
     class Sqr implements ActionListener{
     private JTextField text1;
    private JTextField text2;
    Sqr( JTextField text1,JTextField text2){
     this.text1 = text1;
     this.text2= text2;
     }
      public void actionPerformed(ActionEvent e){
      if(e.getSource()==text1){
      long n=Long.parseLong(text1.getText());
      text2.setText(String.valueOf(n*n));
      }
      else{}
      }
    }
      

  4.   

    #5楼我也不太懂啊,第一题不加调用的对象就是指的是当前对象,可以省略的,也就是this,
    第二题就简单了,应该如下
    import java.applet.*;
    import javax.swing.*;
    import java.awt.event.*;
     public class Example5 extends Applet{
      JTextField text1,text2;
      Sqr s=new Sqr();
      public void init(){
      text1=new JTextField(10);
      text2=new JTextField(10);
      add(text1);
      add(text2);
      text1.addActionListener(s);
      }
      class Sqr implements ActionListener{
    public void actionPerformed(ActionEvent e){
    if(e.getSource()==text1){
    long n=Long.parseLong(text1.getText());
    text2.setText(String.valueOf(n*n));
    }
    else{}
    }
    }
    }这里的text2 text1也是不合法的把
      

  5.   

    不能用mywindow,注意你的大小写。text1的参数。
      

  6.   

    问题1:
      add(scrollPane,BorderLayout.CENTER);
      setVisible(true);
      pack();
    在mywindow构造函数里面,你没有实例化mywindow,你要是用mywindow.pack();等 编译器怎么找mywindow啊
    当然得用this了   再多敲几个其他的例子就明白了
      

  7.   

    因为有缺省的this了this.add()不过是隐式的
      

  8.   

    #7楼的}这里的text2 text1也是不合法的把
    怎么不合法了,明确一下
      

  9.   

    先说第一段代码的问题
    你说的那三个方法是从父类中继承下来的方法,子类当然可以直接调用父类中的非私有的方法,而this指的是当前的MyWindow的对象,this是可以省略的,你所说的myWindow.调用是针对静态方法来说的,不过就算是静态的方法也是用类名(也就是MyWindow,而不是myWindow)来调用的。再说第二段代码的问题
    你说的text1,text2不能直接用我不太明白,如果说你的意思是直接用 text1.方法 或者是 text2.方法 的话,那就和第一段的回答一样,这是针对静态方法而言的;而对于非静态的方法则需要先实例化对象,再由对象来调用方法,就像代码中的
                    text1=new JTextField(10);
                  text2=new JTextField(10);
    这两句代码就实例化了两个JTextField对象,由这两个对象才能调用JTextField类中的非静态方法,比如说代码中的
                     text1.getText()
                   text2.setText(String.valueOf(n*n));
    ,不知道这样说你明白了没
      

  10.   

    class ScrollPane extends JScrollPane{
      public ScrollPane(Component p){
      super(p);
      this.setHorizontalScrollBarPolicy(JScrollPane.HORIZONTAL_SCROLLBAR_ALWAYS);
      this.setVerticalScrollBarPolicy(JScrollPane.VERTICAL_SCROLLBAR_ALWAYS);
    }
    }请大家详细解说这段程序的过程。这里的 super(p);调用JScrollPane的构造方法有什么用,这里的this是指类ScrollPane的对象吗?
      

  11.   

    super(p);这一句代码就是说想实例化子类的对象必先实例化父类的对象,
    this指的就是ScrollPane类的当前对象