2013-12-11 3 views
0

Я знаю, что этот вопрос задан очень много, но я прочитал около 10 разных статей, все рекомендуют разные вещи, такие как «frame = this» nad frame.add (d) «Я не уверен, почему , но ни один из них не работал. Я набрал что-то, и программа работала нормально, за исключением того, что Jbuttons не появлялся, пока я не щелкнул JFrame несколько раз. После некоторой настройки этого кода im вернулся к началу. получить ошибку:JFrame не отображает содержимое

Exception in thread "main" java.lang.NullPointerException 
at Guis.Dynamic_JFrame.<init>(Dynamic_JFrame.java:37) 
at Guis.Dynamic_JFrame.main(Dynamic_JFrame.java:46) 

Heres мой код:

public class Dynamic_JFrame extends JFrame{ 

static JFrame frame; 
Graphics g; 
Handler handler = new Handler(); 

JButton red = new JButton(); 
JButton green = new JButton(); 
JButton orange = new JButton(); 

public Dynamic_JFrame(){ 

    red.setText("RED"); 
    green.setText("GREEN"); 
    orange.setText("orange"); 

    add(green); 
    add(red); 
    add(orange); 

    red.addActionListener(handler); 
    green.addActionListener(handler); 
    orange.addActionListener(handler); 

    frame.setVisible(true); 

} 

public static void main(String[] args){ 
    Dynamic_JFrame d = new Dynamic_JFrame(); 
    frame = new JFrame("Changing colors"); 
    frame.setPreferredSize(new Dimension(500,500)); 
    frame.setMaximumSize(new Dimension(500,500)); 
    frame.setMinimumSize(new Dimension(500,500)); 
    frame.setLayout(new FlowLayout()); 
    frame.setLocationRelativeTo(null); 
    frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
} 

public class Handler implements ActionListener{ 

    public void actionPerformed(ActionEvent e) { 
     if(e.getSource()==red){ 
      getContentPane().setBackground(Color.RED); 
     } 
     if(e.getSource()==green){ 
      getContentPane().setBackground(Color.GREEN); 
     } 
     if(e.getSource()==orange){ 
      getContentPane().setBackground(Color.ORANGE); 
     } 
    } 

} 


} 

Новый код, Небольшие изменения. Программа работает как предназначенные для кнопок не обновляемых исключением, пока я не нажмёте, где они должны быть:

JFrame frame; 

public Dynamic_JFrame(){ 

    frame = new JFrame(); 
    frame = this; 

    red.setText("RED"); 
    green.setText("GREEN"); 

    frame.add(green); 
    frame.add(red); 

    frame.setVisible(true); 

} 

    public static void main(String[] args){ 
    Dynamic_JFrame d = new Dynamic_JFrame(); 
    d.frame.setPreferredSize(new Dimension(500,500)); 
    d.frame.setMaximumSize(new Dimension(500,500)); 
    d.frame.setMinimumSize(new Dimension(500,500)); 
    d.frame.setLocationRelativeTo(null); 
    d.frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
    d.frame.setLayout(new FlowLayout()); 
} 
+0

Параметр 'NullPointerException' приходит от вызова 'frame.setVisible (true)' в вашем конструкторе, а 'frame' по-прежнему' null'. – Robin

ответ

1

ряд вещей ...

Во-первых, Dynamic_JFrame простирается от JFrame, так что я не знаю, почему вы «ве затем пошли и создать еще один кадр ...

во-вторых, когда Dynamic_JFrame вызовы frame.setVisible в конструкторе, frame является null, поскольку он не инициализируется.

С моей точки зрения, самое простое решение было бы расширить Dynamic_JFrame от чего-то вроде JPanel, а и просто добавить его к экземпляру JFrame

Например ...

public class Dynamic_JFrame extends JPanel { 

static JFrame frame; 
// Not sure that this is a good idea... 
Graphics g; 

//... 

public Dynamic_JFrame(){ 

    // Don't use this... 
    //frame.setVisible(true); 

} 

public static void main(String[] args){ 
    EventQueue.invokeLater(new Runnable() { 
     public void run() { 
      Dynamic_JFrame d = new Dynamic_JFrame(); 
      frame = new JFrame("Changing colors"); 
      frame.setLayout(new FlowLayout()); 
      frame.add(d); 
      frame.pack(); 
      frame.setLocationRelativeTo(null); 
      frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
      frame.setVisible(true); 
     } 
    }); 
} 
+0

Это произойдет, если вы сделаете рамку видимой, прежде чем добавить что-либо к ней. Как правило, вы должны подготовить пользовательский интерфейс перед тем, как сделать его видимым или вызвать 'revalidate' и' repaint' на панели frame/content ... – MadProgrammer

+0

Спасибо за ответы. Я сделал класс расширением JPanel, и я получил код для правильной работы, но теперь я не могу вызвать getContentPane(). SetBackground(); Я попробовал frame.setBackground(), но это не сработало. Ive также попытался перерисовать() и revalidate() после изменения цвета, но ничего, спасибо. –

+0

'JPanel' не имеет области содержимого, вместо этого просто вызывается' setBackground' ... – MadProgrammer

Смежные вопросы