Eclipse продолжает зависать, когда я пытаюсь запустить этот код в течение нескольких минут, а затем показывает NullPointerException

У меня есть программа, которая должна отображать список из 4 х X элементов. Я не очень хорош в этих списках, поэтому я провел много исследований, комбинируя несколько примеров. Я наконец закончил тем, что сделал класс для этого названного TabListCellRenderer:

import java.awt.*;
import java.util.*;
import javax.swing.*;
import javax.swing.border.*;


class TabListCellRenderer extends JLabel implements ListCellRenderer{

    protected static Border m_noFocusBorder;
    protected FontMetrics m_fm = null;
    protected Insets m_insets = new Insets(0, 0, 0, 0);
    protected int m_defaultTab = 50;
    protected int[] m_tabs = null;
    public TabListCellRenderer() {
        super();
        m_noFocusBorder = new EmptyBorder(1, 1, 1, 1);
        setOpaque(true);
        setBorder(m_noFocusBorder);
    }

    public Component getListCellRendererComponent(JList list,Object value, int index, boolean isSelected, boolean cellHasFocus){
        setText(value.toString());
        setBackground(isSelected ? list.getSelectionBackground() : list.getBackground());
        setForeground(isSelected ? list.getSelectionForeground() : list.getForeground());
        setFont(list.getFont());
        setBorder((cellHasFocus) ? UIManager.getBorder("List.focusCellHighlightBorder") : m_noFocusBorder);
        return this;
    }

    public void setDefaultTab(int defaultTab) {
        m_defaultTab = defaultTab;
    }

    public int getDefaultTab() { 
        return m_defaultTab; 
    }

    public void setTabs(int[] tabs) {
        m_tabs = tabs; 
    }

    public int[] getTabs() { 
        return m_tabs; 
    }

    public int getTab(int index) {
        if (m_tabs == null)
            return m_defaultTab*index;
        int len = m_tabs.length;
        if (index>=0 && index<len)
            return m_tabs[index];
        return m_tabs[len-1] + m_defaultTab*(index-len+1);
    }

    public void paint(Graphics g) {
        m_fm = g.getFontMetrics();
        g.setColor(getBackground());
        g.fillRect(0, 0, getWidth(), getHeight());
        getBorder().paintBorder(this, g, 0, 0, getWidth(), getHeight());
        g.setColor(getForeground());
        g.setFont(getFont());
        m_insets = getInsets();
        int x = m_insets.left;
        int y = m_insets.top + m_fm.getAscent();
        StringTokenizer    st = new StringTokenizer(getText(), "\t");
        while (st.hasMoreTokens()){ 
            String sNext = st.nextToken();
            g.drawString(sNext, x, y);
            x += m_fm.stringWidth(sNext);
            if (!st.hasMoreTokens())
                break;
            int index = 0;
            while (x >= getTab(index))
                index++;
            x = getTab(index);
        }
    }
}

Затем я инициализирую список, выполнив следующий фрагмент кода на JPanel:

TabListCellRenderer renderer = new TabListCellRenderer();
renderer.setTabs(new int[] {50, 200, 300});
listaAnimali.setCellRenderer(renderer);

Если я запускаю эти 3 строки, мой Eclipse останавливается на несколько минут (3-5), то говорит, что последняя из 3 строк вызвала NullPointerException:

Exception in thread "main" java.lang.NullPointerException
    at classe_di_interfaccia.MyPanel.<init>(MyPanel.java:76)
    at classe_di_interfaccia.TestClass.main(TestClass.java:9)

Задница, вы можете видеть, что нет ссылки на класс для списка. Я пытался работать в своей голове задом наперед, но, насколько я могу судить, все проверяется.

Я попробовал опцию отладки на Eclipse, но это приводит к сбою программы. (без кода ошибки. Это просто отображение системы Windows: "Программа не отвечает, вы хотите закрыть ее?")

Что я пропустил? Это проблема с затмением? почему затмение такое медленное?

Обычно это работает нормально (я стимулировал исключение NullPointerException)

Используя эти 3 класса, я могу заставить его снова выдавать ошибку (используя geany, но это намного быстрее, чем 3 секунды)

Пример панели:

import java.awt.*;
import javax.swing.*;
import java.awt.event.*;

public class Panel extends JPanel {

    private JPanel PanelOnPanel

    private JList listaAnimali;

    public PanelGrafica(){
        TabListCellRenderer renderer = new TabListCellRenderer();
        renderer.setTabs(new int[] {50, 200, 300});
        listaAnimali.setCellRenderer(renderer);

        panelList.add(listaAnimali);

    }
}

JFrame:

import java.awt.*;
import javax.swing.*;

public class MyFrame extends JFrame {
  public MyFrame(){
    super(); 
    setBounds(100,100,350,600);
  }
  public MyFrame(String titolo){
    super(titolo);
    setBounds(100,100, 350,600);
  }
}

Класс для тестирования:

import java.awt.*; 
import javax.swing.*;
import java.awt.event.*;
import javax.swing.JTabbedPane;

public class Test{ 

    public static void main(String[] v){ 

    JFrame f = new MyFrame("Una Mensola Automatico"); 

    Container c = f.getContentPane(); 

    JPanel panel = new PanelGrafica();

    f.setResizable(false);

    f.show(); 
    } 
}

0 ответов

Другие вопросы по тегам