import javax.swing.*;
import javax.swing.table.*;
import java.awt.*;
import java.awt.event.*;
import java.util.*;public class Test7
    extends JFrame {
  String longTitle = "Last Name / Maiden Name (if divorced)";
  MultilineHeaderRenderer multilineRenderer =
      new MultilineHeaderRenderer(longTitle);  JTable table = new JTable(
      new Object[][] { {"Lynn", "M.", "Seckinger"}, {"Carol", "R.", "Seckinger"},
      {"Roy", "D.", "Martin"}, {"Richard", "A.", "Tattersall"}, {"Philip", "B.",
      "Edwards"}, {"Moore", "T.", "Moore"},
// shorten scrollbar grip with these ...      {"Lynn", "M.", "Seckinger"}, {"Carol", "R.", "Seckinger"}, {"Roy", "D.",
      "Martin"}, {"Richard", "A.", "Tattersall"}, {"Philip", "B.", "Edwards"},
      {"Moore", "T.", "Moore"},
  },
      new Object[] {
      "First Name", "MI", longTitle});  public Test7() {
    TableColumn middleColumn = table.getColumn("MI"),
        lastColumn = table.getColumn(longTitle);    lastColumn.setHeaderRenderer(multilineRenderer);    TableCellRenderer hdrRenderer =
        middleColumn.getHeaderRenderer();    Component hdrComponent =
        hdrRenderer.getTableCellRendererComponent(table,
                                                  "MI", false, false, 0, 0);    if (hdrComponent instanceof JComponent) {
      JComponent c = (JComponent) hdrComponent;
      c.setToolTipText("Middle Initial");
    }    table.getTableHeader().setToolTipText("Table Header!");    getContentPane().add(
        new JScrollPane(table), BorderLayout.CENTER);
  }  public static void main(String args[]) {
    GJApp7.launch(new Test7(),
                 "Multi-Line Column Headers", 300, 300, 300, 250);
  }
}class MultilineHeaderRenderer
    implements TableCellRenderer {
  MultilineHeader mll;
  JScrollPane scrollPane;  public MultilineHeaderRenderer(String title) {
    mll = new MultilineHeader(title);
    scrollPane = new JScrollPane(mll);    scrollPane.setHorizontalScrollBarPolicy(
        JScrollPane.HORIZONTAL_SCROLLBAR_NEVER);    scrollPane.setVerticalScrollBarPolicy(
        JScrollPane.VERTICAL_SCROLLBAR_NEVER);    scrollPane.setBorder(null);
  }  public Component getTableCellRendererComponent(JTable table,
                                                 Object value,
                                                 boolean isSelected,
                                                 boolean hasFocus,
                                                 int row, int col) {
    mll.setText( (String) value);
    return scrollPane;
  }
}class MultilineHeader
    extends JTextArea {
  public MultilineHeader(String s) {
    super(s);
  }  public void updateUI() {
    super.updateUI();// turn on wrapping and disable editing and highlighting    setLineWrap(true);
    setWrapStyleWord(true);
    setHighlighter(null);
    setEditable(false);// make the text area look like a table header    LookAndFeel.installColorsAndFont(this,
                                     "TableHeader.background",
                                     "TableHeader.foreground",
                                     "TableHeader.font");    LookAndFeel.installBorder(this, "TableHeader.cellBorder");
  }
}class GJApp7
    extends WindowAdapter {
  static private JPanel statusArea = new JPanel();
  static private JLabel status = new JLabel(" ");
  static private ResourceBundle resources;  public static void launch(final JFrame f, String title,
                            final int x, final int y,
                            final int w, int h) {
    launch(f, title, x, y, w, h, null);
  }  public static void launch(final JFrame f, String title,
                            final int x, final int y,
                            final int w, int h,
                            String propertiesFilename) {
    f.setTitle(title);
    f.setBounds(x, y, w, h);
    f.setVisible(true);    statusArea.setBorder(BorderFactory.createEtchedBorder());
    statusArea.setLayout(new FlowLayout(FlowLayout.LEFT, 0, 0));
    statusArea.add(status);
    status.setHorizontalAlignment(JLabel.LEFT);    f.setDefaultCloseOperation(
        WindowConstants.DISPOSE_ON_CLOSE);    if (propertiesFilename != null) {
      resources = ResourceBundle.getBundle(
          propertiesFilename, Locale.getDefault());
    }    f.addWindowListener(new WindowAdapter() {
      public void windowClosed(WindowEvent e) {
        System.exit(0);
      }
    });
  }  static public JPanel getStatusArea() {
    return statusArea;
  }  static public void showStatus(String s) {
    status.setText(s);
  }  static Object getResource(String key) {
    if (resources != null) {
      return resources.getString(key);
    }
    return null;
  }
}想学习table,随便找了段代码,运行了一下报空指针。拿过来请教一下,想知道为什么。
还有,我碰到过一些空指针的情况,不知道怎么解决,什么情况下会出现NullPointerException呢?
分都拿去押德国队夺冠了,就剩这么点了,呵呵。

解决方案 »

  1.   

    此回复为自动发出,仅用于显示而已,并无任何其他特殊作用
    楼主【helanpiaoxue】截止到2008-06-25 09:41:11的历史汇总数据(不包括此帖):
    发帖数:9                  发帖分:420                
    结贴数:8                  结贴分:320                
    未结数:1                  未结分:100                
    结贴率:88.89 %            结分率:76.19 %            
    楼主加油
      

  2.   

    什么情况下会出现NullPointerException呢? 
    当一个对象是null时,却要用它去操作
      

  3.   

    看看异常信息,是哪行出现了NullPointerException或者debug一下
    NullPointerException的出现一般是操作了一个空对象的属性或方法
      

  4.   

    不好意思,异常信息如下:C:\Borland\JBuilder2006\jdk1.5\bin\javaw -classpath "C:\Borland\JBuilder2006\samples\Welcome\classes;C:\Borland\JBuilder2006\jdk1.5\lib\dt.jar;C:\Borland\JBuilder2006\jdk1.5\lib\tools.jar;C:\Borland\JBuilder2006\jdk1.5\lib\htmlconverter.jar;C:\Borland\JBuilder2006\jdk1.5\lib\jconsole.jar;C:\Borland\JBuilder2006\jdk1.5\jre\lib\im\indicim.jar;C:\Borland\JBuilder2006\jdk1.5\jre\lib\im\thaiim.jar;C:\Borland\JBuilder2006\jdk1.5\jre\lib\rt.jar;C:\Borland\JBuilder2006\jdk1.5\jre\lib\javaws.jar;C:\Borland\JBuilder2006\jdk1.5\jre\lib\jsse.jar;C:\Borland\JBuilder2006\jdk1.5\jre\lib\charsets.jar;C:\Borland\JBuilder2006\jdk1.5\jre\lib\jce.jar;C:\Borland\JBuilder2006\jdk1.5\jre\lib\plugin.jar;C:\Borland\JBuilder2006\jdk1.5\jre\lib\deploy.jar;C:\Borland\JBuilder2006\jdk1.5\jre\lib\ext\sunpkcs11.jar;C:\Borland\JBuilder2006\jdk1.5\jre\lib\ext\dnsns.jar;C:\Borland\JBuilder2006\jdk1.5\jre\lib\ext\sunjce_provider.jar;C:\Borland\JBuilder2006\jdk1.5\jre\lib\ext\localedata.jar"  Test7 
    Exception in thread "main" java.lang.NullPointerException
    at Test7.<init>(Test7.java:35)
    at Test7.main(Test7.java:51)这一行出的错
    Component hdrComponent =
            hdrRenderer.getTableCellRendererComponent(table,
                                                      "MI", false, false, 0, 0);
      

  5.   

    JTable table =====》
    static JTable table 试下
      

  6.   

    hdrRenderer
    跟踪一下这个变量看看。是不是
        TableCellRenderer hdrRenderer =
            middleColumn.getHeaderRenderer();
    得到的hdrRenderer 为null
      

  7.   

    1. 学习 Swing 建议看看 JDK安装目录\demo\jfc\SwingSet2\SwingSet2.jar 这个例子。
    2. NullPointerException 空引用(也叫空指针)异常,String s = null; s.trim(); 时会抛出,也就是通过对象变量找不到它引用的对象时。
      

  8.   

    我改了几句,没异常了,不知符不符合你的要求。import javax.swing.*;
    import javax.swing.table.*;
    import java.awt.*;
    import java.awt.event.*;
    import java.util.*;public class Test7
        extends JFrame {
      String longTitle = "Last Name / Maiden Name (if divorced)";
      MultilineHeaderRenderer multilineRenderer =
          new MultilineHeaderRenderer(longTitle);
        MultilineHeaderRenderer multilineRenderer2 =
          new MultilineHeaderRenderer("MI");  JTable table = new JTable(
          new Object[][] { {"Lynn", "M.", "Seckinger"}, {"Carol", "R.", "Seckinger"},
          {"Roy", "D.", "Martin"}, {"Richard", "A.", "Tattersall"}, {"Philip", "B.",
          "Edwards"}, {"Moore", "T.", "Moore"},
    // shorten scrollbar grip with these ...      {"Lynn", "M.", "Seckinger"}, {"Carol", "R.", "Seckinger"}, {"Roy", "D.",
          "Martin"}, {"Richard", "A.", "Tattersall"}, {"Philip", "B.", "Edwards"},
          {"Moore", "T.", "Moore"},
      },
          new Object[] {
          "First Name", "MI", longTitle});  public Test7() {
        TableColumn middleColumn = table.getColumn("MI"),
            lastColumn = table.getColumn(longTitle);    lastColumn.setHeaderRenderer(multilineRenderer);
        middleColumn.setHeaderRenderer(multilineRenderer2);
        TableCellRenderer hdrRenderer =
            middleColumn.getHeaderRenderer();    Component hdrComponent =
            hdrRenderer.getTableCellRendererComponent(table,
                                                      "MI", false, false, 0, 0);    if (hdrComponent instanceof JComponent) {
          JComponent c = (JComponent) hdrComponent;
          c.setToolTipText("Middle Initial");
        }    table.getTableHeader().setToolTipText("Table Header!");    getContentPane().add(
            new JScrollPane(table), BorderLayout.CENTER);
      }  public static void main(String args[]) {
        GJApp7.launch(new Test7(),
                     "Multi-Line Column Headers", 300, 300, 300, 250);
      }
    }class MultilineHeaderRenderer
        implements TableCellRenderer {
      MultilineHeader mll;
      JScrollPane scrollPane;  public MultilineHeaderRenderer(String title) {
        mll = new MultilineHeader(title);
        scrollPane = new JScrollPane(mll);    scrollPane.setHorizontalScrollBarPolicy(
            JScrollPane.HORIZONTAL_SCROLLBAR_NEVER);    scrollPane.setVerticalScrollBarPolicy(
            JScrollPane.VERTICAL_SCROLLBAR_NEVER);    scrollPane.setBorder(null);
      }  public Component getTableCellRendererComponent(JTable table,
                                                     Object value,
                                                     boolean isSelected,
                                                     boolean hasFocus,
                                                     int row, int col) {
        mll.setText( (String) value);
        return scrollPane;
      }
    }class MultilineHeader
        extends JTextArea {
      public MultilineHeader(String s) {
        super(s);
      }  public void updateUI() {
        super.updateUI();// turn on wrapping and disable editing and highlighting    setLineWrap(true);
        setWrapStyleWord(true);
        setHighlighter(null);
        setEditable(false);// make the text area look like a table header    LookAndFeel.installColorsAndFont(this,
                                         "TableHeader.background",
                                         "TableHeader.foreground",
                                         "TableHeader.font");    LookAndFeel.installBorder(this, "TableHeader.cellBorder");
      }
    }class GJApp7
        extends WindowAdapter {
      static private JPanel statusArea = new JPanel();
      static private JLabel status = new JLabel(" ");
      static private ResourceBundle resources;  public static void launch(final JFrame f, String title,
                                final int x, final int y,
                                final int w, int h) {
        launch(f, title, x, y, w, h, null);
      }  public static void launch(final JFrame f, String title,
                                final int x, final int y,
                                final int w, int h,
                                String propertiesFilename) {
        f.setTitle(title);
        f.setBounds(x, y, w, h);
        f.setVisible(true);    statusArea.setBorder(BorderFactory.createEtchedBorder());
        statusArea.setLayout(new FlowLayout(FlowLayout.LEFT, 0, 0));
        statusArea.add(status);
        status.setHorizontalAlignment(JLabel.LEFT);    f.setDefaultCloseOperation(
            WindowConstants.DISPOSE_ON_CLOSE);    if (propertiesFilename != null) {
          resources = ResourceBundle.getBundle(
              propertiesFilename, Locale.getDefault());
        }    f.addWindowListener(new WindowAdapter() {
          public void windowClosed(WindowEvent e) {
            System.exit(0);
          }
        });
      }  static public JPanel getStatusArea() {
        return statusArea;
      }  static public void showStatus(String s) {
        status.setText(s);
      }  static Object getResource(String key) {
        if (resources != null) {
          return resources.getString(key);
        }
        return null;
      }
    }
      

  9.   

    其实问题应该出在这行啊
      TableCellRenderer hdrRenderer =
            middleColumn.getHeaderRenderer();
    在这里hdrRenderer就是null了
      

  10.   

    hdrRenderer为null,使用前需要先设置HeaderRenderer,加入中间红色的这句代码即可
        middleColumn.setHeaderRenderer(multilineRenderer);
        lastColumn.setHeaderRenderer(multilineRenderer);    TableCellRenderer hdrRenderer =
            middleColumn.getHeaderRenderer();
      

  11.   

    sorry,是加入下面这句即可!
    middleColumn.setHeaderRenderer(multilineRenderer);
      

  12.   

    14搂和17搂为正解。
    其实还是回到set和get方法的运用上了,在没有设置HeaderRenderer时,默认的是null。
    谢谢大家,学习了。