Issue
I am a beginner. That problem happen in java swing. I do not know what's wrong...
when I click paste in my simple app , the program pastes the text twice and I have no reason for that. I use Vs code to write code java and I use java 17 now.. with java swing how I fix it? and What happened? this is my Code :
import java.awt.event.*;
import java.awt.Font;
import javax.swing.*;
public class SimpleNotePad {
static JFrame frame = new JFrame(" AndWorld");
static Font newFont = new Font("Arail", Font.BOLD, 17);
static JTextArea textArea = new JTextArea();
static JScrollPane textAreaScrol = new JScrollPane(textArea);
static JPopupMenu popupMenu = new JPopupMenu();
public static void main(String[] args) {
makeFrame();
}
public static void makePopupMenu() {
JMenuItem cut = new JMenuItem("Cut");
JMenuItem copy = new JMenuItem("Copy");
JMenuItem paste = new JMenuItem("Paste");
JMenuItem selectAll = new JMenuItem("Select All");
cut.addActionListener(new ActionListener(){
@Override
public void actionPerformed(ActionEvent e) {
textArea.cut();
}
});
paste.addActionListener(new ActionListener(){
@Override
public void actionPerformed(ActionEvent e) {
textArea.paste();
}
});
copy.addActionListener(new ActionListener(){
@Override
public void actionPerformed(ActionEvent e) {
textArea.copy();
}
});
selectAll.addActionListener(new ActionListener(){
@Override
public void actionPerformed(ActionEvent e) {
textArea.selectAll();
}
});
paste.addActionListener(new ActionListener(){
@Override
public void actionPerformed(ActionEvent e) {
textArea.paste();
}
});
popupMenu.add(cut);
popupMenu.add(copy);
popupMenu.add(paste);
popupMenu.addSeparator();
popupMenu.add(selectAll);
}
public static void makeTextArea() {
textArea.setFont(newFont);
textArea.add(popupMenu);
textArea.addMouseListener(new MouseListener(){
@Override
public void mouseClicked(MouseEvent e) {
if(SwingUtilities.isRightMouseButton(e)) {
popupMenu.show(textArea, e.getX(), e.getY());
}
}
@Override
public void mousePressed(MouseEvent e) {
// TODO Auto-generated method stub
}
@Override
public void mouseReleased(MouseEvent e) {
// TODO Auto-generated method stub
}
@Override
public void mouseEntered(MouseEvent e) {
// TODO Auto-generated method stub
}
@Override
public void mouseExited(MouseEvent e) {
// TODO Auto-generated method stub
}
});
}
public static void makeFrame() {
makeTextArea();
makePopupMenu();
frame.add(textAreaScrol);
frame.setSize(600, 400);
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.setVisible(true);
}
}
Thanks for help me.
Solution
As explained in my comment you were adding an action listener twice so you get 2 responses for every action.
I also removed all static modifiers in the following mre:
import java.awt.*;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;
import javax.swing.*;
public class SimpleNotePad {
JFrame frame = new JFrame(" AndWorld");
Font newFont = new Font("Arail", Font.BOLD, 17);
JTextArea textArea = new JTextArea();
JScrollPane textAreaScrol = new JScrollPane(textArea);
JPopupMenu popupMenu = new JPopupMenu();
public static void main(String[] args) {
new SimpleNotePad().makeFrame();
}
public void makePopupMenu() {
JMenuItem cut = new JMenuItem("Cut");
JMenuItem copy = new JMenuItem("Copy");
JMenuItem paste = new JMenuItem("Paste");
JMenuItem selectAll = new JMenuItem("Select All");
cut.addActionListener(e -> textArea.cut());
paste.addActionListener(e -> textArea.paste());
copy.addActionListener(e -> textArea.copy());
selectAll.addActionListener(e -> textArea.selectAll());
//all you need to do is remove this redundant line
//paste.addActionListener(e -> textArea.paste());
popupMenu.add(cut);
popupMenu.add(copy);
popupMenu.add(paste);
popupMenu.addSeparator();
popupMenu.add(selectAll);
}
public void makeTextArea() {
textArea.setFont(newFont);
textArea.add(popupMenu);
textArea.addMouseListener(new MouseAdapter() {
@Override
public void mouseClicked(MouseEvent e) {
if(SwingUtilities.isRightMouseButton(e)) {
popupMenu.show(textArea, e.getX(), e.getY());
}
}
});
}
public void makeFrame() {
makeTextArea();
makePopupMenu();
frame.add(textAreaScrol);
frame.setSize(600, 400);
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.setVisible(true);
}
}
Answered By - c0der
Answer Checked By - Cary Denson (JavaFixing Admin)