Java 有没有一种方法可以在Intelli J Idea中创建的表单的JPanel上绘制几何图形
我刚开始使用Intelli J Idea,我的第一个项目之一是将一些几何图形绘制到表单中定义的GUI的JPanel上。最后我想画一些图表。我找到了一个教程,其中定义了一个扩展JPanel的类,并重载了paintComponent()方法Java 有没有一种方法可以在Intelli J Idea中创建的表单的JPanel上绘制几何图形,java,swing,intellij-idea,Java,Swing,Intellij Idea,我刚开始使用Intelli J Idea,我的第一个项目之一是将一些几何图形绘制到表单中定义的GUI的JPanel上。最后我想画一些图表。我找到了一个教程,其中定义了一个扩展JPanel的类,并重载了paintComponent()方法 public class MyPanel extends JPanel{ public void paintComponent(Graphics g) { super.paintComponent(g); Graphics
public class MyPanel extends JPanel{
public void paintComponent(Graphics g) {
super.paintComponent(g);
Graphics2D g2 = (Graphics2D) g;
int y2 = (int)(40 * Math.random());
Line2D line = new Line2D.Double(10, 10, 60, y2);
Rectangle2D rectangle = new Rectangle2D.Double(200, 120, 70, 30);
Ellipse2D oval = new Ellipse2D.Double(400, 200, 40, 60);
g2.draw(line);
g2.setPaint(Color.RED);
g2.fill(rectangle);
g2.setPaint(Color.ORANGE);
g2.fill(oval);
}
}
如果我将其与以下代码一起使用,则运行良好:
public class MainClass {
public static void main(String[] args) {
MyPanel s = new MyPanel();
JFrame f = new JFrame();
f.add(s);
f.setVisible(true);
f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
f.setSize(600, 400);
}
}
然后我尝试将它与我使用Intelli J Idea创建的表单相结合。这就是我的问题所在。我想要一张带按钮和JPanel的表格。当我按下按钮时,一些几何图形正在表格中定义的JPanel上绘制。我认为我最好的尝试是这样的:
public class MainWindow {
private JPanel panelMain;
private JButton buttonCalculate;
private JPanel panelPlot;
public MainWindow() {
buttonCalculate.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
panelPlot = new MyPanel();
panelPlot.setBackground(Color.CYAN);
panelPlot.setSize(200, 200);
panelPlot.setVisible(true);
}
});
}
public static void main(String[] args) {
JFrame f = new JFrame("MyFirstGraphTool");
f.setContentPane(new MainWindow().panelMain);
f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
f.setSize(600, 400);
f.setVisible(true);
}
}
但是简单地将派生的JPlane对象保存到绑定属性不会改变任何东西。
而且setBackgroundColor()方法不会改变任何东西
你知道如何做的任何教程或更详细的解释吗
编辑:请在下面找到组件树的图像。
谢谢和亲切的问候,
David您在代码中犯了很多错误。我试着向你解释,怎么了
public class MainWindow {
private JPanel panelMain; // panelMain is not initialized, so when you try to add it to any window/panel, you'll get a NullPointerException
private JButton buttonCalculate; // same as before. Also this button is not added to any container (window/panel)
private JPanel panelPlot; // panel is not added to any container
public MainWindow() {
buttonCalculate.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
panelPlot = new MyPanel();
panelPlot.setBackground(Color.CYAN);
panelPlot.setSize(200, 200); // this code will not be honored because the layout manager will recalculate panel bounds.
// use setPreferredSize instead.
panelPlot.setVisible(true);
}
});
}
public static void main(String[] args) {
JFrame f = new JFrame("MyFirstGraphTool");
f.setContentPane(new MainWindow().panelMain);
f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
f.setSize(600, 400);
f.setVisible(true);
}
}
这是你们班的正确版本
import java.awt.Color;
import java.awt.Dimension;
import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.geom.Ellipse2D;
import java.awt.geom.Line2D;
import java.awt.geom.Rectangle2D;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JPanel;
/**
* <code>MainWindow</code>.
*/
public class MainWindow {
private JPanel panelMain = new JPanel();
private JButton buttonCalculate = new JButton("Calculate");
private JPanel panelPlot; // panel is not added to any container
public MainWindow() {
buttonCalculate.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
panelPlot = new MyPanel();
panelPlot.setOpaque(true);
panelPlot.setBackground(Color.CYAN);
panelPlot.setPreferredSize(new Dimension(200, 200));
panelMain.add(panelPlot);
panelMain.revalidate(); // cause layout manager to recalculate component bounds
}
});
panelMain.add(buttonCalculate);
}
public static void main(String[] args) {
JFrame f = new JFrame("MyFirstGraphTool");
f.setContentPane(new MainWindow().panelMain);
f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
f.setSize(600, 400);
f.setVisible(true);
}
static class MyPanel extends JPanel {
@Override
public void paintComponent(Graphics g) {
super.paintComponent(g);
Graphics2D g2 = (Graphics2D) g;
int y2 = (int) (40 * Math.random());
Line2D line = new Line2D.Double(10, 10, 60, y2);
Rectangle2D rectangle = new Rectangle2D.Double(200, 120, 70, 30);
Ellipse2D oval = new Ellipse2D.Double(400, 200, 40, 60);
g2.draw(line);
g2.setPaint(Color.RED);
g2.fill(rectangle);
g2.setPaint(Color.ORANGE);
g2.fill(oval);
}
}
}
还请阅读关于您从未将
panelPlot
添加到任何容器中的内容。我添加了Intelli J组件树的图像。因此,如果我没有弄错,panelPlot应该位于panelMain中。还是我必须以某种方式将它们添加到代码中?编辑:由于我刚开始使用Intelli J,并且没有太多使用Java和GUI的经验,可能是我遗漏了一些琐碎的东西。谢谢你的回答。但是我仍然不知道如何使用我在Intelli J的GUI中设计的布局。因为属性panelMain、buttonCalculate和panelPlot来自绑定到此类的Intelli J表单。通过使用“panelMain=newjpanel()”重新初始化它们,我失去了设计,不得不在代码中再次添加所有组件。也许我根本不应该使用图形化GUI编辑器,而应该在代码中完成所有工作。@Ragnos问题是,UI设计人员非常严格,只理解自己创建的UI。你不能设计一个UI,改变它的内容(就像我在我的解决方案中所做的那样)。我和Swing一起工作了18年,更新的版本使用了任何设计师(好吧,当我刚开始的时候,他们很糟糕)。谢谢,我想我会自己用代码来制作UI。看起来不太复杂。在那里找到了解决我问题的方法: