首先,我要说,我几乎可以保证这个问题是一个副本,但我找不到任何其他适合我的需要/在我的程序中工作的答案。我需要画一个JPanel
,但我似乎无法画出显示所需的线条。
JFrame drawF = new JFrame("Simulator");
JPanel simPanel = new JPanel();
drawF.setVisible(true);
drawF.setSize(1000,650);
drawF.add(simPanel);
drawF.pack();
simPanel.setLayout(null);
simPanel.setSize(1000,650);
simPanel.setVisible(true);
simPanel.setBackground(Color.BLACK);
//add drawing surface
//start drawing
simPanel.add(new JComponent()
{
public void paint(Graphics g)
{
g.setColor(Color.RED);
int xLast,yLast;
for(int i=0;i < 5000000; i++) // five million
{
double dX = (Math.E*Math.exp(-numd1*i)*Math.sin(i*numf1+nump1))+(Math.E*Math.exp(-numd2*i)*Math.sin(i*numf2*nump2));
double dY = (Math.E*Math.exp(-numd3*i)*Math.sin(i*numf3+nump3))+(Math.E*Math.exp(-numd4*i)*Math.sin(i*numf4*nump4));
int drawX = (int)dX;
int drawY = (int)dY;
if (i==0)
{
xLast = 0;
yLast = 0;
g.drawLine(xLast,yLast,drawX,drawY);
simPanel.revalidate();
simPanel.repaint();
}
else
{
xLast = drawX;
yLast = drawY;
g.drawLine(xLast,yLast,drawX,drawY);
simPanel.revalidate();
simPanel.repaint();
}
}
}
});
repaint();
在我的JPanel
中添加JComponent
有什么问题吗?
你的问题可能是布局管理器的问题。JPanel默认使用FlowLayout,因此您的JComponent将按照其自然首选大小[0,0]进行调整,因此在这种情况下不会显示任何内容。尝试制作JPanel的布局BorderLayout,并添加JComponent BorderLayout。居中
其他问题:
例如:
import java.awt.Color;
import java.awt.Dimension;
import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.image.BufferedImage;
import javax.swing.*;
@SuppressWarnings("serial")
public class DrawingStuff extends JPanel {
private static final int PREF_W = 1000;
private static final int PREF_H = 650;
private static final Color BG = Color.BLACK;
private static final Color GRAPHICS_COLOR = Color.RED;
private static final int LOOP_COUNT = 5000000; // 5 million
private BufferedImage image = null;
private MathParams[] params;
public DrawingStuff(MathParams[] params) {
this.params = params;
setBackground(BG);
image = drawImage();
}
private BufferedImage drawImage() {
BufferedImage img = new BufferedImage(PREF_W, PREF_H, BufferedImage.TYPE_INT_ARGB);
Graphics2D g2 = img.createGraphics();
g2.setColor(GRAPHICS_COLOR);
int xLast, yLast;
for (int i = 0; i < LOOP_COUNT; i++) {
double dX = params[0].doCalc0(i) + params[1].doCalc1(i);
double dY = params[2].doCalc0(i) + params[3].doCalc1(i);
int drawX = (int) dX;
int drawY = (int) dY;
if (i == 0) {
xLast = 0;
yLast = 0;
g2.drawLine(xLast, yLast, drawX, drawY);
} else {
xLast = drawX;
yLast = drawY;
g2.drawLine(xLast, yLast, drawX, drawY);
}
}
g2.dispose();
return img;
}
@Override
protected void paintComponent(Graphics g) {
super.paintComponent(g);
if (image != null) {
g.drawImage(image, 0, 0, this);
}
}
@Override
public Dimension getPreferredSize() {
if (isPreferredSizeSet()) {
return super.getPreferredSize();
}
return new Dimension(PREF_W, PREF_H);
}
private static void createAndShowGui() {
JFrame frame = new JFrame("Drawing Stuff");
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
// TODO: fix this -- what numbers to use??? These don't work
MathParams[] paramArray = {
new MathParams(1, 2, 3),
new MathParams(1, 2, 3),
new MathParams(3, 4, 5),
new MathParams(3, 4, 5)
};
frame.getContentPane().add(new DrawingStuff(paramArray));
frame.setResizable(false);
frame.pack();
frame.setLocationRelativeTo(null);
frame.setVisible(true);
}
public static void main(String[] args) {
SwingUtilities.invokeLater(() -> createAndShowGui());
}
}
public class MathParams {
private int numd;
private int numf;
private int nump;
public MathParams(int numd, int numf, int nump) {
this.numd = numd;
this.numf = numf;
this.nump = nump;
}
public double doCalc0(int i) {
return (Math.E * Math.exp(-numd * i) * Math.sin(i * numf + nump));
}
public double doCalc1(int i) {
return (Math.E * Math.exp(-numd * i) * Math.sin(i * numf * nump));
}
}
我已经在JScrollPane中放置了一个JPanel对象,滚动工作就像预期的那样。通过重写paintComponent(),我尝试在JPanel对象中进行自定义绘制。然而,当JPanel对象放置在JScrollPane中时,JPanel不再正确地绘制(而是只显示其背景颜色)。 因为我的应用程序要求JPanel不断更新,所以构造了一个单独的线程,以在特定的时间间隔重新绘制JPanel。 以下代码摘
我目前正在尝试制作一个画布,我可以绘制的东西,并使它出现在一个JFrame。 为此,我打算在一个JPanel组件中有一个BufferedImage,paintComponent方法可以从中进行绘制。 理想情况下,我希望能够从给定的JFrame中引用这个缓冲图像,然后使用其Graphics2D向其绘制素材,paintComponent方法可以在使用缓冲图像绘制时显示这些素材。 我这样做是为了避免直接
问题内容: 我正在设计一个程序,该程序在JFrame中包含两个JPanel,一个用于保存图像,另一个用于保存GUI组件(Searchfields等)。我想知道如何将图像绘制到JFrame中的第一个JPanel? 这是我的构造函数的示例代码: } 我试图覆盖JPanel的paintComponent方法来绘制图像,但是当我尝试编写时,这在我的构造函数中导致了一个问题: 因为这将只允许我传递null的
我有一个程序,有多个层次,在底层我有一个JPanel,我把背景图像放在上面。除此之外,我还有一个JLayeredPane,其中包含一些可拖动的组件。我的问题是,当用户上传了背景图像时,可拖动的组件确实滞后了,我猜这是因为swing在拖动时一直在重新绘制背景图像。我的问题是,如果它无论如何,以确保图像没有重新绘制的所有时间?我在其中绘制图像的代码如下所示:
问题内容: 我有一个自定义的JPanel,有时在我的整个程序中,我需要调用一个将屏幕涂成黑色的方法,仅此而已。 启动程序时,我将调用此方法。 但是,我发现有时它起作用,有时却不起作用。这很奇怪。我还发现,当它不起作用时,图形对象不是null,并且宽度和高度也已正确定义(来自getWidth()和getHeight())。 为什么这有时行得通,有时却行不通? 在程序中的某个时候在JPanel上制作自
问题内容: 我如何告诉paint方法仅在JPanel上而不是在整个JFrame上绘制背景。我的JFrame大小大于JPanel。当我尝试为JPanel绘制网格背景时,网格似乎遍及整个JFrame,而不仅仅是JPanel。 以下是部分代码: 问题答案: camickr是正确的。所以: 您需要严格将工程图与不同组件分开。Swing已经在管理子组件,因此绝对不需要在Panel的Frame中实现图形(调用