Java 事件发生时在小程序中使用paintComponent绘制
我正在尝试创建一个小程序,它将生成与文本框中指定的数字一样多的椭圆。文本框出现,但按enter键时,我的画图组件不会绘制。先谢谢你Java 事件发生时在小程序中使用paintComponent绘制,java,swing,user-interface,paintcomponent,Java,Swing,User Interface,Paintcomponent,我正在尝试创建一个小程序,它将生成与文本框中指定的数字一样多的椭圆。文本框出现,但按enter键时,我的画图组件不会绘制。先谢谢你 import java.awt.*; import java.awt.event.*; import javax.swing.*; import net.miginfocom.layout.*; import net.miginfocom.swing.MigLayout; import java.awt.geom.*; public class OvalDrawe
import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
import net.miginfocom.layout.*;
import net.miginfocom.swing.MigLayout;
import java.awt.geom.*;
public class OvalDrawer extends JApplet
{
private JLabel numberL;
private JTextField numberTF;
private NumHandler numHandler;
public static final int WIDTH = 500;
public static final int HEIGHT = 500;
//Create Layout
public void init()
{
setLayout(new MigLayout("wrap 2"));
numberL = new JLabel("Enter number of ovals to draw:");
numberTF = new JTextField(7);
add(numberL);
add(numberTF);
numHandler = new NumHandler();
numberTF.addActionListener(numHandler);
setSize(500, 500);
}
//Event Handler
public class NumHandler implements ActionListener
{
public void actionPerformed(ActionEvent e)
{
repaint();
}
}
//Draw Ovals
public void paintComponent (Graphics g)
{
super.paintComponents(g);
int number;
int x = 10;
int y = 30;
int width = 20;
int height = 10;
number = Integer.parseInt(numberTF.getText());
for (int i = 0; i < number; i++)
{
g.drawOval(x, y, width, height);
x += 5;
y += 5;
width += 5;
height += 5;
}
}
}
import java.awt.*;
导入java.awt.event.*;
导入javax.swing.*;
导入net.miginfocom.layout.*;
导入net.miginfocom.swing.MigLayout;
导入java.awt.geom.*;
公共类OvalDrawer扩展JApplet
{
私人JLabel号码;
专用JTextField号;
私人NumHandler NumHandler;
公共静态最终整数宽度=500;
公共静态最终内部高度=500;
//创建布局
公共void init()
{
setLayout(新的MigLayout(“包装2”));
numberL=新的JLabel(“输入要绘制的椭圆数:”);
numberTF=新的JTextField(7);
加上(数字1);
加上(数字f);
numHandler=新的numHandler();
numberTF.addActionListener(numHandler);
设置大小(500500);
}
//事件处理程序
公共类NumHandler实现ActionListener
{
已执行的公共无效操作(操作事件e)
{
重新油漆();
}
}
//画椭圆
公共组件(图形g)
{
超级组件(g);
整数;
int x=10;
int y=30;
整数宽度=20;
整数高度=10;
number=Integer.parseInt(numberTF.getText());
for(int i=0;i
JApplet类没有要重写的paintComponent方法。请注意,编译器不允许您调用实际的super方法(您认为您可能正在这样做,但实际上您正在调用super.paintComponents(…)
,这是一种完全不同的方法)
一个糟糕的解决方案是覆盖JApplet的绘制方法,但我强烈建议您不要这样做。相反,您应该绘制JPanel的paintComponent方法,然后让JApplet显示该JPanel。此外,您还需要养成使用@Override
注释的习惯,以确保您实际上正在重写您认为是的方法。/**
/* * <Applet code=PressButton2 width=600 height=600> * </Applet>
*/
import javax.swing.*; import java.awt.*; import java.awt.event.*;
class MyPanel extends JPanel {
static String s="n";
public void paintComponent(Graphics g) {
super.paintComponent(g);
if(s.equals("g"))
setBackground(Color.green);
if(s.equals("b"))
setBackground(Color.blue);
if(s.equals("c"))
setBackground(Color.white);
}
}
public class PressButton2 extends JApplet {
MyPanel panel;
MyPanel screen;
String s="n";
JButton green, clear, blue;
public void init() {
Container container = getContentPane();
panel = new MyPanel();
screen = new MyPanel();
panel.setLayout(new GridLayout(1, 3));
green = new JButton("Green");
blue = new JButton("Blue");
clear = new JButton("Clear");
green.addActionListener(new ActionEventHandler1());
blue.addActionListener(new ActionEventHandler1());
clear.addActionListener(new ActionEventHandler1());
panel.add(green);
panel.add(blue);
panel.add(clear);
container.add(panel, BorderLayout.SOUTH);
container.add(screen);
}
class ActionEventHandler1 implements ActionListener {
public void actionPerformed(ActionEvent e) {
String temp = e.getActionCommand();
if (temp.equals("Green")) {
MyPanel.s = "g";
screen.repaint();
}
if (temp.equals("Blue")) {
MyPanel.s = "b";
screen.repaint();
}
if (temp.equals("Clear")) {
MyPanel.s = "c";
screen.repaint();
}
}
}
*/
导入javax.swing.*;导入java.awt.*;导入java.awt.event.*;
类MyPanel扩展了JPanel{
静态字符串s=“n”;
公共组件(图形g){
超级组件(g);
如果(s.等于(“g”))
挫折背景(颜色:绿色);
如果(s.等于(“b”))
挫折背景(颜色:蓝色);
如果(s.等于(“c”))
挫折地面(颜色:白色);
}
}
公共类PressButton2扩展JApplet{
我的小组;
MyPanel屏幕;
字符串s=“n”;
JButton绿色、透明、蓝色;
公共void init(){
Container=getContentPane();
panel=新的MyPanel();
screen=newmypanel();
panel.setLayout(新网格布局(1,3));
绿色=新的按钮(“绿色”);
蓝色=新的按钮(“蓝色”);
清除=新的按钮(“清除”);
green.addActionListener(新的ActionEventHandler1());
blue.addActionListener(新的ActionEventHandler1());
clear.addActionListener(新的ActionEventHandler1());
面板。添加(绿色);
面板。添加(蓝色);
面板。添加(清除);
container.add(面板,BorderLayout.SOUTH);
容器。添加(屏幕);
}
类ActionEventHandler1实现ActionListener{
已执行的公共无效操作(操作事件e){
字符串temp=e.getActionCommand();
如果(温度等于(“绿色”)){
MyPanel.s=“g”;
screen.repaint();
}
如果(温度等于(“蓝色”)){
MyPanel.s=“b”;
screen.repaint();
}
如果(温度等于(“清除”)){
MyPanel.s=“c”;
screen.repaint();
}
}
}
这是有道理的。我添加了一个JPanel。如何在JPanel中绘制?@NathanSacket:请看这里:这很有用,但没有解释如何在MigLayout中在JPanel中绘制。我正在用其他关于此主题的文章补充这个问题,但我无法完成。@NathanSacket:布局与绘制无关g、 而且不会影响它。如果你关心的是背景图像的显示,那么你需要关注覆盖组件的不透明性,而不是布局。我可能需要提出一个新问题。这是对所问问题的极好回答。谢谢。