Java Center изображение и создать зеленую рамку - PullRequest
0 голосов
/ 20 октября 2018

Я пытаюсь создать Java в BlueJ, который будет менять светофор с помощью нажатий кнопок, т. Е. Зеленый цвет станет зеленым, желтый - желтым и т. Д. *

Мое текущее изображение помещаетрасположение огней в левом верхнем углу.Я хотел бы сосредоточить свет и кнопки, поскольку я также пытаюсь добавить толстую зеленую границу вокруг изображения.Однако всякий раз, когда я пытаюсь переместить изображение, оно переворачивает его по горизонтали или, если я добавляю зеленую границу, оно превращается в поле рядом с огнями.Я также пытаюсь переместить кнопки над светофорами по сравнению с огнями.

Не могли бы вы мне помочь: добавьте зеленую границу, отцентрируйте огни внутри границы и переместите кнопкик началу света (также по центру в пределах границы)

Любая помощь будет принята с благодарностью.Заранее спасибо!

import java.awt.*;
import javax.swing.*;
import java.awt.event.*;
import javax.swing.border.*;

public class TrafficLight extends JFrame implements ActionListener {
JButton b1, b2, b3;

  Signal green = new Signal(Color.green);
  Signal yellow = new Signal(Color.yellow);
  Signal red = new Signal(Color.red);

public TrafficLight(){
    super("Traffic Light");
    getContentPane().setLayout(new GridLayout(2, 1));
    b1 = new JButton("Red");
    b2 = new JButton("Yellow");
    b3 = new JButton("Green");
    b1.addActionListener(this);
    b2.addActionListener(this);
    b3.addActionListener(this);        

    green.turnOn(false);
    yellow.turnOn(false);
    red.turnOn(true);

    JPanel p1 = new JPanel(new GridLayout(3,1));
    p1.add(red);
    p1.add(yellow);
    p1.add(green);
    JPanel p2 = new JPanel(new FlowLayout());
    p2.add(b1);
    p2.add(b2);
    p2.add(b3);

    getContentPane().add(p1);
    getContentPane().add(p2);
    pack();
    }


public static void main(String[] args){
    TrafficLight tl = new TrafficLight();        
    tl.setVisible(true);
}    
public void actionPerformed(ActionEvent e){        
    if (e.getSource() == b1){
        green.turnOn(false);            
        yellow.turnOn(false);
        red.turnOn(true);
    } else if (e.getSource() == b2){
        yellow.turnOn(true);            
        green.turnOn(false);
        red.turnOn(false);
    } else if (e.getSource() == b3){
        red.turnOn(false);            
        yellow.turnOn(false);
        green.turnOn(true);
    }
}
}     
class Signal extends JPanel{

Color on;
int radius = 40;
int border = 10;
boolean change;

Signal(Color color){
    on = color;
    change = true;
}

public void turnOn(boolean a){
    change = a;
    repaint();        
}

public Dimension getPreferredSize(){
    int size = (radius+border)*2;
    return new Dimension( size, size );
}

public void paintComponent(Graphics g){
    g.setColor( Color.black );
    g.fillRect(0,0,getWidth(),getHeight());

    if (change){
        g.setColor( on );
    } else {
        g.setColor( on.darker().darker().darker() );
    }
    g.fillOval( border,border,2*radius,2*radius );
}
}

1 Ответ

0 голосов
/ 21 октября 2018

Добавление зеленой границы,

Добавление рамки на панель.Прочитайте учебник Swing по Как использовать границы

центрирование света

Самый простой способ - использовать панель «обертка» для вашего светофорапанель:

//getContentPane().add(p1);
JPanel wrapper = new JPanel();
wrapper.add( p1 );
add( wrapper );

Макет по умолчанию для JPanel соответствует центру FlowLayout.Таким образом, светофоры будут оставаться по центру при изменении размера кадра.

, перемещая кнопки к верхней части огней

Не используйте GridLayout.JFrame по умолчанию использует BorderLayout.Просто используйте этот макет.Прочтите учебник Swing по Как использовать BorderLayout , чтобы определить, какое ограничение следует использовать с каждой панелью.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...