#java #swing #jframe #awt #paint
#java #swing #jframe #awt #Краски
Вопрос:
Программа компилируется, но я не вижу прямоугольника в окне, может кто-нибудь мне помочь, я новичок в этом. Моя цель — просто нарисовать три прямоугольника в окне. для программы светофора.
import java.io.*;
import javax.swing.*;
import java.awt.event.*;
import java.awt.*;
import java.awt.Color;
import java.awt.Canvas;
import java.lang.String;
import java.awt.Graphics;
class traffic extends Canvas implements ActionListener{
static JRadioButton b1,b2,b3;
static JPanel jp = new JPanel();
static JFrame win= new JFrame("Traffic light");
traffic(){
b1= new JRadioButton("red");
b2= new JRadioButton("green");
b3= new JRadioButton("yellow");
jp.add(b1);
jp.add(b2);
jp.add(b3);
win.add(jp);
win.setLayout(new FlowLayout());
win.setSize(500,500);
win.setVisible(true);
win.setDefaultCloseOperation(win.DISPOSE_ON_CLOSE);
b1.addActionListener(this);
b2.addActionListener(this);
b3.addActionListener(this);
}
public void actionPerformed(ActionEvent e) throws ArithmeticException
{ }
public void paint(Graphics g){
g.setColor(Color.RED);
g.fillRect(130, 30,100, 80);
}
public static void main(String[] args)
{ traffic tr= new traffic();
tr.repaint();
}
}
Комментарии:
1. 1) Убедитесь, что окно отображается только после добавления и вызова всех компонентов
pack()
. 2) После этого вы должны увидеть кнопки, но без холста. Похоже, он никогда ни к чему не добавляется. 3) Затем, после добавления холста (до того, как фрейм будет упакован), вы должны .. все еще не видеть его, поскольку макет потока будет соответствовать размеру по умолчанию 0 x 0. AFAIR, который с AWT, не очень хорош.2. .. 4) Где бы вы ни получили этот код, верните его обратно и начните заново. Было бы проще сделать это снова из учебника , чем исправить то, что указано выше.
3. Я сделал, как вы посоветовали, ваше право, это вообще не рисование, только кнопки отображаются, когда я вызываю pack.
Ответ №1:
- Не расширяйте
Canvas
(или даже не используйте его), но расширяйтеJPanel
. - добавьте
JPanel
вJFrame
— (win.add(this)
) - Ваши кнопки заполняют панель, скрывая фон. Дайте им размер
- Добавьте их в
JPanel
просто используяadd(b1)
etc - Не переопределяйте
paint
, но переопределяйтеpaintComponent
. И сделайте это следующим образом:
@Override
public void paintComponent(Graphics g) {
super.paintComponent(g);
// your stuff here
- Не устанавливайте размер
JFrame
. Установите размерJPanel
. В противном случае вашаJFrame
граница поглощает часть размера, делая вашу панель меньше, чем вы хотите. Сделайте это следующим образом.
@Override
public Dimension getPreferredSize() {
return new Dimension(500,500);
}
У вас все еще есть другая логика для разработки, но это должно помочь вам начать.
Исправления стиля
Это не критично для выполнения вашего кода, но важно для изучения.
- По соглашению, классы начинаются с символа верхнего регистра.
- При обращении к статическим значениям используйте имя класса, а не экземпляр.
win.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);
Комментарии:
1. Спасибо, это сработало 🙂 и я буду помнить о советах.
2. Пожалуйста. Возможно, вы захотите попробовать еще одно предложение. Добавьте свои кнопки в отдельную JPanel. А затем добавьте эту панель к другой панели. Это помогает управлять кнопками как группой при размещении их на главной панели. Фактически, использование JPanel с разными менеджерами компоновки является обычной практикой для создания графического интерфейса, поскольку панели могут содержать другие панели и т. Д.
3. Конечно, я решил это, опубликую код. Я должен отправить его к завтрашнему дню, поэтому я буду помнить об этом в следующий раз 🙂
Ответ №2:
import java.io.*;
import javax.swing.*;
import java.awt.event.*;
import java.awt.*;
import java.awt.Color;
import java.awt.Canvas;
import java.lang.String;
import java.awt.Graphics;
class traffic extends JPanel implements ActionListener{
static JRadioButton b1,b2,b3;
static JLabel l1;
traffic(){
JFrame win= new JFrame("Traffic light");
l1= new JLabel("my name");
b1= new JRadioButton("red");
b2= new JRadioButton("green");
b3= new JRadioButton("yellow");
this.getPreferredSize();
l1.setBounds(40,100,60,50);
win.setSize(500,500);
b1.setBounds(70,100,60,50);
b2.setBounds(150,100,60,50);
b3.setBounds(140,150,60,50);
this.add(b1);
this.add(b2);
this.add(b3);
this.add(l1);
win.add(this);
win.setVisible(true);
win.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);
b1.addActionListener(this);
b2.addActionListener(this);
b3.addActionListener(this);
}
@Override
public Dimension getPreferredSize() {
return new Dimension(500,500);
}
public void actionPerformed(ActionEvent e)
{ if(e.getSource()==b1)
{ b2.setSelected(false);
b3.setSelected(false);
this.repaint();
}
else if(e.getSource()==b2)
{ this.repaint();
b1.setSelected(false);
b3.setSelected(false);
}
else if(e.getSource()==b3)
{ this.repaint();
b1.setSelected(false);
b2.setSelected(false);
}
}
@Override
public void paintComponent(Graphics g) {
super.paintComponent(g);
if(b1.isSelected())
{
g.setColor(Color.RED);
g.fillRect(150, 60,100, 100);
}
else if(b2.isSelected())
{ g.setColor(Color.GREEN);
g.fillRect(150, 60,100, 100);
}
else if(b3.isSelected())
{
g.setColor(Color.YELLOW);
g.fillRect(150, 60,100, 100);
}
else{
g.setColor(Color.WHITE);
g.fillRect(150, 60,100, 100);
}
}
public static void main(String[] args)
{
traffic tr= new traffic();
}
}