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();
}
}