java swing中绘制矩形的错误

Posted

技术标签:

【中文标题】java swing中绘制矩形的错误【英文标题】:error with drawing rectangle in java swing 【发布时间】:2021-04-30 07:02:03 【问题描述】:

程序编译但我看不到窗口上的矩形,有人可以帮助我,我是新手。 我的目标只是在窗口上绘制三个矩形。用于交通信号灯程序。

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) 确保将窗口设置为仅在 添加所有组件并调用 pack() 之后才可见。 2) 完成后,您应该会看到按钮,但看不到画布。它似乎从未添加到任何东西中。 3)然后,在添加画布之后(在包装框架之前),您应该..仍然看不到它,因为流布局将遵循默认大小 0 x 0。AFAIR,与 AWT 一起使用并不好。跨度> .. 4) 无论您在何处获得此代码,都将其放回原处并重新开始。从tutorial 再次执行此操作会比修复上面显示的内容更简单。 我按照你的建议做了,你的权利它根本没有画,当我调用 pack 时只显示按钮。 【参考方案1】: 不要扩展Canvas(甚至使用它),但要扩展JPanel。 将JPanel 添加到JFrame - (win.add(this)) 您的按钮正在填充面板,隐藏了背景。给他们一个尺寸 仅使用add(b1) 等将它们添加到JPanel 中 不要覆盖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);

【讨论】:

谢谢,它成功了 :) 我会记住这些提示。 不客气。您可能想尝试的另一个建议。将您的按钮添加到单独的 JPanel。然后将该面板添加到您的另一个面板。将按钮放置在主面板中时,它有助于将按钮作为一个组进行控制。事实上,将 JPanel 与不同的布局管理器一起使用是构建 GUI 的常见做法,因为面板可能包含其他面板等。 当然,我解决了,将发布代码。我必须在明天之前提交,所以下次我会记住的:)【参考方案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();










【讨论】:

以上是关于java swing中绘制矩形的错误的主要内容,如果未能解决你的问题,请参考以下文章

在Java中为网格创建绘制矩形(填充黑色)函数

通过按钮将矩形绘制到画布上

在JTextPane java swing中填充直线矩形后无法与视图同步

设置不透明(真/假);爪哇

如何从我的主类在画布上绘制一个矩形?

在 java swing 组件上绘制边框