2016-09-09 2 views
1

Я пытаюсь нарисовать два квадрата определенного размера, один расположенный рядом с другим в строке, используя метод paintComponent() JPanel. Вот что я пытался до сих пор:Картина двух квадратов с JPanel.paintComponent() - неправильный размер

1. BorderLayout

Я попытался нарисовать каждый квадрат в отдельный подкласс JPanel, а затем добавить эти JPanels в JFrame.

Результат: квадраты сдавлены на противоположные стороны JPanel: высота как ожидалось, но ширина минимальная.

JFrame frame = new JFrame(); 

GreenPanel greenPanel = new GreenPanel(); 
frame.getContentPane().add(BorderLayout.WEST, greenPanel); 
BluePanel bluePanel = new BluePanel(); 
frame.getContentPane().add(BorderLayout.EAST, bluePanel); 

frame.setSize(500, 350); 
frame.setVisible(true); 
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 

class GreenPanel extends JPanel {   
    public void paintComponent(Graphics g) { 
     g.setColor(Color.GREEN); 
     g.fillRect(0, 0, 100, 100); 
    } 
} 

class BluePanel extends JPanel {   
    public void paintComponent(Graphics g) { 
     g.setColor(Color.BLUE); 
     g.fillRect(0, 0, 100, 100); 
    } 
} 

2. FlowLayout

Я пытался добавить мои "дети" JPanels с нарисованными квадратами к "родительскому" JPane, а затем вызвать JFrame.setContentPane (JPanel).

Результат: Квадраты окрашены в верхнюю центральную область в виде крошечных квадратов.

JFrame frame = new JFrame(); 
JPanel outerPanel = new JPanel(); 
frame.setContentPane(outerPanel); 

GreenPanel greenPanel = new GreenPanel(); 
outerPanel.add(greenPanel); 
BluePanel bluePanel = new BluePanel(); 
outerPanel.add(bluePanel); 

frame.setSize(500, 350); 
frame.setVisible(true); 
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 

class GreenPanel extends JPanel {   
    public void paintComponent(Graphics g) { 
     g.setColor(Color.GREEN); 
     g.fillRect(0, 0, 100, 100); 
    } 
} 

class BluePanel extends JPanel {   
    public void paintComponent(Graphics g) { 
     g.setColor(Color.BLUE); 
     g.fillRect(0, 0, 100, 100); 
    } 
} 

Что я делаю неправильно? Есть ли способ заставить менеджеров макетов уважать размер квадратов, нарисованных с помощью paintComponent()?

+0

Вы используете макет? Если вы не знаете об этом try frame.setLayout (null). –

+0

Я не вижу, где вы устанавливаете диспетчер компоновки. Вам нужно явно установить менеджеров макетов, если вы не используете значение по умолчанию. – c0der

+0

@ Alejandro Cortes Я бы не сделал 'frame.setLayout (null)'. Это требует установки границ для каждого компонента. Для этого предназначены менеджеры макетов. – c0der

ответ

2

Внесите следующие изменения. См. Комментарии для объяснений.

JFrame frame = new JFrame(); 
    //add layout manager. You can achieve the desired layout 
    //with GridLayout, Box layout and others 
    frame.getContentPane().setLayout(new GridLayout(1,2)); 
    GreenPanel greenPanel = new GreenPanel(); 
    //set preferred size to the panel 
    greenPanel.setPreferredSize(new Dimension(100,100)); 
    frame.add(greenPanel); 
    BluePanel bluePanel = new BluePanel(); 
    //set preferred size to the panel 
    bluePanel.setPreferredSize(new Dimension(100,100)); 
    frame.getContentPane().add(bluePanel); 

    //let the frame adapt to the panels size 
    //frame.setSize(500, 350); 
    frame.validate(); 
    frame.pack(); 
    frame.setVisible(true); 
    frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 

Не стесняйтесь спрашивать о необходимости уточнений.


(BTW наиважнейшая paintComponent(Graphics g) не очень нужны. Вы можете просто установить нужный размер и цвет каждого JPanel)

+0

Спасибо большое! Это хорошо работает. Я не знал о GridLayout. – nauke

+0

Рад помочь. – c0der

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