gpt4 book ai didi

java - 一个乐谱软件中JPanel添加Graphics的正确方法

转载 作者:塔克拉玛干 更新时间:2023-11-01 22:40:43 24 4
gpt4 key购买 nike

我一直在开发一款乐谱软件,我想用它来训练我的音乐学生视奏。

我想知道我采用的方法是否正确,或者是否有更好的方法。

我已经设法使用支持音乐符号的 unicode 和字体制作谱号、音符和五线谱对象,使用如下代码:

public static void spaceStaff(Graphics g){
Graphics2D g2 = (Graphics2D) g;
g2.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON);
Font font = new Font("Bravura", Font.PLAIN, 32);
g2.setFont(font);
g2.drawString("\uD834\uDD1A", note.spacing-2, staffDistance);
note.spacing = note.spacing + 16;
}

然后我有一个名为 Surface 的类,它将笔记绘制到 JPanel 上:

public class Surface extends JPanel {
@Override
public void paintComponent(Graphics g){
super.paintComponent(g);
staff.spaceStaff(g);
clef.drawGclef(g);//not given in example code above
note.drawCrotchet(g, note.B1);//not given in example code above
}
}

我正在使用此代码启动应用程序并显示音符:

public class SightreadHelper extends JFrame {

public SightreadHelper(){
initUI();
}

private void initUI() {

JButton button = new JButton("add notes"); //explanation for this button below
button.setSize(150, 75);
button.setVisible(true);
add( button );

button.addActionListener( new ActionListener()
{
public void actionPerformed(ActionEvent e)
{
repaint();//this doesn't work as I expect: explanation below
}
});

Surface srf = new Surface();
add(new Surface());
setSize(700, 1000);
setLocationRelativeTo(null);
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
}
public static void main(String[] args) {
EventQueue.invokeLater(new Runnable() {
@Override
public void run() {
SightreadHelper srh = new SightreadHelper();
srh.setVisible(true);
}
});
}

}

该按钮应该在现有注释的末尾添加注释,但它没有。 This image explains what happens after I click the button.

我是否使用正确的程序来做我想做的事?非常感谢你的帮助。我看到了这个问题,但对我没有帮助:Repaint Applets in JAVA without losing previous contents

最佳答案

一般来说,您的方法可能会奏效,但如果您倾向于将其推送到应用程序,那么它是结构简单的正确工作方式。您在这里缺少数据模型。您的软件直接绘制笔记,而无需表示内部状态的模型。

你应该看看Model View Controller抽象模式。并首先开发一个数据模型,这与渲染笔记无关。

然后您开始为单个元素开发可视化,例如笔记。您将根据数据模型告诉您的内容在面板中组合组件并呈现它们。这就是您应该在 doPaintComponent 方法中执行的操作。

当您点击添加注释按钮时,应该会发生以下步骤:

  1. 为您的模型添加注释

  2. 您的模型会创建一个 ui 事件,该事件会调用 repaint 方法,甚至可能调用重新绘制您的 ui 的布局方法,理想情况下只重新绘制需要重新绘制的部分。

如果您在渲染过程中没有看到任何东西,请确保首先检查以下内容:

  1. 您的渲染代码是否由 awt 线程调用?
  2. 您的组件可见吗?
  3. 您尝试绘制的位置是否正确?

您或许应该阅读一个或多个关于开发自定义 Swing 组件的教程,例如 Oracle Tutorial Custom Swing component .

我知道答案在短期内可能不会真正帮助您,但我相信在尝试让您的代码以某种方式运行之前,最好了解 UI 开发的概念。

关于java - 一个乐谱软件中JPanel添加Graphics的正确方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39331361/

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