Давайте посмотрим, что вы сделали. Вы создали JFrame с нулевым макетом. Так что это означает, что он не управляет размером или положением своих детей. (Некоторые могут сказать, что это нерадивый родитель.)
Это означает, что оба ваших JPanels должны запомнить setBounds
звонок, который вы им сделали. Который устанавливает и их размер и положение. Таким образом, ваш setSize
вызов избыточен.
Вы установили в JPanels менеджер flowLayout
. Это означает, что они пытаются управлять размером и положением своих детей. Это не всегда сразу.
Вы вызываете setBounds для своих кнопок. Теперь они действительно запутались. Во-первых, у них есть свои границы и размеры. Не вызывать setBound для не пользовательских компонентов . На самом деле, лучше вообще его не использовать.
Первая панель в порядке. Вы устанавливаете границы вашей кнопки равными (0, 0, 200, 400). Это внутри JPanel, на котором он предназначен для рисования.
Вторая панель не в порядке. Границы вашей кнопки (200, 0, 200, 400) имеют ширину вашего компонента 200, поэтому вы даете кнопке пространство вне панели для рисования. Затем ваш компонент рисования также заполняет прямоугольник за пределами вашей jpanel .
Таким образом, ваши кнопки имеют размер и положение, которые будут изменены при первом обращении к диспетчеру компоновки.
Следующий код управляет тем, что я предполагаю, что вы пытаетесь делать. Есть две цветные панели, каждая из которых показывает JButton. Когда вы нажимаете на нее, она уходит. Это в основном то, что у вас есть с некоторыми лишними битами.
import java.awt.*;
import javax.swing.*;
public class TestBig {
public static void main(String[] args) {
JFrame canvas = new JFrame("canvas");
canvas.setSize(400,400);
canvas.setLayout(null);
JPanel leftPanel = new JPanel( new FlowLayout(0, 0, 0) );
leftPanel.setOpaque(true);
leftPanel.setBackground(Color.BLUE);
JPanel rightPanel = new JPanel();
rightPanel.setOpaque(true);
rightPanel.setBackground(Color.RED);
BufferedImage img = new BufferedImage(200, 400, BufferedImage.TYPE_INT_ARGB);
Graphics g = img.getGraphics();
g.setColor(Color.YELLOW);
g.fillRect(0, 0, 200, 400);
g.dispose();
JButton left = new JButton(new ImageIcon(img));
left.setBorder(null);
left.addActionListener( evt->{
left.setVisible(false);
});
JButton right = new JButton("right");
right.addActionListener( evt -> {
right.setVisible(false);
});
leftPanel.add(left);
rightPanel.add(right);
canvas.add(leftPanel);
canvas.add(rightPanel);
leftPanel.setBounds( 0, 0, 200, 400);
rightPanel.setBounds(200, 0, 200, 400);
canvas.setVisible(true);
canvas.setDefaultCloseOperation( JFrame.EXIT_ON_CLOSE );
}
}