gpt4 book ai didi

java - JMenuItem仅由键盘输入触发,而不是点击

转载 作者:行者123 更新时间:2023-12-02 00:06:22 26 4
gpt4 key购买 nike

我使用 JFrame 用 Ja​​va 编写了一个简单的绘图程序(我第一次使用这样的程序)。用户单击并拖动来绘制形状,但这并不重要。我有一个 JMenuBar ,其中有很多选项,例如形状类型、新建和退出。当用户单击new按钮时,它应该清除屏幕。当用户按下 Ctrl+N 时,效果就很好。但是,当单击该按钮时,它根本不起作用。

我在 newItem 的 actionEvent 中放置了一个调试 System.out.println ,当单击该项目时它打印得很好,但它实际上并没有删除屏幕。知道什么会导致这种情况吗?

我删掉了程序的大部分内容,留下了看到问题所需的部分。您仍然可以按住并拖动来绘制形状(直到释放鼠标按钮后才会出现该形状),然后按 Ctrl+N 清除屏幕,但单击“新建”不会执行此操作。

import java.awt.*;
import java.awt.event.*;
import java.lang.*;
import javax.swing.*;

public class E3G04 extends JFrame implements WindowListener, ActionListener, MouseListener, MouseMotionListener
{
//Variables are declared as volatile to ensure that they're always called from system RAM
static volatile String type = "rectangle";
static volatile Boolean fill = true;
static Color lineColor = Color.BLACK;
static Color fillColor = Color.RED;
static int size = 1;

CanvasEX cx = new CanvasEX();

static boolean running = true;

JMenuBar mb = new JMenuBar();
JMenu fileMenu = new JMenu("File");
JMenuItem newItem = new JMenuItem("New");
JMenuItem quitItem = new JMenuItem ("Quit");


protected E3G04()
{

mb.add(fileMenu);
fileMenu.add(newItem);
fileMenu.add(quitItem);
newItem.setMnemonic('N');
quitItem.setMnemonic('Q');
newItem.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_N, ActionEvent.CTRL_MASK));
quitItem.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_Q, ActionEvent.CTRL_MASK));
newItem.addActionListener(this);
quitItem.addActionListener(this);
cx.setSize(800,600);
cx.addMouseListener(this);
cx.addMouseMotionListener(this);
setJMenuBar(mb);
setBounds(100,100,800,600);
setLayout(new BorderLayout());
add("Center",cx);
addWindowListener(this);
setResizable(true);
setVisible(true);
}

public static void main(String [] args)
{
new E3G04();
}

public void stop()
{
newItem.removeActionListener(this);
quitItem.removeActionListener(this);
dispose();
System.exit(0);
}

public void actionPerformed(ActionEvent e)
{
Object o = e.getSource();

if (o == newItem)
{
cx.erase = true;
cx.repaint();
}

if (o == quitItem)
{
running = false;
stop();
}

}

public void mousePressed(MouseEvent m)
{
cx.start = m.getPoint();
cx.end = cx.start;
cx.cur = cx.start;
}

public void mouseDragged(MouseEvent m)
{
cx.cur = m.getPoint();
}

public void mouseReleased(MouseEvent m)
{
cx.end = cx.cur;
cx.repaint();
}
public void itemStateChanged(ItemEvent e)
{
Object o = e.getSource();

}
public void windowClosing(WindowEvent e)
{
running = false;
stop();
}
public void mouseClicked(MouseEvent m){}
public void mouseExited(MouseEvent m){}
public void mouseEntered(MouseEvent m){}
public void mouseMoved(MouseEvent m){}
public void windowClosed(WindowEvent e){}
public void windowOpened(WindowEvent e){}
public void windowActivated(WindowEvent e){}
public void windowDeactivated(WindowEvent e){}
public void windowIconified(WindowEvent e){}
public void windowDeiconified(WindowEvent e){}
}


class CanvasEX extends Canvas
{
Point start = new Point(100,100);
Point cur = new Point(100,100);
Point end = new Point(100,100);
Image offscreen;
boolean erase = false;

public void update(Graphics g)
{
//This is adds the new stuff to the screen or erases the screen if erase is true
Graphics buffer;
if (offscreen == null)
{
offscreen = createImage(getWidth(), getHeight());
}
buffer = offscreen.getGraphics();
if (erase)
{
buffer.setColor(getBackground());
buffer.fillRect(0,0,800, 600);
buffer.dispose();
erase = false;
}
paint(buffer);
g.drawImage(offscreen, 0, 0, this);
}

public void paint(Graphics g)
{
Graphics buffer = g;
if (erase)
{
g.dispose();
erase = false;
}
g.setColor(E3G04.lineColor);
if (end.x > start.x && end.y > start.y)
g.fillRect(start.x,start.y, Math.abs(end.x-start.x),Math.abs(end.y-start.y));
if (end.x > start.x && end.y < start.y)
g.fillRect(start.x,end.y, Math.abs(end.x-start.x),Math.abs(end.y-start.y));
if (end.x < start.x && end.y > start.y)
g.fillRect(end.x, start.y, Math.abs(end.x-start.x),Math.abs(end.y-start.y));
if (end.x < start.x && end.y < start.y)
g.fillRect(end.x, end.y, Math.abs(end.x-start.x),Math.abs(end.y-start.y));
g.setColor(E3G04.fillColor);
if (end.x > start.x && end.y > start.y)
g.fillRect(start.x + E3G04.size,start.y + E3G04.size, Math.abs(end.x-start.x) - 2 * E3G04.size,Math.abs(end.y-start.y) - 2 * E3G04.size);
if (end.x > start.x && end.y < start.y)
g.fillRect(start.x + E3G04.size,end.y + E3G04.size, Math.abs(end.x-start.x) - 2 * E3G04.size,Math.abs(end.y-start.y) - 2 * E3G04.size);
if (end.x < start.x && end.y > start.y)
g.fillRect(end.x + E3G04.size, start.y + E3G04.size, Math.abs(end.x-start.x) - 2 * E3G04.size,Math.abs(end.y-start.y) - 2 * E3G04.size);
if (end.x < start.x && end.y < start.y)
g.fillRect(end.x + E3G04.size, end.y + E3G04.size, Math.abs(end.x-start.x) - 2 * E3G04.size,Math.abs(end.y-start.y) - 2 * E3G04.size);
}
}

最佳答案

如果您放弃了使用 AWT 的教授建议,请更改

class CanvasEX extends Canvas

..到..

class CanvasEX extends JPanel

&

public void paint(Graphics g)
{
..

public void paintComponent(Graphics g)
{
super.paintComponent(g);
..

然后您需要弄清楚如何让绘图持续存在。

关于java - JMenuItem仅由键盘输入触发,而不是点击,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13795696/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com