Ниже приведен код окна, который меняет цвет, когда пользователь нажимает кнопку, и меняет текст метки, когда он нажимает на другую кнопку.Как элементы в контейнере корректируются при изменении размера окна?
Он имеет две кнопки, панель для удерживания кнопок, ярлык и панель для графики.
Концептуальное объяснение: Во-первых, я добавил label
к North
части frame
, используя по умолчанию BorderLayout
. Затем я добавил два buttons
в отдельную панель, и я добавил, что panel
в South
часть основного frame
. Затем я добавил panel
для графики в Center
основного frame
.
import javax.swing.*;
import java.awt.*;
import java.awt.event.ActionListener;
import java.awt.event.ActionEvent;
class GuiAnimation extends JFrame
{
JButton colorBut;
JButton labelBut;
JLabel label;
PaintCanvas firstCanvas;
JPanel buttonPanel;
GuiAnimation()
{
colorBut = new JButton("Color Change");
labelBut = new JButton("Text Change");
label = new JLabel("I will change");
firstCanvas = new PaintCanvas();
buttonPanel = new JPanel();
addListener(); //May be i should make different method for different component for the flexibility.But here program is small.
addEverything();
}
private void addListener()
{
colorBut.addActionListener(new ColorListener());
labelBut.addActionListener(new LabelListener());
}
private void setButtonInPanel()
{
int pad = 80;
buttonPanel.setLayout(new FlowLayout(FlowLayout.LEADING, pad, 20));
buttonPanel.add(colorBut);
buttonPanel.add(labelBut);
}
void addEverything() //Here things are done with Layouts.
{
//add the label to the top of the window.
this.getContentPane().add(BorderLayout.NORTH, label);
//add button inside the panel.
setButtonInPanel();
//add that panel that has button to the frame.
this.getContentPane().add(BorderLayout.SOUTH, buttonPanel);
//add the graphics canvas to the frame.
this.getContentPane().add(BorderLayout.CENTER, firstCanvas);
}
class PaintCanvas extends JPanel
{
public void paintComponent(Graphics g)
{
int red = (int) (Math.random() * 255);
int green = (int) (Math.random() * 255);
int blue = (int) (Math.random() * 255);
Color randomColor = new Color(red, green, blue);
g.setColor(randomColor);
g.fillRect(0, 0, getWidth(), getHeight());
}
}
class ColorListener implements ActionListener
{
public void actionPerformed(ActionEvent e){
firstCanvas.repaint();
}
}
class LabelListener implements ActionListener
{
public void actionPerformed(ActionEvent e){
if (label.getText().equals("I will change"))
label.setText("yes yes yes clicked");
else
label.setText("I will change");
}
}
public static void main(String[] args) {
GuiAnimation gui = new GuiAnimation();
gui.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
gui.setSize(500,600);
gui.setVisible(true);
}
}
Вот вывод вышеприведенного кода. Далеко так хорошо.
Но когда я начинаю скользить с правой стороны, происходит следующее:
Теперь правая стена окна приближается к левой стороне, но кнопки неподвижны. Продолжая это мы получаем:
Однако, если размер с левой стороны, мы получаем:
Здесь кнопка, кажется, двигаться в направлении вправо, вместе с рамкой (сохраняя расстояние от границы кадра). Это противоположно предыдущему случаю. Но почему? Как?
Наконец, мы имеем:
Продолжая это, кнопка "ColorChange" также становится частично невидимым.
Почему эти две разные вещи происходят, если мы скользим справа налево или слева направо?
Я искал, но я не смог найти точного ответа на этот вопрос, поэтому, наконец, я спрашиваю здесь: почему и как?
Не генерируйте случайные цвета в методе paintComponent(). Фон будет меняться каждый раз при изменении размера рамки. На основе кнопок, добавленных в рамку, это должно измениться только при нажатии кнопки «Изменение цвета». Поэтому, когда вы нажимаете на кнопку, вы должны создать случайный цвет и вызывать метод setBackground (...) с цветом. Затем панель будет перерисовываться. – camickr