如果一列中有两个或更多贴纸,则不是您单击的每个贴纸都会响应它,显示带有按钮的 JToolBar
If there are two and more stickers in one column, not every sticker you click responds to it, showing the JToolBar with buttons
我正在尝试编写看板。但是,如果一列中有两个或更多贴纸,通常只有当您第一次单击该列中的一个贴纸时,才会显示带按钮的 JToolBar。
我还以为是坐标有问题,结果没找到。 StickerListener 响应事件,如果坐标正确,甚至打印“условие работает”,但 JToolBar 仍然不可见。
import java.awt.*;
import javax.swing.*;
public class Main {
public static void main(String[] args)
{
Window window = new Window();
}
}
import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
public class Window extends JFrame {
public JButton Edit;
public JButton Read;
public JButton Delete;
private Window window;
private JToolBar jtb;
public boolean stickerToolBarActivated;
public Window() {
window= this;
setSize(500, 500);
setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);
setLayout(new BorderLayout());
Desk d = new Desk();
createMenu(d);
add(d);
setDefaultSizeToProgressTypesColumns(d, this);
d.setBackground(new Color(255, 255, 255));
StickerListener sl = new StickerListener(d, this);
this.addMouseMotionListener(sl);
this.addMouseListener(sl);
this.addComponentListener(new ComponentListener() {
public void componentResized(ComponentEvent e) {
setDefaultSizeToProgressTypesColumns(d,window);
}
@Override
public void componentMoved(ComponentEvent e) {}
@Override
public void componentShown(ComponentEvent e) {}
@Override
public void componentHidden(ComponentEvent e) {}
});
jtb = new JToolBar();
Edit = new JButton("Редактровать");
jtb.add(Edit);
Delete = new JButton("Удалить");
jtb.add(Delete);
Read = new JButton("Просмотреть");
jtb.add(Read);
add(jtb, BorderLayout.NORTH);
jtb.setVisible(false);
stickerToolBarActivated=false;
setVisible(true);
}
private void createMenu(Desk d)
{
JMenuBar menuBar = new JMenuBar();
JMenu DeskFile = new JMenu("Файл");
JMenuItem SaveDesk = new JMenuItem("Сохранить доску");
DeskFile.add(SaveDesk);
menuBar.add(DeskFile);
JMenu StickerOptions = new JMenu("Стикер");
JMenuItem NewSticker = new JMenuItem("Добавить стикер");
NewSticker.addActionListener(new ActionListener()
{
@Override
public void actionPerformed(ActionEvent e) {
d.ProgressTypes.get(0).addSticker();
setDefaultSizeToProgressTypesColumns(d, window);
d.repaint();
}
});
StickerOptions.add(NewSticker);
menuBar.add(StickerOptions);
add(menuBar, BorderLayout.NORTH);
setJMenuBar(menuBar);
}
public JToolBar getStickerToolbar() {
return jtb;
}
public static void setDefaultSizeToProgressTypesColumns(Desk d, Window window)
{
int x=0;
int y=0;
int WindowWidth = window.getWidth();
int WindowHeight = window.getHeight();
int ptCount = d.ProgressTypes.size();
for(ProgressType pt: d.ProgressTypes)
{
pt.x=x;
pt.y=y;
pt.width= WindowWidth/ptCount;
pt.height = WindowHeight;
x+=pt.width;
for(int s=0; s<pt.stickers.size(); ++s) {
pt.stickers.get(s).setWidth(pt.width);
pt.stickers.get(s).setHeight(pt.width);
pt.stickers.get(s).y=pt.height/20+pt.width*s;
pt.stickers.get(s).x=pt.x;
}
}
}
public JButton getEdit() {
return Edit;
}
}
import javax.swing.*;
import java.awt.*;
import java.util.ArrayList;
public class Desk extends JPanel {
public ArrayList<ProgressType> ProgressTypes;
public int width;
public Desk()
{
ProgressTypes = new ArrayList<ProgressType>();
ProgressTypes.add(new ProgressType("Идеи"));
ProgressTypes.add(new ProgressType("Сделать"));
ProgressTypes.add(new ProgressType("В процессе"));
ProgressTypes.add(new ProgressType("Тестируется"));
ProgressTypes.add(new ProgressType("Готово"));
}
@Override
public void paint(Graphics g) {
super.paint(g);
for(ProgressType pt: ProgressTypes) {
pt.paint(g);
}
for(ProgressType pt: ProgressTypes)
for(Sticker s : pt.stickers)
s.paint(g);
}
}
import javax.swing.*;
import java.awt.*;
import java.util.ArrayList;
public class ProgressType extends JPanel {
public ArrayList<Sticker> stickers;
public String name;
public int x, y, width, height;
public ProgressType(String n)
{
this.name = n;
stickers = new ArrayList<>();
}
public void paint(Graphics g) {
Graphics2D g2d = (Graphics2D) g;
final BasicStroke borderLine = new BasicStroke(4.0f, BasicStroke.CAP_BUTT,
BasicStroke.JOIN_ROUND, 5.0f);
g2d.setStroke(borderLine);
g2d.setColor(Color.black);
g2d.drawLine(x, y, x+width, y);
g2d.drawLine(x, y, x, y+height);
g2d.drawLine(x, y+height/20, x+width, y+height/20); //height/20 это высота шапки таблицы
g2d.drawLine(x+width, y, x+width, y+height);
}
public int findSticker(String search) {
for(int i=0; i<stickers.size(); ++i)
{
if(stickers.get(i).title.matches(search))
return i;
}
return -1;
}
public void addSticker()
{
StickerBuilder sb = new StickerBuilder();
Sticker s = sb.getSticker();
s.y=(height/20)+(width*stickers.size())+5;
stickers.add(s);
repaint();
}
public void addSticker(Sticker s)
{
for(int i=0; i<stickers.size(); ++i)
{
stickers.get(i).y=s.y=(height/20)+(width*(i+1))+5*(i+1);
}
s.y=(height/20);
stickers.add(s);
}
}
import javax.imageio.ImageIO;
import javax.swing.*;
import java.awt.*;
import java.awt.image.BufferedImage;
import java.io.File;
import java.io.IOException;
import java.io.InputStream;
import java.net.URISyntaxException;
import java.net.URL;
import java.nio.file.Paths;
import java.util.ArrayList;
public class Sticker extends JPanel {
public String text;
private String Progress;
public String title;
private BufferedImage img;
public int x;
public int y;
public int width;
public int height;
public Sticker ( String text, String Progress,String title, int x, int y)
{
this.text=text;
this.Progress=Progress;
this.title = title;
this.x=x;
this.y=y;
this.width = -1;
this.height = -1;
try {
URL resource = Sticker.class.getResource("\transparentSticker.png");
img = null;
this.img = ImageIO.read(Paths.get(resource.toURI()).toFile());
System.out.println("c");
} catch (IOException | URISyntaxException e) {
System.out.println("caught");
}
}
public void setText(String text) {
this.text = text;
}
public void setProgress(String progress) {
Progress = progress;
}
public void setTitle(String title) {
this.title = title;
}
public void setWidth(int width){
this.width = width;
}
public void setHeight(int height) {
this.height = height;
}
public Sticker clone()
{
Sticker s= new Sticker(text, Progress, title, x, y);
s.setHeight(width);
s.setWidth(width);
return s;
}
@Override
public void paint(Graphics g) {
super.paint(g);
System.out.print("p");
g.drawImage(img, x, y, width-4, height, null);
String NormStr;
if(title!=null) {
NormStr = NormalizeLabel(title, g);
g.drawString(NormStr, x, y + width / 5);
}
if(text!=null) {
NormStr = NormalizeLabel(text, g);
FontMetrics fm = g.getFontMetrics(g.getFont());
int hgt = fm.getHeight();
String [] n=NormStr.split("\n");
for(int i= 0; i<n.length; ++i) {
g.drawString(n[i], x, y + width / 5 + hgt * 13 / 10 * (i + 1));
if(width / 5 + hgt * 13 / 10 * (i + 1)>=width*0.75)
{
g.drawString("...", x, y + width / 5 + hgt * 13 / 10 * (i + 1));
break;
}
}
}
}
private String NormalizeLabel(String s, Graphics g)
{
String NormalizedString = "";
String buf="";
FontMetrics fm = g.getFontMetrics(g.getFont());
int hgt= fm.getHeight();
int strw=0;
for(int i=0; i<s.length(); ++i)
{
buf+=s.charAt(i);
strw=fm.stringWidth(buf);
if(strw>=width*0.75)
{
NormalizedString+=buf;
NormalizedString+="\n";
buf="";
}
}
NormalizedString+=buf;
return NormalizedString;
}
}
import java.util.ArrayList;
public interface Builder {
void setText(String text);
void setProgress(String Progress);
void setTitle(String title);
Sticker getSticker();
}
import java.util.ArrayList;
public class StickerBuilder implements Builder{
public StickerBuilder() {
}
private String text;
private String Progress;
private String title;
public void setText(String text) {
this.text = text;
}
public void setProgress(String progress) {
Progress = progress;
}
public void setTitle(String title) {
this.title = title;
}
public Sticker getSticker()
{
return new Sticker(text, Progress, title, 0, 0);//возможно, стоит добавить функцию для х и у
}
}
import java.util.ArrayList;
import javax.swing.*;
import java.awt.*;
public class StickerChanger implements Builder {
private Sticker sticker;
public StickerChanger(Sticker sticker) {
this.sticker = sticker;
}
@Override
public void setText(String text) {
this.sticker.setText(text);
}
@Override
public void setProgress(String Progress) {
this.sticker.setProgress(Progress);
}
@Override
public void setTitle(String title) {
this.sticker.setTitle(title);
}
@Override
public Sticker getSticker() {
return null;
}
}
import javax.swing.*;
import java.awt.event.*;
import java.util.ArrayList;
public class StickerListener implements MouseMotionListener, MouseListener {
private ArrayList<ProgressType> PTs;
private boolean StickerIsBeingDragged;
private int DistanceToTheEndX;
private int DistanceToTheEndY;
private Sticker CurrentSticker;
private Desk d;
private Window window;
private boolean sd2;
private final int Y_DELTA=50;
private ActionListener del;
private ActionListener edit;
private ActionListener rd;
private StickerEditorWindow sew;
public StickerListener(Desk d, Window w)
{
this.d = d;
this.PTs=d.ProgressTypes;
this.DistanceToTheEndX=this.DistanceToTheEndY=0;
this.StickerIsBeingDragged = this.sd2=false;
this.window =w;
}
@Override
public void mouseDragged(MouseEvent e) {
if (StickerIsBeingDragged)
{
sd2=true;
CurrentSticker.x=e.getX()-DistanceToTheEndX;
CurrentSticker.y=e.getY()-DistanceToTheEndY;
System.out.println(CurrentSticker.x+" "+CurrentSticker.y+" "+e.getX()+" "+ e.getY()+" "+"dragged");
d.repaint();
}
}
@Override
public void mouseMoved(MouseEvent e) {
}
@Override
public void mouseClicked(MouseEvent e) {
boolean f = true;
if(e.getButton() == MouseEvent.BUTTON1)
for (ProgressType pt : PTs) {
for (Sticker s : pt.stickers) {
System.out.println((e.getX() >= s.x) + " " + (e.getX() <= (s.x + s.width))+ " " +
(e.getY()-Y_DELTA >= s.y ) + " " + (e.getY()-Y_DELTA <= (s.y + s.width)));
System.out.println(e.getX() + " "+ e.getY()+ " " + s.x+ " "+ s.y);
if (e.getX() >= s.x && e.getX() <= (s.x + s.width) &&
e.getY()-Y_DELTA >= s.y && e.getY()-Y_DELTA <= (s.y + s.width)) {
CurrentSticker = s;
f=false;
JToolBar jtb = window.getStickerToolbar();
jtb.setVisible(true);
System.out.println("условие работает");
window.stickerToolBarActivated = true;
setListeners(s, pt, jtb);
f = false;
//Sticker buf = (Sticker) CurrentSticker.clone();
//pt.addSticker(buf);
d.repaint();
} else {
window.getStickerToolbar().setVisible(false);
sew = null;
window.stickerToolBarActivated = false;
if(rd!=null)
{
window.Read.removeActionListener(rd);
rd = null;
}
if(del!=null)
{
window.Delete.removeActionListener(del);
del = null;
}
if(edit!=null)
{
window.Edit.removeActionListener(edit);
edit = null;
}
}
}
}
System.out.println(e.getX()+" "+ e.getY()+" "+"cliicked");
}
private void setListeners(Sticker s, ProgressType pt, JToolBar jtb) {
del = new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
int iRes = JOptionPane.showConfirmDialog(window, "Удалить этот стикер?", "",
JOptionPane.YES_NO_OPTION);
if (iRes == JOptionPane.YES_NO_OPTION) {
pt.stickers.remove(s);
jtb.setVisible(false);
d.repaint();
}
}
};
edit = new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
if (sew == null) {
createStickerEditorWindow(s);
}
}
};
rd = new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
StickerReadingWindow srw = new StickerReadingWindow(s);
}
};
window.Delete.addActionListener(del);
window.Edit.addActionListener(edit);
window.Read.addActionListener(rd);
}
@Override
public void mousePressed(MouseEvent e) {
if(e.getButton() == MouseEvent.BUTTON1)
for(ProgressType pt: PTs) {
for (Sticker s : pt.stickers) {
if (e.getX() >= s.x && e.getX() <= (s.x + s.width) &&
e.getY()-Y_DELTA >= s.y && e.getY()-Y_DELTA <= (s.y + s.width)) {
DistanceToTheEndX = e.getX()-s.x;
DistanceToTheEndY = e.getY()-s.y;
StickerIsBeingDragged = true;
CurrentSticker = s;
System.out.println(s.x+" "+s.y+" "+e.getX()+" "+ e.getY()+" "+"pressed");
}
}
}
}
private void createStickerEditorWindow(Sticker s)
{
DefaultListModel listModel = new DefaultListModel();
for (ProgressType pt: PTs)
listModel.addElement(pt.name);
sew = new StickerEditorWindow(s, listModel);
sew.addWindowListener(new WindowAdapter() {
public void windowClosing(WindowEvent e) {
sew=null;
d.repaint();
}
});
}
@Override
public void mouseReleased(MouseEvent e) {
if(StickerIsBeingDragged) {
if(sd2) {
System.out.println(CurrentSticker.x + " " + CurrentSticker.y + " " + e.getX() + " " + e.getY() + " " + "released");
StickerIsBeingDragged = false;
d.repaint();
if (CurrentSticker.x < 0)
CurrentSticker.x = 0;
else if (CurrentSticker.x > window.getWidth())
CurrentSticker.x = window.getWidth() - 15;
for (ProgressType pt : PTs) {
if (CurrentSticker.x >= pt.x && CurrentSticker.x < pt.x + pt.width && CurrentSticker.x >= 0) {
CurrentSticker.x = pt.x;
Sticker buf = (Sticker) CurrentSticker.clone();
pt.addSticker(buf);
}
if (pt.stickers.indexOf(CurrentSticker) != -1) {
pt.stickers.remove(CurrentSticker);
}
}
sd2=false;
d.repaint();
}
}
}
@Override
public void mouseEntered(MouseEvent e) {
}
@Override
public void mouseExited(MouseEvent e) {
}
}
import javax.swing.*;
import java.awt.*;
import java.awt.event.WindowAdapter;
import java.awt.event.WindowEvent;
import java.util.ArrayList;
public class StickerEditorWindow extends JFrame {
private Sticker sticker;
private JTextField title;
private JTextArea text;
private JList ProgressTypes;
private JButton Save;
private JButton DelayTitleChanges;
private JButton DelayTextChanges;
private JButton DelayProgressTypeChanges;
private DefaultListModel listModel;
public StickerEditorWindow(Sticker s, DefaultListModel lm) {
this.sticker = s;
setSize(600,300);
setTitle("Редактировать стикер");
setAlwaysOnTop(true);
// setDefaultCloseOperation(DISPOSE_ON_CLOSE);
setLayout(new GridBagLayout());
GridBagConstraints gbc = new GridBagConstraints(
0, 0,
1, 1,
4, 0,
GridBagConstraints.CENTER,
GridBagConstraints.BOTH,
new Insets(5, 5, 5, 5),
0, 0
);
title = new JTextField("Тема");
text = new JTextArea("Введите текст");
this.listModel = lm;
ProgressTypes = new JList(listModel);
this.add(title, gbc);
++gbc.gridy;
gbc.weighty=4;
this.add(text, gbc);
this.add(new JScrollPane(text), gbc);
gbc.weighty=0;
++gbc.gridy;
this.add(ProgressTypes, gbc);
ProgressTypes.setFocusable(false);
this.add(new JScrollPane(ProgressTypes), gbc);
ProgressTypes.setVisible(true);
Save = new JButton("Cохранить");
DelayTitleChanges = new JButton("Отменить изм. темы");
DelayTextChanges = new JButton("Отменить изм. текста");
DelayProgressTypeChanges = new JButton("Отменить изм. колонки прогресса");
gbc.gridx=1;
gbc.weightx=1;
gbc.gridy = 3;
this.add(Save, gbc);
gbc.gridy = 0;
this.add(DelayTitleChanges, gbc);
gbc.gridy = 1;
gbc.weighty=4;
this.add(DelayTextChanges, gbc);
gbc.gridy = 2;
this.add(DelayProgressTypeChanges, gbc);
if(sticker.text!=null) {
text.setText(sticker.text);
}
if(sticker.title!=null)
title.setText(sticker.title);
setListeners();
setVisible(true);
}
private void setListeners()
{
StickerEditorWindow w = this;
this.Save.addActionListener(new StickerChangeListener(w, this.Save));
this.DelayProgressTypeChanges.addActionListener(new StickerChangeListener(w, this.DelayProgressTypeChanges));
this.DelayTitleChanges.addActionListener(new StickerChangeListener(w, this.DelayTitleChanges));
this.DelayTextChanges.addActionListener(new StickerChangeListener(w, this.DelayTextChanges));
}
public void SaveStickerChanges()
{
sticker.title=title.getText();
sticker.text = text.getText();
}
public void CancelTitleChanges()
{
title.setText(sticker.title);
}
public void CancelTextChanges()
{
text.setText(sticker.text);
}
}
import javax.swing.*;
import javax.swing.plaf.basic.BasicOptionPaneUI;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
public class StickerChangeListener implements ActionListener {
private StickerEditorWindow sew;
private JButton sender;
public StickerChangeListener(StickerEditorWindow sew, JButton sender) {
this.sew = sew;
this.sender = sender;
}
@Override
public void actionPerformed(ActionEvent e) {
if(sender.getText().equals("Cохранить")){
sew.SaveStickerChanges();
}
if(sender.getText().equals("Отменить изм. темы")){
sew.CancelTitleChanges();
}
if(sender.getText().equals("Отменить изм. текста")){
sew.CancelTextChanges();
}
if(sender.getText().equals("Отменить изм. колонки прогресса")){}
}
}
import javax.imageio.ImageIO;
import javax.swing.*;
import java.awt.*;
import java.awt.image.BufferedImage;
import java.io.IOException;
import java.net.URISyntaxException;
import java.net.URL;
import java.nio.file.Paths;
public class StickerReadingWindow extends JFrame{
private Sticker sticker;
private int width;
private int height;
ReadingCrutch rc;
public StickerReadingWindow(Sticker s) throws HeadlessException {
this.sticker = s;
width=height=500;
String winHeader = "";
if(sticker.title!=null)
winHeader+="Тема: "+sticker.title+ " ";
setTitle(winHeader);
setDefaultCloseOperation(DISPOSE_ON_CLOSE);
JPanel jp = new JPanel();
add(jp);
Graphics g =jp.getGraphics();
setSize(width,height);
setTitle("Редактировать стикер");
setAlwaysOnTop(true);
BufferedImage img = null;
try {
URL resource = Sticker.class.getResource("\transparentSticker.png");
img = ImageIO.read(Paths.get(resource.toURI()).toFile());
System.out.println("c");
} catch (IOException | URISyntaxException e) {
System.out.println("caught");
}
if(img!=null)
rc = new ReadingCrutch(img, sticker.text, width);
add(rc);
setVisible(true);
}
}
import javax.swing.*;
import java.awt.*;
import java.awt.image.BufferedImage;
public class ReadingCrutch extends JPanel {
private BufferedImage img;
private String str;
private int width;
public ReadingCrutch(BufferedImage img, String str, int w) {
this.img = img;
this.str = str;
this.width =w;
}
@Override
public void paint(Graphics g) {
super.paint(g);
g.drawImage(img, 0, 0, 450, 450, null);
g.setColor(Color.black);
String txt = str;
String [] s=txt.split(" ");
String buf= "";
String NormalizedString="";
FontMetrics fm = g.getFontMetrics(g.getFont());
int hgt= fm.getHeight();
int strw=0;
for(int i=0; i<s.length; ++i)
{
buf+=s[i]+" ";
strw=fm.stringWidth(buf);
if(strw>=width*0.75)
{
NormalizedString+=buf;
NormalizedString+="\n";
buf="";
}
}
NormalizedString+=buf;
g.setColor(Color.black);
String[] forWrite= NormalizedString.split("\n");
for(int i=0; i<forWrite.length; ++i)
{
g.drawString(forWrite[i]+" ", 0, 0 + width / 5 + hgt * 13 / 10 * (i + 1));
}
}
}
问题出在StickerListener.mouseClicked()
的控制流程上:你搜索贴纸找到被点击的那个。
由于 if
/ else
你为每个没有被点击的标签重置了工具栏,这意味着你的代码只有在你点击最后一个标签时才有效(按迭代顺序) ).
如果您将代码从循环之前的 else
部分移动(以便它只执行一次),您的代码将起作用:
@Override
public void mouseClicked(MouseEvent e) {
if(e.getButton() == MouseEvent.BUTTON1) {
window.getStickerToolbar().setVisible(false);
sew = null;
window.stickerToolBarActivated = false;
if (rd != null) {
window.Read.removeActionListener(rd);
rd = null;
}
if (del != null) {
window.Delete.removeActionListener(del);
del = null;
}
if (edit != null) {
window.Edit.removeActionListener(edit);
edit = null;
}
for (ProgressType pt : PTs) {
for (Sticker s : pt.stickers) {
System.out.println((e.getX() >= s.x) + " " + (e.getX() <= (s.x + s.width)) + " " +
(e.getY() - Y_DELTA >= s.y) + " " + (e.getY() - Y_DELTA <= (s.y + s.width)));
System.out.println(e.getX() + " " + e.getY() + " " + s.x + " " + s.y);
if (e.getX() >= s.x && e.getX() <= (s.x + s.width) &&
e.getY() - Y_DELTA >= s.y && e.getY() - Y_DELTA <= (s.y + s.width)) {
CurrentSticker = s;
JToolBar jtb = window.getStickerToolbar();
jtb.setVisible(true);
System.out.println("условие работает");
window.stickerToolBarActivated = true;
setListeners(s, pt, jtb);
//Sticker buf = (Sticker) CurrentSticker.clone();
//pt.addSticker(buf);
d.repaint();
return;
}
}
}
}
System.out.println(e.getX()+" "+ e.getY()+" "+"cliicked");
}
我正在尝试编写看板。但是,如果一列中有两个或更多贴纸,通常只有当您第一次单击该列中的一个贴纸时,才会显示带按钮的 JToolBar。 我还以为是坐标有问题,结果没找到。 StickerListener 响应事件,如果坐标正确,甚至打印“условие работает”,但 JToolBar 仍然不可见。
import java.awt.*;
import javax.swing.*;
public class Main {
public static void main(String[] args)
{
Window window = new Window();
}
}
import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
public class Window extends JFrame {
public JButton Edit;
public JButton Read;
public JButton Delete;
private Window window;
private JToolBar jtb;
public boolean stickerToolBarActivated;
public Window() {
window= this;
setSize(500, 500);
setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);
setLayout(new BorderLayout());
Desk d = new Desk();
createMenu(d);
add(d);
setDefaultSizeToProgressTypesColumns(d, this);
d.setBackground(new Color(255, 255, 255));
StickerListener sl = new StickerListener(d, this);
this.addMouseMotionListener(sl);
this.addMouseListener(sl);
this.addComponentListener(new ComponentListener() {
public void componentResized(ComponentEvent e) {
setDefaultSizeToProgressTypesColumns(d,window);
}
@Override
public void componentMoved(ComponentEvent e) {}
@Override
public void componentShown(ComponentEvent e) {}
@Override
public void componentHidden(ComponentEvent e) {}
});
jtb = new JToolBar();
Edit = new JButton("Редактровать");
jtb.add(Edit);
Delete = new JButton("Удалить");
jtb.add(Delete);
Read = new JButton("Просмотреть");
jtb.add(Read);
add(jtb, BorderLayout.NORTH);
jtb.setVisible(false);
stickerToolBarActivated=false;
setVisible(true);
}
private void createMenu(Desk d)
{
JMenuBar menuBar = new JMenuBar();
JMenu DeskFile = new JMenu("Файл");
JMenuItem SaveDesk = new JMenuItem("Сохранить доску");
DeskFile.add(SaveDesk);
menuBar.add(DeskFile);
JMenu StickerOptions = new JMenu("Стикер");
JMenuItem NewSticker = new JMenuItem("Добавить стикер");
NewSticker.addActionListener(new ActionListener()
{
@Override
public void actionPerformed(ActionEvent e) {
d.ProgressTypes.get(0).addSticker();
setDefaultSizeToProgressTypesColumns(d, window);
d.repaint();
}
});
StickerOptions.add(NewSticker);
menuBar.add(StickerOptions);
add(menuBar, BorderLayout.NORTH);
setJMenuBar(menuBar);
}
public JToolBar getStickerToolbar() {
return jtb;
}
public static void setDefaultSizeToProgressTypesColumns(Desk d, Window window)
{
int x=0;
int y=0;
int WindowWidth = window.getWidth();
int WindowHeight = window.getHeight();
int ptCount = d.ProgressTypes.size();
for(ProgressType pt: d.ProgressTypes)
{
pt.x=x;
pt.y=y;
pt.width= WindowWidth/ptCount;
pt.height = WindowHeight;
x+=pt.width;
for(int s=0; s<pt.stickers.size(); ++s) {
pt.stickers.get(s).setWidth(pt.width);
pt.stickers.get(s).setHeight(pt.width);
pt.stickers.get(s).y=pt.height/20+pt.width*s;
pt.stickers.get(s).x=pt.x;
}
}
}
public JButton getEdit() {
return Edit;
}
}
import javax.swing.*;
import java.awt.*;
import java.util.ArrayList;
public class Desk extends JPanel {
public ArrayList<ProgressType> ProgressTypes;
public int width;
public Desk()
{
ProgressTypes = new ArrayList<ProgressType>();
ProgressTypes.add(new ProgressType("Идеи"));
ProgressTypes.add(new ProgressType("Сделать"));
ProgressTypes.add(new ProgressType("В процессе"));
ProgressTypes.add(new ProgressType("Тестируется"));
ProgressTypes.add(new ProgressType("Готово"));
}
@Override
public void paint(Graphics g) {
super.paint(g);
for(ProgressType pt: ProgressTypes) {
pt.paint(g);
}
for(ProgressType pt: ProgressTypes)
for(Sticker s : pt.stickers)
s.paint(g);
}
}
import javax.swing.*;
import java.awt.*;
import java.util.ArrayList;
public class ProgressType extends JPanel {
public ArrayList<Sticker> stickers;
public String name;
public int x, y, width, height;
public ProgressType(String n)
{
this.name = n;
stickers = new ArrayList<>();
}
public void paint(Graphics g) {
Graphics2D g2d = (Graphics2D) g;
final BasicStroke borderLine = new BasicStroke(4.0f, BasicStroke.CAP_BUTT,
BasicStroke.JOIN_ROUND, 5.0f);
g2d.setStroke(borderLine);
g2d.setColor(Color.black);
g2d.drawLine(x, y, x+width, y);
g2d.drawLine(x, y, x, y+height);
g2d.drawLine(x, y+height/20, x+width, y+height/20); //height/20 это высота шапки таблицы
g2d.drawLine(x+width, y, x+width, y+height);
}
public int findSticker(String search) {
for(int i=0; i<stickers.size(); ++i)
{
if(stickers.get(i).title.matches(search))
return i;
}
return -1;
}
public void addSticker()
{
StickerBuilder sb = new StickerBuilder();
Sticker s = sb.getSticker();
s.y=(height/20)+(width*stickers.size())+5;
stickers.add(s);
repaint();
}
public void addSticker(Sticker s)
{
for(int i=0; i<stickers.size(); ++i)
{
stickers.get(i).y=s.y=(height/20)+(width*(i+1))+5*(i+1);
}
s.y=(height/20);
stickers.add(s);
}
}
import javax.imageio.ImageIO;
import javax.swing.*;
import java.awt.*;
import java.awt.image.BufferedImage;
import java.io.File;
import java.io.IOException;
import java.io.InputStream;
import java.net.URISyntaxException;
import java.net.URL;
import java.nio.file.Paths;
import java.util.ArrayList;
public class Sticker extends JPanel {
public String text;
private String Progress;
public String title;
private BufferedImage img;
public int x;
public int y;
public int width;
public int height;
public Sticker ( String text, String Progress,String title, int x, int y)
{
this.text=text;
this.Progress=Progress;
this.title = title;
this.x=x;
this.y=y;
this.width = -1;
this.height = -1;
try {
URL resource = Sticker.class.getResource("\transparentSticker.png");
img = null;
this.img = ImageIO.read(Paths.get(resource.toURI()).toFile());
System.out.println("c");
} catch (IOException | URISyntaxException e) {
System.out.println("caught");
}
}
public void setText(String text) {
this.text = text;
}
public void setProgress(String progress) {
Progress = progress;
}
public void setTitle(String title) {
this.title = title;
}
public void setWidth(int width){
this.width = width;
}
public void setHeight(int height) {
this.height = height;
}
public Sticker clone()
{
Sticker s= new Sticker(text, Progress, title, x, y);
s.setHeight(width);
s.setWidth(width);
return s;
}
@Override
public void paint(Graphics g) {
super.paint(g);
System.out.print("p");
g.drawImage(img, x, y, width-4, height, null);
String NormStr;
if(title!=null) {
NormStr = NormalizeLabel(title, g);
g.drawString(NormStr, x, y + width / 5);
}
if(text!=null) {
NormStr = NormalizeLabel(text, g);
FontMetrics fm = g.getFontMetrics(g.getFont());
int hgt = fm.getHeight();
String [] n=NormStr.split("\n");
for(int i= 0; i<n.length; ++i) {
g.drawString(n[i], x, y + width / 5 + hgt * 13 / 10 * (i + 1));
if(width / 5 + hgt * 13 / 10 * (i + 1)>=width*0.75)
{
g.drawString("...", x, y + width / 5 + hgt * 13 / 10 * (i + 1));
break;
}
}
}
}
private String NormalizeLabel(String s, Graphics g)
{
String NormalizedString = "";
String buf="";
FontMetrics fm = g.getFontMetrics(g.getFont());
int hgt= fm.getHeight();
int strw=0;
for(int i=0; i<s.length(); ++i)
{
buf+=s.charAt(i);
strw=fm.stringWidth(buf);
if(strw>=width*0.75)
{
NormalizedString+=buf;
NormalizedString+="\n";
buf="";
}
}
NormalizedString+=buf;
return NormalizedString;
}
}
import java.util.ArrayList;
public interface Builder {
void setText(String text);
void setProgress(String Progress);
void setTitle(String title);
Sticker getSticker();
}
import java.util.ArrayList;
public class StickerBuilder implements Builder{
public StickerBuilder() {
}
private String text;
private String Progress;
private String title;
public void setText(String text) {
this.text = text;
}
public void setProgress(String progress) {
Progress = progress;
}
public void setTitle(String title) {
this.title = title;
}
public Sticker getSticker()
{
return new Sticker(text, Progress, title, 0, 0);//возможно, стоит добавить функцию для х и у
}
}
import java.util.ArrayList;
import javax.swing.*;
import java.awt.*;
public class StickerChanger implements Builder {
private Sticker sticker;
public StickerChanger(Sticker sticker) {
this.sticker = sticker;
}
@Override
public void setText(String text) {
this.sticker.setText(text);
}
@Override
public void setProgress(String Progress) {
this.sticker.setProgress(Progress);
}
@Override
public void setTitle(String title) {
this.sticker.setTitle(title);
}
@Override
public Sticker getSticker() {
return null;
}
}
import javax.swing.*;
import java.awt.event.*;
import java.util.ArrayList;
public class StickerListener implements MouseMotionListener, MouseListener {
private ArrayList<ProgressType> PTs;
private boolean StickerIsBeingDragged;
private int DistanceToTheEndX;
private int DistanceToTheEndY;
private Sticker CurrentSticker;
private Desk d;
private Window window;
private boolean sd2;
private final int Y_DELTA=50;
private ActionListener del;
private ActionListener edit;
private ActionListener rd;
private StickerEditorWindow sew;
public StickerListener(Desk d, Window w)
{
this.d = d;
this.PTs=d.ProgressTypes;
this.DistanceToTheEndX=this.DistanceToTheEndY=0;
this.StickerIsBeingDragged = this.sd2=false;
this.window =w;
}
@Override
public void mouseDragged(MouseEvent e) {
if (StickerIsBeingDragged)
{
sd2=true;
CurrentSticker.x=e.getX()-DistanceToTheEndX;
CurrentSticker.y=e.getY()-DistanceToTheEndY;
System.out.println(CurrentSticker.x+" "+CurrentSticker.y+" "+e.getX()+" "+ e.getY()+" "+"dragged");
d.repaint();
}
}
@Override
public void mouseMoved(MouseEvent e) {
}
@Override
public void mouseClicked(MouseEvent e) {
boolean f = true;
if(e.getButton() == MouseEvent.BUTTON1)
for (ProgressType pt : PTs) {
for (Sticker s : pt.stickers) {
System.out.println((e.getX() >= s.x) + " " + (e.getX() <= (s.x + s.width))+ " " +
(e.getY()-Y_DELTA >= s.y ) + " " + (e.getY()-Y_DELTA <= (s.y + s.width)));
System.out.println(e.getX() + " "+ e.getY()+ " " + s.x+ " "+ s.y);
if (e.getX() >= s.x && e.getX() <= (s.x + s.width) &&
e.getY()-Y_DELTA >= s.y && e.getY()-Y_DELTA <= (s.y + s.width)) {
CurrentSticker = s;
f=false;
JToolBar jtb = window.getStickerToolbar();
jtb.setVisible(true);
System.out.println("условие работает");
window.stickerToolBarActivated = true;
setListeners(s, pt, jtb);
f = false;
//Sticker buf = (Sticker) CurrentSticker.clone();
//pt.addSticker(buf);
d.repaint();
} else {
window.getStickerToolbar().setVisible(false);
sew = null;
window.stickerToolBarActivated = false;
if(rd!=null)
{
window.Read.removeActionListener(rd);
rd = null;
}
if(del!=null)
{
window.Delete.removeActionListener(del);
del = null;
}
if(edit!=null)
{
window.Edit.removeActionListener(edit);
edit = null;
}
}
}
}
System.out.println(e.getX()+" "+ e.getY()+" "+"cliicked");
}
private void setListeners(Sticker s, ProgressType pt, JToolBar jtb) {
del = new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
int iRes = JOptionPane.showConfirmDialog(window, "Удалить этот стикер?", "",
JOptionPane.YES_NO_OPTION);
if (iRes == JOptionPane.YES_NO_OPTION) {
pt.stickers.remove(s);
jtb.setVisible(false);
d.repaint();
}
}
};
edit = new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
if (sew == null) {
createStickerEditorWindow(s);
}
}
};
rd = new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
StickerReadingWindow srw = new StickerReadingWindow(s);
}
};
window.Delete.addActionListener(del);
window.Edit.addActionListener(edit);
window.Read.addActionListener(rd);
}
@Override
public void mousePressed(MouseEvent e) {
if(e.getButton() == MouseEvent.BUTTON1)
for(ProgressType pt: PTs) {
for (Sticker s : pt.stickers) {
if (e.getX() >= s.x && e.getX() <= (s.x + s.width) &&
e.getY()-Y_DELTA >= s.y && e.getY()-Y_DELTA <= (s.y + s.width)) {
DistanceToTheEndX = e.getX()-s.x;
DistanceToTheEndY = e.getY()-s.y;
StickerIsBeingDragged = true;
CurrentSticker = s;
System.out.println(s.x+" "+s.y+" "+e.getX()+" "+ e.getY()+" "+"pressed");
}
}
}
}
private void createStickerEditorWindow(Sticker s)
{
DefaultListModel listModel = new DefaultListModel();
for (ProgressType pt: PTs)
listModel.addElement(pt.name);
sew = new StickerEditorWindow(s, listModel);
sew.addWindowListener(new WindowAdapter() {
public void windowClosing(WindowEvent e) {
sew=null;
d.repaint();
}
});
}
@Override
public void mouseReleased(MouseEvent e) {
if(StickerIsBeingDragged) {
if(sd2) {
System.out.println(CurrentSticker.x + " " + CurrentSticker.y + " " + e.getX() + " " + e.getY() + " " + "released");
StickerIsBeingDragged = false;
d.repaint();
if (CurrentSticker.x < 0)
CurrentSticker.x = 0;
else if (CurrentSticker.x > window.getWidth())
CurrentSticker.x = window.getWidth() - 15;
for (ProgressType pt : PTs) {
if (CurrentSticker.x >= pt.x && CurrentSticker.x < pt.x + pt.width && CurrentSticker.x >= 0) {
CurrentSticker.x = pt.x;
Sticker buf = (Sticker) CurrentSticker.clone();
pt.addSticker(buf);
}
if (pt.stickers.indexOf(CurrentSticker) != -1) {
pt.stickers.remove(CurrentSticker);
}
}
sd2=false;
d.repaint();
}
}
}
@Override
public void mouseEntered(MouseEvent e) {
}
@Override
public void mouseExited(MouseEvent e) {
}
}
import javax.swing.*;
import java.awt.*;
import java.awt.event.WindowAdapter;
import java.awt.event.WindowEvent;
import java.util.ArrayList;
public class StickerEditorWindow extends JFrame {
private Sticker sticker;
private JTextField title;
private JTextArea text;
private JList ProgressTypes;
private JButton Save;
private JButton DelayTitleChanges;
private JButton DelayTextChanges;
private JButton DelayProgressTypeChanges;
private DefaultListModel listModel;
public StickerEditorWindow(Sticker s, DefaultListModel lm) {
this.sticker = s;
setSize(600,300);
setTitle("Редактировать стикер");
setAlwaysOnTop(true);
// setDefaultCloseOperation(DISPOSE_ON_CLOSE);
setLayout(new GridBagLayout());
GridBagConstraints gbc = new GridBagConstraints(
0, 0,
1, 1,
4, 0,
GridBagConstraints.CENTER,
GridBagConstraints.BOTH,
new Insets(5, 5, 5, 5),
0, 0
);
title = new JTextField("Тема");
text = new JTextArea("Введите текст");
this.listModel = lm;
ProgressTypes = new JList(listModel);
this.add(title, gbc);
++gbc.gridy;
gbc.weighty=4;
this.add(text, gbc);
this.add(new JScrollPane(text), gbc);
gbc.weighty=0;
++gbc.gridy;
this.add(ProgressTypes, gbc);
ProgressTypes.setFocusable(false);
this.add(new JScrollPane(ProgressTypes), gbc);
ProgressTypes.setVisible(true);
Save = new JButton("Cохранить");
DelayTitleChanges = new JButton("Отменить изм. темы");
DelayTextChanges = new JButton("Отменить изм. текста");
DelayProgressTypeChanges = new JButton("Отменить изм. колонки прогресса");
gbc.gridx=1;
gbc.weightx=1;
gbc.gridy = 3;
this.add(Save, gbc);
gbc.gridy = 0;
this.add(DelayTitleChanges, gbc);
gbc.gridy = 1;
gbc.weighty=4;
this.add(DelayTextChanges, gbc);
gbc.gridy = 2;
this.add(DelayProgressTypeChanges, gbc);
if(sticker.text!=null) {
text.setText(sticker.text);
}
if(sticker.title!=null)
title.setText(sticker.title);
setListeners();
setVisible(true);
}
private void setListeners()
{
StickerEditorWindow w = this;
this.Save.addActionListener(new StickerChangeListener(w, this.Save));
this.DelayProgressTypeChanges.addActionListener(new StickerChangeListener(w, this.DelayProgressTypeChanges));
this.DelayTitleChanges.addActionListener(new StickerChangeListener(w, this.DelayTitleChanges));
this.DelayTextChanges.addActionListener(new StickerChangeListener(w, this.DelayTextChanges));
}
public void SaveStickerChanges()
{
sticker.title=title.getText();
sticker.text = text.getText();
}
public void CancelTitleChanges()
{
title.setText(sticker.title);
}
public void CancelTextChanges()
{
text.setText(sticker.text);
}
}
import javax.swing.*;
import javax.swing.plaf.basic.BasicOptionPaneUI;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
public class StickerChangeListener implements ActionListener {
private StickerEditorWindow sew;
private JButton sender;
public StickerChangeListener(StickerEditorWindow sew, JButton sender) {
this.sew = sew;
this.sender = sender;
}
@Override
public void actionPerformed(ActionEvent e) {
if(sender.getText().equals("Cохранить")){
sew.SaveStickerChanges();
}
if(sender.getText().equals("Отменить изм. темы")){
sew.CancelTitleChanges();
}
if(sender.getText().equals("Отменить изм. текста")){
sew.CancelTextChanges();
}
if(sender.getText().equals("Отменить изм. колонки прогресса")){}
}
}
import javax.imageio.ImageIO;
import javax.swing.*;
import java.awt.*;
import java.awt.image.BufferedImage;
import java.io.IOException;
import java.net.URISyntaxException;
import java.net.URL;
import java.nio.file.Paths;
public class StickerReadingWindow extends JFrame{
private Sticker sticker;
private int width;
private int height;
ReadingCrutch rc;
public StickerReadingWindow(Sticker s) throws HeadlessException {
this.sticker = s;
width=height=500;
String winHeader = "";
if(sticker.title!=null)
winHeader+="Тема: "+sticker.title+ " ";
setTitle(winHeader);
setDefaultCloseOperation(DISPOSE_ON_CLOSE);
JPanel jp = new JPanel();
add(jp);
Graphics g =jp.getGraphics();
setSize(width,height);
setTitle("Редактировать стикер");
setAlwaysOnTop(true);
BufferedImage img = null;
try {
URL resource = Sticker.class.getResource("\transparentSticker.png");
img = ImageIO.read(Paths.get(resource.toURI()).toFile());
System.out.println("c");
} catch (IOException | URISyntaxException e) {
System.out.println("caught");
}
if(img!=null)
rc = new ReadingCrutch(img, sticker.text, width);
add(rc);
setVisible(true);
}
}
import javax.swing.*;
import java.awt.*;
import java.awt.image.BufferedImage;
public class ReadingCrutch extends JPanel {
private BufferedImage img;
private String str;
private int width;
public ReadingCrutch(BufferedImage img, String str, int w) {
this.img = img;
this.str = str;
this.width =w;
}
@Override
public void paint(Graphics g) {
super.paint(g);
g.drawImage(img, 0, 0, 450, 450, null);
g.setColor(Color.black);
String txt = str;
String [] s=txt.split(" ");
String buf= "";
String NormalizedString="";
FontMetrics fm = g.getFontMetrics(g.getFont());
int hgt= fm.getHeight();
int strw=0;
for(int i=0; i<s.length; ++i)
{
buf+=s[i]+" ";
strw=fm.stringWidth(buf);
if(strw>=width*0.75)
{
NormalizedString+=buf;
NormalizedString+="\n";
buf="";
}
}
NormalizedString+=buf;
g.setColor(Color.black);
String[] forWrite= NormalizedString.split("\n");
for(int i=0; i<forWrite.length; ++i)
{
g.drawString(forWrite[i]+" ", 0, 0 + width / 5 + hgt * 13 / 10 * (i + 1));
}
}
}
问题出在StickerListener.mouseClicked()
的控制流程上:你搜索贴纸找到被点击的那个。
由于 if
/ else
你为每个没有被点击的标签重置了工具栏,这意味着你的代码只有在你点击最后一个标签时才有效(按迭代顺序) ).
如果您将代码从循环之前的 else
部分移动(以便它只执行一次),您的代码将起作用:
@Override
public void mouseClicked(MouseEvent e) {
if(e.getButton() == MouseEvent.BUTTON1) {
window.getStickerToolbar().setVisible(false);
sew = null;
window.stickerToolBarActivated = false;
if (rd != null) {
window.Read.removeActionListener(rd);
rd = null;
}
if (del != null) {
window.Delete.removeActionListener(del);
del = null;
}
if (edit != null) {
window.Edit.removeActionListener(edit);
edit = null;
}
for (ProgressType pt : PTs) {
for (Sticker s : pt.stickers) {
System.out.println((e.getX() >= s.x) + " " + (e.getX() <= (s.x + s.width)) + " " +
(e.getY() - Y_DELTA >= s.y) + " " + (e.getY() - Y_DELTA <= (s.y + s.width)));
System.out.println(e.getX() + " " + e.getY() + " " + s.x + " " + s.y);
if (e.getX() >= s.x && e.getX() <= (s.x + s.width) &&
e.getY() - Y_DELTA >= s.y && e.getY() - Y_DELTA <= (s.y + s.width)) {
CurrentSticker = s;
JToolBar jtb = window.getStickerToolbar();
jtb.setVisible(true);
System.out.println("условие работает");
window.stickerToolBarActivated = true;
setListeners(s, pt, jtb);
//Sticker buf = (Sticker) CurrentSticker.clone();
//pt.addSticker(buf);
d.repaint();
return;
}
}
}
}
System.out.println(e.getX()+" "+ e.getY()+" "+"cliicked");
}