2016-10-21 2 views
0

Я не знаком с графикой java, и я хочу нарисовать линию на 3 кнопки. Я нашел несколько способов нарисовать линию, но ни один из них не нарисовал ее поверх кнопок.Графика Java (рисование строки)

Вот мой GUI класс

public class GUI extends JFrame{ 
JButton[] buttons; 

GUI() 
{ 
    setSize(255, 390); 
    setLocation(0, 0);  
    setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
    setLayout(null); 
    setVisible(true);  
} 
public void paint(Graphics g) { 
    super.paint(g); 
    //TODO add the line  
} 
void drawButtons() 
{ 
    buttons=new JButton[9]; 
    int x=5,y=80; 
    for(int i=0;i<buttons.length;i++) 
    { 
     buttons[i]=new JButton(""); 
     buttons[i].setSize(70,70); 
     buttons[i].setLocation(x,y); 
     buttons[i].setFont(new Font("Arial", Font.PLAIN, 45)); 
     buttons[i].setBorder(BorderFactory.createBevelBorder(1,Color.black,Color.black)); 
     y+=(i%3==2)?75:0; 
     x=(i%3==2)?5:x+75;   
     add(buttons[i]); 
    } 
} 

}

Так просто, я хочу создать функцию, которая создает линию, и получает местоположение строки в качестве параметра. И я хочу, чтобы линия была поверх кнопок. Как я могу это сделать? Заранее спасибо.

+0

FYI: Весь рисунок в Swing должен выполняться в paintComponent. А обрезка графики обычно затрудняет пользовательскую краску по нескольким компонентам. Рекомендуем проверить JLayer. – ControlAltDel

+0

@ControlAltDel paintComponent - это функция краски, которую у меня есть? Ну, в любом случае, я могу нарисовать слой и добавить слой в рамку, когда захочу? – Ahmed

+0

https://docs.oracle.com/javase/tutorial/uiswing/painting/ – ControlAltDel

ответ

2

И я хочу, чтобы линия была на верхней части кнопок.

Рассмотрите возможность использования Glass pane сделать пользовательский рисунок, перекрывая его paintComponent способ сделать ничью на вершине JFrame. Например:

public class CustomGlassPane extends JPanel{ 

    public CustomGlassPane(){ 
     setOpaque(false); 
    } 

    @Override 
    protected void paintComponent(Graphics g){ 
     super.paintComponent(g); 
     g.setColor(Color.RED); 
     g.drawLine(10, 100, 2000, 100); 
    } 
} 

Затем вы установите панель стекло JFrame

setGlassPane(new CustomGlassPane()); 
getGlassPane().setVisible(true); 

Как в сторону, я бы также рекомендую использовать null макеты - выбрать LayoutManager, который лучше всего подходит для вашего макета (и обратите внимание, что вы можете разворачивать макеты). Я также рекомендовал бы переопределить paintComponent, а не paint (как пытается сделать ваш код).

+0

'сделать рисунок поверх любых компонентов, добавленных в базовый контейнер. - GlassPane покрывает весь JFrame, а не только контейнер. – camickr

+0

@camickr Спасибо за исправление – copeg

+0

Хорошо, мне удалось применить это в свой код и использовать Graphics2D, чтобы добавить штрих в строку, но довольно сложно установить положение строки, мне просто нужно отрегулировать цифры здесь «g.drawLine (10, 100, 2000, 100)»; или есть простой способ настроить положение линии? – Ahmed

2

Взгляните на раздел из учебника Swing по телефону A Closer Look at the Painting Mechanism.

Как вы можете видеть, JPanel будет вызывать метод paintChildren(...). Таким образом, вы можете переопределить этот метод, чтобы нарисовать вашу линию сверху детей панели:

@Override 
protected void paintChildren(Graphics g) 
{ 
    super.paintChildren(g); 

    // paint the line here 
} 

Proably лучший вариант заключается в использовании JLayer, который разработан специально для этого. Прочтите раздел из учебника Swing по телефону Decorating Components With JLayer для получения дополнительной информации и примеров.

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