2015-04-15 3 views
0

Я скопировал примеры прямо из книги. Код должен сделать пару вещей на JFrame, но ничего не отображается (кроме JFrame) Вот класс с основным методомJPanel не отображается

import java.awt.BorderLayout; 
import javax.swing.JFrame; 

public class JavaApplication24 { 

    /** 
    * @param args the command line arguments 
    */ 
    public static void main(String[] args) { 
    JFrame frame = new JFrame("Window"); 
    frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 

    frame.setSize(480,270); 

    frame.setVisible(true); 
    NewClass panel = new NewClass(); 

    frame.add(BorderLayout.CENTER, panel); 

    } 

Вот подкласс JPanel

import java.awt.Graphics; 
import java.awt.Color; 
import javax.swing.JPanel; 


public class NewClass extends JPanel { 

    @Override 
    public void paintComponent(Graphics g){ 
     g.setColor(Color.BLUE); 
     g.fillRect(0,0,100,100); 

     g.setColor(Color.GREEN); 
     g.drawRect(50,50,100,100); 

     g.setColor(Color.RED); 
     g.drawString("Hello",200,200); 

     g.setColor(Color.RED); 
     g.fillOval(240,40,100,30); 

    } 
} 

ответ

1

Выпуск № 1

Ваш NewClass должен содержать подсказки размеров, которые диспетчер компоновки (BorderLayout в этом случае) может принимать решения о том, как наилучшим образом разместить ваш компонент.

Вы также должны называть super.paintComponent, прежде чем делать какие-либо пользовательские картины, в противном случае вы будете в конечном итоге без конца рендеринга артефактов появляются

public class NewClass extends JPanel { 

    @Override 
    public Dimension getPreferredSize() { 
     return new Dimension(400, 400); 
    } 

    @Override 
    protected void paintComponent(Graphics g) { 
     super.paintComponent(g); 
     g.setColor(Color.BLUE); 
     g.fillRect(0, 0, 100, 100); 

     g.setColor(Color.GREEN); 
     g.drawRect(50, 50, 100, 100); 

     g.setColor(Color.RED); 
     g.drawString("Hello", 200, 200); 

     g.setColor(Color.RED); 
     g.fillOval(240, 40, 100, 30); 

    } 
} 

я скопировал примеры прямо из книги

Я надеюсь, что вы только что допустили некоторые незначительные ошибки, в противном случае я буду обеспокоен действительностью книги: P

Вы также должны начинать свой UI изнутри контекста события диспетчерские темы, это, как правило, для решения проблем, которые могут появиться на различных платформах ...

public static void main(String[] args) { 
    EventQueue.invokeLater(new Runnable() { 
     @Override 
     public void run() { 
      try { 
       UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName()); 
      } catch (ClassNotFoundException | InstantiationException | IllegalAccessException | UnsupportedLookAndFeelException ex) { 
       ex.printStackTrace(); 
      } 

      JFrame frame = new JFrame("Testing"); 
      frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
      frame.add(new NewClass()); 
      frame.pack(); 
      frame.setLocationRelativeTo(null); 
      frame.setVisible(true); 
     } 
    }); 
} 

См Initial Threads для более подробной информации

Issue # 2

вы не должны сделать UI видимым, пока вы не установили его, вместо

frame.setVisible(true); 
NewClass panel = new NewClass(); 

frame.add(BorderLayout.CENTER, panel); 

Используйте нечто большее как ...

NewClass panel = new NewClass(); 
frame.add(BorderLayout.CENTER, panel);  
frame.setVisible(true); 

Есть способы, вы можете вызвать и обновление после того, как кадр становится видимым, но это только самый простой исправить

+0

одна вещь, которую я сделал теперь понимаю, что нарисованные изображения показывают только когда Я устанавливаю размеры для setSize() как нечто большее, например setSize (1500,1500); –

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