2015-07-29 2 views
4

Ниже приведен код окна, который меняет цвет, когда пользователь нажимает кнопку, и меняет текст метки, когда он нажимает на другую кнопку.Как элементы в контейнере корректируются при изменении размера окна?

Он имеет две кнопки, панель для удерживания кнопок, ярлык и панель для графики.

Концептуальное объяснение: Во-первых, я добавил 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); 
} 
} 

Вот вывод вышеприведенного кода. Далеко так хорошо.

enter image description here

Но когда я начинаю скользить с правой стороны, происходит следующее:

enter image description here

Теперь правая стена окна приближается к левой стороне, но кнопки неподвижны. Продолжая это мы получаем:

enter image description here

Однако, если размер с левой стороны, мы получаем:

enter image description here

Здесь кнопка, кажется, двигаться в направлении вправо, вместе с рамкой (сохраняя расстояние от границы кадра). Это противоположно предыдущему случаю. Но почему? Как?

Наконец, мы имеем:

enter image description here

Продолжая это, кнопка "ColorChange" также становится частично невидимым.

Почему эти две разные вещи происходят, если мы скользим справа налево или слева направо?

Я искал, но я не смог найти точного ответа на этот вопрос, поэтому, наконец, я спрашиваю здесь: почему и как?

+1

Не генерируйте случайные цвета в методе paintComponent(). Фон будет меняться каждый раз при изменении размера рамки. На основе кнопок, добавленных в рамку, это должно измениться только при нажатии кнопки «Изменение цвета». Поэтому, когда вы нажимаете на кнопку, вы должны создать случайный цвет и вызывать метод setBackground (...) с цветом. Затем панель будет перерисовываться. – camickr

ответ

3

Вы объяснили проблему, но вы не объяснили это требование.

Может быть, вы должны рассмотреть Box Layout

panel.add(Box.createHorizontalGlue()); 
panel.add(button1); 
panel.add(Box.createHorizontalStrut(20)); 
panel.add(button2); 
panel.add(Box.createHorizontalGlue()); 

Это позволит создать панель, где кнопки остаются центрированной с промежутком в 20 пикселей между двумя кнопками.

+0

Как вы уже говорили, после кнопки «TextChange» есть пробел, и когда мы скользим справа налево, разрыв уменьшается, но перед кнопкой «ColorChange» есть пробел и почему он не уменьшается, когда мы скользим слева направо? Другими словами, почему 80px поддерживается в случае кнопки ColorChange, а в другом случае это не так? – YakRangi

+0

Мне нужно какое-то предложение с вашей стороны. Если я занимаюсь только GridBagLayout, достаточно будет кодировать любой тип графического интерфейса (почти любого типа), с базовыми знаниями других LayoutManagers? – YakRangi

+1

@Rouftantical, я использую любой менеджер компоновки (или комбинацию менеджеров макета), подходит для работы. – camickr

2

Это из-за вашего разрыва стоимости на

int pad = 80; 
buttonPanel.setLayout(new FlowLayout(FlowLayout.LEADING, pad, 20)); 

. Это всегда 80px. Таким образом, первая кнопка всегда 80px от «начала» панели. Если вы сдвигаетесь с правой стороны налево, ничего не меняется, кроме одной кнопки исчезает, потому что не хватает места, чтобы заполнить 3 пробела.Однако, если вы нажмете слева направо, первая кнопка не исчезнет во-первых, потому что, как упоминалось ранее, у нее есть, чтобы иметь пробел 80px с самого начала. Извините за мой жалкий английский, но я надеюсь, что помог.

+0

не имеет значения – YakRangi

+0

, но если я не даю никаких отступов как слева, так и справа, одна из кнопок видна, когда я полностью сползаю на другой конец. Но почему бы и нет? – YakRangi

+2

(1+), это правильный ответ. «FlowLayout» автоматически переместит компоненты в новую строку, если недостаточно места для компонента, который будет отображаться в первой строке. Если вы хотите, чтобы «обернутые» кнопки также были видимыми, вы можете использовать [Wrap Layout] (https://tips4java.wordpress.com/2008/11/06/wrap-layout/), который расширяет 'FlowLayout' для обработки это поведение. Вам просто нужно изменить одну строку кода: 'buttonPanel.setLayout (новый WrapLayout (WrapLayout.LEADING, pad, 20)); ' – camickr

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