所以我用一个JFrame对象打开一个窗口,添加一堆图形。首先我添加了一个图像,然后我尝试添加一些线,但这条线似乎是从上一个图像的Y中心开始的。我希望它从页面顶部开始。这是我的JFrame代码:
JFrame f = new JFrame();
JLabel trebeclef = new JLabel(new ImageIcon(getClass().getClassLoader().getResource("Some image")));
Draw d = new Draw();
f.add(trebeclef);
f.add(d);
f.setSize(1000,1000);
f.getContentPane().setBackground(Color.white);
f.setLayout(new FlowLayout(FlowLayout.LEFT,0,0));
f.pack();
f.setVisible(true);
f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
这是Draw类的代码
public void paint(Graphics g2) {
super.paintComponent(g2);
Graphics2D g = (Graphics2D) g2;
g.setStroke(new BasicStroke(2));
g.drawLine(0, 0, 100, 0);
}
结果是
谢谢你的帮助
在设置布局后添加。人们通常使用重载的add,并为布局的特定约束提供额外的参数。
默认情况下,框架的add
的内容窗格已完成,具有带中心、左侧等的BorderLayout
。
流中的水平“线”垂直居中。设置首选高度可确保填充线组件。
d.setPreferredSize(new Dimension(100, 1000));
当然,另一种布局可能会更好;取决于你想要什么——只是实验。
尝试像这样布局组件并不是最容易的事情,尤其是当您考虑JLabel
的复杂性和其他布局约束的可能性时。
如果你有这个图像,并且你正在通过自定义绘制绘制线条,我只会自定义绘制整个内容
从...开始。
我们可以生产像。。。
import java.awt.BasicStroke;
import java.awt.Color;
import java.awt.Dimension;
import java.awt.EventQueue;
import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.image.BufferedImage;
import java.io.IOException;
import java.util.logging.Level;
import java.util.logging.Logger;
import javax.imageio.ImageIO;
import javax.swing.JFrame;
import javax.swing.JPanel;
public final class Main {
public static void main(String[] args) {
new Main();
}
public Main() {
EventQueue.invokeLater(new Runnable() {
@Override
public void run() {
try {
JFrame frame = new JFrame();
frame.add(new ClefWithLinesPane());
frame.pack();
frame.setLocationRelativeTo(null);
frame.setVisible(true);
} catch (IOException ex) {
Logger.getLogger(Main.class.getName()).log(Level.SEVERE, null, ex);
}
}
});
}
public class ClefWithLinesPane extends JPanel {
private BufferedImage trebbleClef;
public ClefWithLinesPane() throws IOException {
trebbleClef = ImageIO.read(getClass().getResource("/images/ClefLines.png"));
setBackground(Color.WHITE);
}
@Override
public Dimension getPreferredSize() {
return new Dimension(800, 200);
}
@Override
protected void paintComponent(Graphics g) {
super.paintComponent(g);
Graphics2D g2d = (Graphics2D) g.create();
int x = 0;
int y = (getHeight() - trebbleClef.getHeight()) / 2;
g2d.drawImage(trebbleClef, x, y, this);
int[] lines = new int[] {
30, 60, 89, 120, 149
};
x = trebbleClef.getWidth();
g2d.setStroke(new BasicStroke(2));
for (int line = 0; line < lines.length; line++) {
y = lines[line];
g2d.drawLine(x, y, getWidth(), y);
}
g2d.dispose();
}
}
}
但是正如你所见,这些线条并不“完全”匹配,现在这只是源图像的问题,你可以花一些时间来清理它,或者,你可以省去谱号本身的线条,做那些你自己做的事情,例如。。。
从...开始。
我们可以生产一些像...
import java.awt.BasicStroke;
import java.awt.Color;
import java.awt.Dimension;
import java.awt.EventQueue;
import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.image.BufferedImage;
import java.io.IOException;
import java.util.logging.Level;
import java.util.logging.Logger;
import javax.imageio.ImageIO;
import javax.swing.JFrame;
import javax.swing.JPanel;
public final class Main {
public static void main(String[] args) {
new Main();
}
public Main() {
EventQueue.invokeLater(new Runnable() {
@Override
public void run() {
try {
JFrame frame = new JFrame();
frame.add(new ClefWithOutLinesPane());
frame.pack();
frame.setLocationRelativeTo(null);
frame.setVisible(true);
} catch (IOException ex) {
Logger.getLogger(Main.class.getName()).log(Level.SEVERE, null, ex);
}
}
});
}
public class ClefWithOutLinesPane extends JPanel {
private BufferedImage trebbleClef;
public ClefWithOutLinesPane() throws IOException {
trebbleClef = ImageIO.read(getClass().getResource("/images/Clef.png"));
setBackground(Color.WHITE);
}
@Override
public Dimension getPreferredSize() {
return new Dimension(800, 200);
}
@Override
protected void paintComponent(Graphics g) {
super.paintComponent(g);
Graphics2D g2d = (Graphics2D) g.create();
int minLineY = 30;
int maxLineY = 150;
int lineSpacing = (maxLineY - minLineY) / 4;
int x = 10;
g2d.setStroke(new BasicStroke(8));
g2d.drawLine(x, minLineY + 3, x, maxLineY - 3);
int y = (getHeight() - trebbleClef.getHeight()) / 2;
g2d.drawImage(trebbleClef, x + 10, y, this);
g2d.setStroke(new BasicStroke(2));
for (int line = 0; line < 5; line++) {
y = minLineY + (lineSpacing * line);
g2d.drawLine(x, y, getWidth(), y);
}
g2d.dispose();
}
}
}
我已经在网上看了,但我仍然无法理解如何将图形添加到JPanel 以下是我的panel类的代码: 我的主要方法是: 文本只会出现在屏幕的一小部分(这适用于我试图绘制的任何图形对象)。我做错了什么?
问题内容: 我正在尝试玩 文件如此[处(1)])和here(2)所述。 (1)一个不好的例子: 第一种方法可行,但我不想依赖某些东西。第二个结果是仅播放了一些前导帧,听起来更像是单击。从ByteArrayInputStream播放时,不会是IO问题。 请与您分享为什么会发生这种情况。TIA。 问题答案: 我不确定为什么您链接的第二种方法会启动另一个线程;我相信音频还是会以自己的方式播放。剪辑播放完
我的条形图中的条形图未与标签对齐-请参阅:https://imgur.com/gallery/QVtIvXq 我的X轴: 任何帮助都将不胜感激
我最近在VSCODE中调试时遇到了一个很大的问题。我已经试着通过搜索网站和重新安装我的一些扩展来修复它。 它不会在调试控制台中显示结果,而是将以下输出写入终端:
我一直在努力将一个简单的东西作为值标签添加到Pandas数据框条形图中。我已经查看了20多个线程(其中这三个最有帮助-如何在matplotlib中的条形图中的列上显示文本?、matplotlib高级条形图和Python熊猫/matplotlib在条形图列上注释标签,但什么都不起作用。 我的数据一点也不复杂。数据帧结构为: 年份是数据帧的索引。 我正在寻找的表示很简单。所有产品的堆叠条形图,只有“总
问题内容: 我正在使用iTextSharp将数据填充到在OpenOffice中创建的PDF模板中。它填充得很好,我正在获取适当的PDF。在该PDF中,有一些摘要会出现,那个地方我想使该文本与模板对齐。 我正在下面的代码,但它不起作用。 请帮忙。 谢谢。 问题答案: 假设您有一个纯AcroForm而不是我在注释中指出的混合表格,这就是更改字段四边形的方法: 错误地假设,四边形不是字段标志的一部分。它