Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/317.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 事件发生时在小程序中使用paintComponent绘制_Java_Swing_User Interface_Paintcomponent - Fatal编程技术网

Java 事件发生时在小程序中使用paintComponent绘制

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

我正在尝试创建一个小程序,它将生成与文本框中指定的数字一样多的椭圆。文本框出现,但按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 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、 而且不会影响它。如果你关心的是背景图像的显示,那么你需要关注覆盖组件的不透明性,而不是布局。我可能需要提出一个新问题。这是对所问问题的极好回答。谢谢。