gpt4 book ai didi

java - 如何让 JPanel 在调整面板大小时记住用户绘制的图形?

转载 作者:行者123 更新时间:2023-12-02 06:09:24 27 4
gpt4 key购买 nike

我正在尝试制作一个程序,允许用户在五线谱上放置音符。有一个名为 SheetMusicPane 的类扩展了 JPanel,它以一堆从上到下绘制的五线谱开始。通过单击顶部工具栏中的按钮,用户可以选择要绘制的注释。工具栏上还有一个按钮,允许用户增加可用的乐谱数量(SheetMusicPane 设置在 JScrollPane 内)。我不知道当用户调整 SheetMusicPane 大小时如何使音符复制。然而,最初的员工仍留在原地。

我尝试了 JPanel.repaint() 方法;它不起作用。

调整大小非常简单:

JButton moreMusicButton = new JButton("Get More Sheet Music");
tb.add(moreMusicButton);
moreMusicButton.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
smp.setPreferredSize(new Dimension(scrollSize.width, smp.getHeight() + moreMusicAmount));
smp.repaint();
}
});

如上所述,repaint() 没有执行任何操作。

提前致谢!

添加笔记绘图代码:

每个绘图按钮都会调用该方法(获取字符串“note”)来自按钮的 ActionCommand):

  public void getShape(final Graphics g, final String note) {
MouseListener[] listeners = this.getMouseListeners();
for (MouseListener ml : listeners) {
this.removeMouseListener(ml); //makes graphics stop drawing previous note
}
this.addMouseListener(new MouseListener() {
public void mousePressed(MouseEvent e) {
}
public void mouseReleased(MouseEvent e) {
}
public void mouseEntered(MouseEvent e) {
}
public void mouseExited(MouseEvent e) {
}
public void mouseClicked(MouseEvent e) {
Point p = MouseInfo.getPointerInfo().getLocation();
addShape(g, p.x, p.y, note);
int pitch = 12;
piano.playNote(pitch);
advance(1.0, piano);
try { addToFile(pitch, note);}
catch(FileNotFoundException fnfe) {}
catch(IOException ioe) {}
}
});
}

以下是面板本身的创建方式。它包含一组私有(private)嵌套类,并开始显示简单的、无音符的乐谱。

私有(private)类 SheetMusicPane 扩展了 JPanel {

  public SheetMusicPane() {
final Graphics g = this.getGraphics();
}

//paints staffs
public void paint(Graphics g) {
super.paintComponent(g);
for (int i = 0; (i - 1)*staffWidth < scrollSize.height + 100; i++) {
int y = paddingNorth + i*staffWidth;
Staff staff = new Staff(g, y, "treble");
}
}

public void paintComponent(Graphics g) {
super.paintComponent(g);
for (String note : noteList) {
addShape(g, 100, 200, note);
}
}

//takes in mouse info and calls addShape to draw notes on clicks
public void getShape(final Graphics g, final String note) { ... } //as shown above

//draws a note
private void addShape(Graphics g, int x, int y, String note) { ... }

private void addToFile(int pitch, String note) throws FileNotFoundException, IOException { ...//adds note info to a file }

//此时只制作了五线谱表 私有(private)类(class)员工{

  private Graphics g;
private int y;
private int[] pitches;

public Staff(Graphics g, int y, String cleff) { ...//draws the lines }

}

最佳答案

您需要重写Panel 的paintComponent 方法。您将要绘制的所有内容保存在数组(或列表)中,然后 PaintComponent 方法将绘制它们。 (每次重新绘制时)。

如果您在单击时绘制它们,则下次调用 repaint() 时,面板将被清除并使用 PaintComponent 方法重新绘制。您的绘图在面板上的长度与不调用 reapaint() 一样长。

关于java - 如何让 JPanel 在调整面板大小时记住用户绘制的图形?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22026606/

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