Я пытаюсь нарисовать два квадрата определенного размера, один расположенный рядом с другим в строке, используя метод 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()?
Вы используете макет? Если вы не знаете об этом try frame.setLayout (null). –
Я не вижу, где вы устанавливаете диспетчер компоновки. Вам нужно явно установить менеджеров макетов, если вы не используете значение по умолчанию. – c0der
@ Alejandro Cortes Я бы не сделал 'frame.setLayout (null)'. Это требует установки границ для каждого компонента. Для этого предназначены менеджеры макетов. – c0der