2016-07-02 3 views
0

У меня есть два класса, которые расширяют JPanel: MapPanel и CityPanel. Я пытаюсь нарисовать CityPanel в MapPanel, но ничего не появляется. Я не понимаю, почему, если я добавлю JButton таким же образом, он будет отображаться отлично. Вот код:Нарисуйте JPanel в JPanel

public class PanelMap extends JPanel { 

    public PanelMap() { 
     CityPanel city = new CityPanel(); 
     city.setVisible(true); 
     this.add(city); 
    } 

    @Override 
    protected void paintComponent(Graphics g) { 
     super.paintComponent(g); 
    } 

} 



public class CityPanel extends JPanel { 

    private BufferedImage image; 

    public CityPanel() { 
    } 

    @Override 
    protected void paintComponent(Graphics g) { 
     super.paintComponent(g); 
     g.drawString("Test", 0, 0);  } 

} 

EDIT:

У меня есть этот код в CityMap. Он отображает строку, но не изображение.

public CityPanel(String filePath, int red, int green, int blue) { 
     this.image = colorImage(filePath, red, green, blue); 
     this.setSize(100, 100); 
    } 

    @Override 
    protected void paintComponent(Graphics g) { 
     super.paintComponent(g); 
     g.drawImage(image, 50, 50, null); 
     g.drawString("sdjkfpod", 50, 50); 
    } 
+1

'@Override защищенная пустота paintComponent (Графика g) { super.paintComponent (g); } 'Этот код совершенно бессмысленен. Все, чего он добивается, состоит в том, чтобы убедиться, что метод делает именно то, что он сделал бы, если бы не был переопределен метод. –

+1

Поскольку 'CityPanel' не предлагает размер, а' PanelMap' имеет значение 'FlowLayout' по умолчанию, панель города будет 0x0 пикселей и не будет отображаться. Добавьте к нему красную «LineBorder», чтобы доказать это самому себе. В целом: для лучшей помощи скорее отправьте сообщение [MCVE] или [Short, Self Contained, Correct Example] (http://www.sscce.org/). –

+0

укажите размер вашей внутренней панели ... –

ответ

1

Не могли бы вы заменить следующий конструктор PanelMap.java:

public PanelMap() { 
    CityPanel city = new CityPanel(); 
    city.setVisible(true); 
    this.add(city); 
} 

К следующему конструктору:

public PanelMap() { 
    String filePath = "C:\\...\\city2.png"; 
    CityPanel city = new CityPanel(filePath, 0, 255, 255);  
    this.setLayout(new BorderLayout()); 
    this.add(city, BorderLayout.CENTER);   
} 

и увидеть результат?

следующие изменения были внесены в код:

  • Оператор city.setVisible(true); удаляется, поскольку он не требуется вообще.
  • Заявление this.add(city); действительно добавлял CityPanel к PanelMap но CityPanel взял очень мало места и выглядел как очень маленький прямоугольник. По этой причине BorderLayout было использовано .

После PanelMapDemo.java добавляет PanelMap к JFrame и создает исполняемый пример.

public class PanelMapDemo extends javax.swing.JFrame { 
private static final long serialVersionUID = 1L; 

public static void main(String[] args) { 
    javax.swing.SwingUtilities.invokeLater(new Runnable() { 
     public void run() { 
      PanelMapDemo demoFrame = new PanelMapDemo("PanelMapDemo"); 
      demoFrame.setVisible(true); 
     } 
    }); 
} 

public PanelMapDemo(String title) { 
    super(title); 
    setDefaultCloseOperation(javax.swing.JFrame.EXIT_ON_CLOSE); 
    add(new PanelMap()); 
    setSize(new java.awt.Dimension(400, 200)); 
    setLocationRelativeTo(null); 
} 
} 

В моей системе, когда исходная картина:

enter image description here

Ваш MapPanel меняет картину:

enter image description here

Надежда, это помогает.

+0

Привет @ user1315621 вы посмотрели мой ответ? –

+0

Не пренебрегайте 'pack()' охватывающим фреймом. – trashgod

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