ошибка при рисовании прямоугольника в java swing

#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();



}





}